MCP server · free
Connect your AI to Metaintro
Give Claude, ChatGPT, Cursor or any MCP client live job postings, employers and market data. Sign in, and it can work on your own job search too: your profile, résumés, tracked jobs and next steps.
Free on every connection. Searching needs no account.
1claude mcp add --transport http metaintro-public https://www.metaintro.com/api/mcp/public[ 01 / 07 ] · Connections
Three addresses, each with its own reach
The address decides what your agent can reach. Start with the public one, and sign in when you want your agent to work on your own search.
- No sign-in
Public
Server addresshttps://www.metaintro.com/api/mcp/publicLive job postings, similar jobs, employer profiles, a company's open roles, what is hiring near you and the job market for any search. Read-only.
- Sign-in
- None. Up to 30 tool calls a minute and 5,000 a day from each address.
- Tools
- 7
- Your account
Personal
Server addresshttps://www.metaintro.com/api/mcpYour own job search: profile, résumé uploads and edits, tracked jobs and their stages, next steps, application records, reminders, documents and chat with Metaintro's assistant. search_actions and run_action reach every other action you're allowed.
- Sign-in
- Sign in with OAuth, or use a personal API key from Settings > Agents.
- Tools
- 75
- Staff
Organization
Server addresshttps://www.metaintro.com/api/mcp/org/<slug>For case managers and staff, and only your organization's members: caseload, work queue, alerts, notes, check-ins, promises, member profiles and résumés, member job boards, employer outreach, job lists sent by email, placements and outcomes reports, tasks, live job search and Cabinet's job-search and drafting tools.
- Sign-in
- Staff sign-in. Your organization's exact address is in its Settings > Agents.
- Tools
- 130
[ 02 / 07 ] · Setup
Add it to your client
Most clients sign you in on their own: add the address, then approve the sign-in in your browser. Use the public address to search without an account.
1## Claude2In the Claude app or on claude.ai, open Settings, then Connectors, and choose Add custom connector. Name it Metaintro and paste an address.34## ChatGPT5In ChatGPT, open Settings, then Connectors, and create a custom connector with an address. Choose OAuth when it asks how to sign in.67> Depending on your plan, custom connectors may need developer mode or your workspace admin's approval.89Your job search, sign-in: `https://www.metaintro.com/api/mcp`10Search only, no sign-in: `https://www.metaintro.com/api/mcp/public`Installs the personal connection. Your client asks you to sign in.
Prefer an API key?
Create a personal key in Settings > Agents and send it as an Authorization: Bearer header. Anyone with the key can act as you, so keep it out of shared files and chats.
Create a key[ 03 / 07 ] · Tool reference
Every tool, as your agent sees it
Names and descriptions are exactly what the server sends to agents, so they stay in English. Clients that support MCP Apps show job results as interactive job cards.
Public tools7
search_jobsReadJob cardsSearch jobs
Search jobs: find live job openings from employer career sites and job boards that match what the person wants, by role or keywords, place, remote work, employment type and pay. filters.jobTypes takes FULL_TIME, PART_TIME, CONTRACT or other listed types; any of them match. filters.salaryListedOnly keeps only jobs that post pay. filters.minSalary is annual pay in the requested currency, and ranges that only overlap it are included. Each card carries fit (every applied filter as met, partial, unknown or not_met, and verdict match or near_match: present a near_match as a near match, never as a match; a match meets only the applied filters, so lead stays conditional while unconfirmed names pay, hours, commute or licence, and label is the heading to use), posting (age, freshness, last seen live) and the employer's title and summary as source text. Licence requirements and eligibility remain unassessed. coverage says what was searched and whether more pages exist; an empty or short result covers only this search, not every job. Up to 10 cards a page; page with offset. Each job opens at https://www.metaintro.com/job/<id>.
get_jobReadJob cardsRead a job posting
Read one posting in full by its id: description, requirements, pay, location and the employer's apply link. The title, summary and description are employer source text; licence requirements and eligibility remain unassessed. posting gives its age, when it was last seen live and closesAtLocal, the closing weekday and time.
get_market_insightsReadRead the job market for a search
Summarize the live market for a role and place: how many openings match, the median listed pay, the most common work arrangement and the top requested skills, with how the request was understood. Takes a query and the same filters as search_jobs.
get_companyReadRead a company
Read an employer's profile by its slug (companySlug on a job): what it does, size, observed pay bands, work arrangement, benefits, recent events and how it is hiring. hiring.definitions says what each hiring number measures: medianOpenPostingAgeDays is the age of open listings, not time to fill, and removedRoles30d counts postings taken down, not roles filled. Its page is https://www.metaintro.com/company/<slug>.
list_company_jobsReadJob cardsList a company's open jobs
List an employer's open jobs by its slug, newest first, as compact cards with posting age and the employer's title and summary as source text; read one in full with get_job. Pages are cut to fit the response size, so continue with nextCursor until it is null.
find_similar_jobsReadJob cardsFind similar jobs
More openings like one job, by its id: the same kind of role in the same place (or remote, when the job is remote), as up to 10 cards. Use it when a job is closed, a near miss, or the person wants more like it.
get_local_demandReadRead local job demand
Read which kinds of roles are hiring most in a place (city, region, country): open jobs by role category, with total open jobs, employers and sectors. When a place has too few role types it widens to the region, the country or worldwide; scope and locationLabel say which. Use it when someone does not yet know what to look for.
Personal tools75
chatWriteChat with Metaintro
Send a text message to Metaintro’s personal assistant. Omit threadId to start a conversation; pass the returned threadId to continue. Uses the same assistant and tools as the app for job discovery, résumé building and tailoring, interview preparation, and profile help. Returns the reply and artifacts. Requires write access because the assistant can update your data. Use the messaging actions for shared conversations; your approval preference applies. If interrupted, read_thread before retrying; never resend blindly.
whoamiReadWho am I
Who this agent acts as, what its key may do, and the organizations where the person works as staff (with each one's slug and id, which the case manager tools take). Call it first.
search_actionsReadSearch actions
Find any action this agent can run beyond the named tools: everything a job seeker or a case manager can do in Metaintro. Describe what you want in plain words; results are ranked best match first. Each result has the action's name, whether it reads, writes or needs a person's approval, and inputSchema for run_action. When tool names a directly callable tool, use toolInputSchema for its arguments, including any approval reason; otherwise both are null.
get_action_requestReadCheck a waiting action
Read one action your agent asked for that waits for you: whether it is still waiting, approved and done, declined or expired, and its result once it ran. Takes the request id a held call returned.
get_operationReadCheck what a change did
Find out whether a change your agent made ran, and what it saved, when you did not see its answer: after an outcome_unknown error, a timeout or a lost connection. Pass operation (error.details.operation, or _meta metaintro/operation on a result), the idempotencyKey or other replay key you sent, or requestId. With nothing, it lists your last 10 changes from the past day on this connection. status is running (check again shortly; do not repeat the change), succeeded (with result), failed (nothing changed) or unknown (next says how to check). Records last 7 days. Held actions are checked with get_action_request.
run_actionWriteRun an action
Run one action that search_actions found, with its input. It runs as you, with the same access you have in the app. Your approvalMode from whoami determines whether a write runs immediately or waits for approval. Reads run immediately.
get_my_profileReadRead my profile
Read your master profile: experience, skills, education, certifications, preferences, and its version number (pass it as expectedVersion when you change it). A certification is held only when its status is issued or verified. Missing status means issuance is unknown. in_training and test_passed are pending.
update_profile_sectionWriteReplace a profile section
Replace one section of your master profile, such as work experience, education, skills or certifications. Read the profile first and pass its version as expectedVersion; a stale version is refused so nothing newer is overwritten. Give each certification a status: in_training, test_passed or issued. issued needs the issue date the person gives; a passed test stays test_passed. The headline names only issued credentials.
update_profile_fieldsWriteChange profile fields
Change individual fields of your master profile with set, append, remove or upsert operations. Pass the profile's current version as expectedVersion. To change where you live, set basics.city, basics.state and basics.country together: the old place id and coordinates are dropped and looked up again in that state, and coordinates can derive a timezone when none was person-chosen. An existing person-chosen timezone remains until you explicitly change basics.timezone. When a change touches location or timezone, the result's location shows what was saved; placeResolution "pending" means the place id and coordinates are still being looked up, within a few minutes. Give each certification a status: in_training, test_passed or issued. issued needs the issue date the person gives; a passed test stays test_passed. The headline names only issued credentials.
list_profile_changesReadList profile changes
List changes to your master profile, newest first: version, when, who or what changed it, the sections and fields touched, and a compact view of what changed. Long values are shortened (compacted true, changeCharacters gives the full size); read one change in full with get_profile_change. A page stops early when it reaches its size limit, so page with nextCursor until it is null.
get_profile_changeReadRead one profile change
Read one change to your master profile in full, by its id from list_profile_changes: the complete change record, its sections and fields.
get_search_preferencesReadRead my search preferences
Read the saved search filters and last search your job matching runs on, your profile's place, and which place a search uses (locationPrecedence). Read it before searching: each searchAreaConflicts entry is a saved place that is neither your place nor a preferred location, with the one call that clears only that place; ask before sending it. Pay and dealbreakers are in your profile.
update_dealbreakersWriteSet dealbreakers
Set the things a job must not have. Pass the profile's current version as expectedVersion.
update_compensationWriteSet pay expectations
Set the pay you are looking for. Pass the profile's current version as expectedVersion.
get_master_resumeReadRead my master résumé
Read your primary résumé, the one Metaintro tailors from, with its content and design.
list_resumesReadList my résumés
List the résumés you built in Metaintro.
get_resumeReadRead a résumé
Read one résumé you built, by its id.
update_resumeWriteEdit a résumé
Change a résumé's content. Pass the updatedAt you read as expectedUpdatedAt so an edit made elsewhere is not overwritten. Set createVersion to keep the old text as a version. The headline and licences may claim a licence only once the person confirms it was issued; until then name the permit or training, never the licensed job title.
list_uploaded_resumesReadList uploaded résumé files
List the résumé files you uploaded.
get_resume_upload_urlWriteStart uploading a résumé file
Get a short-lived URL to upload a résumé file (PDF, Word, PNG or JPEG, up to 10 MB). PUT the file's bytes to url with the returned headers within expiresIn seconds, then call add_uploaded_resume with the returned fileUrl.
add_uploaded_resumeWriteAdd an uploaded résumé file
Add a file you uploaded with get_resume_upload_url to your résumé files: fileUrl as it returned it and a fileName to show.
create_resumeWriteBuild a résumé from my profile
Build a résumé from your existing master profile. Pass your own idempotencyKey: repeating the call with the same key returns the résumé it first made, so after a timeout or an unknown outcome repeat it with that key (or read get_operation) instead of building another. To create or tailor one conversationally, use chat.
export_resumeWriteExport a résumé as PDF
Export one of your résumés as a PDF and get a private download link for the person to open: url, fileName, sizeBytes and expiresAt. Quote expiresAt as the link's expiry; never estimate it. To get a fresh link, call this again with the same generatedResumeId, versionNumber and locale. Treat url as private. This does not submit an application. Before real use, each unverified or simulated item must be confirmed and replaced with the true fact or removed; never just drop its label.
archive_resumeWriteArchive a résumé
Take one of your built résumés out of use, keeping its versions. Archived résumés are never picked for chat, fit checks, applications or your advisor's résumé list. Use reason not_mine for a résumé holding work that is not the person's, retracted for claims they withdrew, outdated or duplicate otherwise, with a short note. Archiving the primary résumé leaves no primary until the person chooses one with set_master_resume; nothing else is promoted in its place.
set_master_resumeWriteChoose my master résumé
Choose which of your résumés is the primary résumé used for tailoring.
duplicate_resumeWriteCopy a résumé
Make an editable copy of one of your résumés.
list_resume_versionsReadList résumé versions
Read the saved versions of one of your résumés before restoring or editing it.
get_resume_downloadReadDownload an uploaded résumé
Get a download URL for one of your uploaded résumé files. Treat the returned URL as private.
search_jobsReadJob cardsSearch jobs
Search jobs: find live job openings from employer career sites and job boards that match what the person wants, by role or keywords, place, remote work, employment type and pay. filters.jobTypes takes FULL_TIME, PART_TIME, CONTRACT or other listed types; any of them match. filters.salaryListedOnly keeps only jobs that post pay. filters.minSalary is annual pay in the requested currency, and ranges that only overlap it are included. Each card carries fit (every applied filter as met, partial, unknown or not_met, and verdict match or near_match: present a near_match as a near match, never as a match; a match meets only the applied filters, so lead stays conditional while unconfirmed names pay, hours, commute or licence, and label is the heading to use), posting (age, freshness, last seen live) and the employer's title and summary as source text. Licence requirements and eligibility remain unassessed. coverage says what was searched and whether more pages exist; an empty or short result covers only this search, not every job. Up to 10 cards a page; page with offset. Each job opens at https://www.metaintro.com/job/<id>.
get_jobReadJob cardsRead a job posting
Read one posting in full by its id: description, requirements, pay, location and the employer's apply link. The title, summary and description are employer source text; licence requirements and eligibility remain unassessed. posting gives its age, when it was last seen live and closesAtLocal, the closing weekday and time.
get_market_insightsReadRead the job market for a search
Summarize the live market for a role and place: how many openings match, the median listed pay, the most common work arrangement and the top requested skills, with how the request was understood. Takes a query and the same filters as search_jobs.
get_companyReadRead a company
Read an employer's profile by its slug (companySlug on a job): what it does, size, observed pay bands, work arrangement, benefits, recent events and how it is hiring. hiring.definitions says what each hiring number measures: medianOpenPostingAgeDays is the age of open listings, not time to fill, and removedRoles30d counts postings taken down, not roles filled. Its page is https://www.metaintro.com/company/<slug>.
list_company_jobsReadJob cardsList a company's open jobs
List an employer's open jobs by its slug, newest first, as compact cards with posting age and the employer's title and summary as source text; read one in full with get_job. Pages are cut to fit the response size, so continue with nextCursor until it is null.
find_similar_jobsReadJob cardsFind similar jobs
More openings like one job, by its id: the same kind of role in the same place (or remote, when the job is remote), as up to 10 cards. Use it when a job is closed, a near miss, or the person wants more like it.
get_local_demandReadRead local job demand
Read which kinds of roles are hiring most in a place (city, region, country): open jobs by role category, with total open jobs, employers and sectors. When a place has too few role types it widens to the region, the country or worldwide; scope and locationLabel say which. Use it when someone does not yet know what to look for.
add_my_taskWriteAdd a personal task or reminder
Add a to-do or reminder that is not a job posting, such as finishing benefits enrollment or bringing documents on a first day. title says what to do; dueAt (an exact instant) and timezone say when; savedJobId links it to a tracked job when it is about one. get_next_steps lists it as it comes due, and the person's case manager can see it. This records a task; it does not send a message.
list_my_tasksReadList my personal tasks
List the person's open personal tasks and reminders, soonest due first; includeDone adds finished and canceled ones. Pass limit (1–100) and return nextCursor as cursor to read the next page until nextCursor is null. Each has an id for update_my_task, its dueAt with a dueAtLocal twin to quote, and the job it is about, if any.
update_my_taskWriteFinish or edit a personal task
Finish, cancel or reopen a personal to-do or reminder, or rewrite its title, notes, dueAt or timezone with action edit (pass null to clear notes or the due date). taskId comes from list_my_tasks or add_my_task.
list_matched_jobsReadList jobs matched to me
List the jobs Metaintro matched to you. Each row's provenance gives generatedAt, the search that produced it (its constraints, or null when no record of the search survives), the profile version then, and status: current, or historical when it was made before preferences.updatedAt (your search preferences last changed) or has passed expiresAt (30 days). Present a historical match as from an earlier search, not as a fit for what you want now. Set newOnly to see only current ones you have not opened. Page with cursor. posting says whether Metaintro still holds the posting: indexed opens with get_job using jmeJobId; not_in_index means it expired or closed and was removed, so no Metaintro lookup will open it: say so, offer its url to check with the employer, and dismiss it with savedJobs.dismissMatched (id) if the person wants it gone; unknown means the index could not be read just now. id is the matched job's own id, not a tracked job's id.
get_next_stepsReadWhat to do next
Read what needs doing in your job search, most urgent first: interviews in the next two days (INTERVIEW), reminders that are due (REMINDER), application deadlines within a week (DEADLINE), postings that closed while you were applying (CLOSED_POSTING), applications with no news for 14 days (NO_ACTIVITY) and applications started but not confirmed (UNCONFIRMED_APPLICATION). Each item names its tracked job; atLocal and momentum.todayLocal give the weekday and local time to quote. personalTasks lists the person's own tasks due within a week or overdue (from add_my_task). Also returns how many jobs sit in each stage, your weekly momentum and, in a program, this week's goals. Call it at the start of a session.
list_my_jobsReadList my jobs
List every job and lead you are tracking, grouped by stage. leadKind says whether a card is a POSTING, a ROLE with no posting or a COMPANY with no role yet; contacts holds its first five people with each one's outreachStatus and lastContactAt (get_my_job reads them all). Each job's fit checks it against the person's own pay floor, job types, shifts, commute and dealbreakers; while it is conditional, call it a fit only on those terms. Licence requirements, eligibility and hours are not checked.
get_my_jobReadRead one of my jobs
Read one tracked job or lead in full, with its notes, contacts, interviews, offer, reminders, latest 20 activities and applications: one entry per time the person applied, numbered, each with its own submittedAt, method, status, notes and the résumé and cover letter sent (list_application_materials with applicationId shows what was sent). Document activities leave out their text; read it with get_job_document. A job with no url is one tracked by employer and title alone; it has no posting link to open or check. Dated fields come with a *Local twin (such as scheduledAtLocal) giving the weekday and local time; quote those. A superseded note comes back with body null: it was retracted, so do not restate it. postedPay is what the posting disclosed (not_captured or not_disclosed means the employer's pay is unknown); salaryExpectation is pay a person entered, never the posted pay. fit checks it against the person's own pay floor, job types, shifts, commute and dealbreakers; while it is conditional, call it a fit only on those terms.
check_resume_fitWriteCheck my résumé against a job
Score how well your primary résumé fits a tracked job and keep the score on the job: fitScore (0 to 100) and fitDetails, whose resume field names the résumé and version scored (your primary built résumé, or your newest uploaded file when you have built none). savedJobId comes from list_my_jobs. The job must be a posting in Metaintro's index. A refusal names its reason in details.reason (no_resume, no_primary_resume, resume_file_unavailable, job_not_indexed or not_scorable) and saves nothing. Each successful check also adds a Fit checked activity. Confirm an uncertain outcome from the job's fitComputedAt, fitDetails.resume and activities before repeating the check.
save_jobWriteSave a job or lead
Save a job to track, or a lead: a posting by its url; a role with no posting, such as an offer made directly, by title and companyName; or a company with no role yet by companyName alone. leadKind in the result says which (POSTING, ROLE or COMPANY), and saving again never downgrades it. people saves up to five people at the company, such as [{name: "Dana Levi", role: "REFERRER"}]; this records information and contacts nobody. Never make up a url. Saving the same job again (same url, or same employer and title) updates supplied fields and records another save. Pass an idempotencyKey to make a retry safe: repeating the save with the same key returns the job the first save wrote and adds no second set of people, reminders or activities.
update_my_jobWriteUpdate job status, stage or details
Change a tracked job's status by moving it to another stage, or change its pay, location, note or interview. outcomeEvidence records how the outcome is known: VERIFIED, SELF_REPORTED (you said so) or SIMULATED (practice that never happened, never counted as a real outcome). Use DECLINED when the person turned down an offer, WITHDRAWN when they pulled out before one. When a job's status moves to the closed stage REJECTED, WITHDRAWN, NO_REPLY or DECLINED, pass reason: {statedBy: "not_provided"} unless someone stated one; use {statedBy: "employer", text: "their stated reason"} or {statedBy: "seeker", text: "their stated reason"} for stated reasons, never a guess, and keep guessed causes out of its note too.
archive_my_jobWriteArchive a tracked job
Take a tracked job off your board and keep its history; restore_my_job puts it back. id is the job's id from list_my_jobs; reason is optional.
list_archived_jobsReadList my archived jobs
List the jobs you took off your board, most recently archived first, with the stage each was in.
restore_my_jobWriteRestore an archived job
Bring an archived job back onto your board, in the stage it was in. id is the job's id from list_archived_jobs.
delete_my_jobWriteDelete a tracked job
Delete a tracked job or lead you never started applying to. A job with an application is refused; archive it instead. Depending on your approval setting it may wait for approval; pass reason so you can tell what you are approving.
add_job_noteWriteAdd a note to a job
Add a note to a tracked job or lead. Write facts with their source (the posting, the employer, the person) and leave out guesses. To correct or retract an earlier note, pass supersedes with that note's id from get_my_job: the old note stays in the history but is withheld from reads, and the new one is current.
record_applicationWriteRecord an application
Record that you applied to a tracked job: how, when, and with which résumé and cover letter. appliedAt is the date the person gives, not today unless they say so; with timezone, a date alone stays on that local day. Quote the result's appliedAtLocal, and if it is not the date the person asked for, say so. Each application is kept on its own with a copy of the materials as they were sent. To record applying again to the same job, pass newApplication: true; to change one application (its status, notes, date or materials), pass its applicationId from get_my_job's applications. Without either, the call changes the latest application, or records the first. status is that application's own outcome (SUBMITTED, INTERVIEWING, OFFERED, ACCEPTED, REJECTED, WITHDRAWN, NO_REPLY); the job's stage follows its most advanced open application. submittedGeneratedResumeId takes any active résumé you built (id from list_resumes), not only one tailored to this job; submittedUserResumeId takes an uploaded file (id from list_uploaded_resumes).
set_job_reminderWriteSet a job reminder
Set a reminder on a tracked job, such as a follow-up date. Pass the person's timezone; the result's dueAtLocal gives the weekday and local time to quote.
get_weekly_work_searchReadRead my weekly work search
Read one week of your work search activity, as unemployment programs ask for it. Only for people an organization enrolled in its work-search program (whoami's workSearchProgram.enrolled); anyone else is refused, so don't offer it to them.
export_weekly_work_searchWriteExport my weekly work search
Export one week of your work search as CSV (week is current or that week's start date, YYYY-MM-DD), to attach to an unemployment claim's weekly certification. Same program rule as get_weekly_work_search.
set_email_preferencesWriteChange my emails and notifications
Turn Metaintro's emails and push notifications on or off. careerDigestEnabled the career digest; caseThreadEmailEnabled email from your case manager's conversation; pushNotificationsEnabled phone notifications; marketingEnabled, partnerIntrosEnabled and onboardingEmailsEnabled the rest. Send only the switches to change; it returns them all.
invite_advisorWriteInvite an advisor to a conversation
Invite someone you trust, such as a mentor or coach, by email to one of your conversations with Metaintro's assistant. Once they accept, they see the whole conversation. threadId comes from list_threads. This sends them an email.
set_contact_channelsWriteChoose how Metaintro contacts me
Turn email, text message (SMS) or WhatsApp contact from Metaintro on or off. Send only the channels to change; it returns all three.
get_memoryReadRead what Metaintro remembers
Read the notes Metaintro's chat saved from conversations on this account. Each entry came from a message in one of this account's own chats; if one is not about the person, say so and offer to forget it with masterProfile.forgetChatMemoryEntry.
list_threadsReadList my conversations
List your conversations, newest first. Page with cursor.
read_threadReadRead a conversation
Read the messages in one of your conversations, including your case manager's. Page with cursor. Report what is there; never guess why someone has not replied.
record_job_contactWriteSave a job contact
Save or update a person on a tracked job or lead: name, role, title, email, phone, linkedinUrl, relationship, notes, outreachStatus (TO_REACH, MESSAGED, REPLIED, MET, REFERRAL_OFFERED, REFERRAL_ASKED, REFERRED or NO_REPLY) and lastContactAt (when you last heard from or reached them, as the person gives it). Pass contactId from get_my_job's contacts to update that person; the same email on a job updates that person instead of creating a second one. This records information; it does not contact the person.
set_contact_outreachWriteRecord where outreach to a person stands
Record where the person stands with one contact on a tracked job or lead: TO_REACH, MESSAGED, REPLIED, MET, REFERRAL_OFFERED, REFERRAL_ASKED, REFERRED or NO_REPLY. id is the job's id and contactId the person's, from get_my_job's contacts. MESSAGED, REPLIED and MET set the contact's lastContactAt to occurredAt (when it happened, as the person gives it), or now. A step forward to REPLIED, MET, REFERRAL_OFFERED, REFERRAL_ASKED or REFERRED completes the open "Reach out to <name>" and "Follow up with <name>" reminders (any step forward completes "Reach out to <name>"), and REFERRED also adds "Apply with <name>'s referral" due two weekdays later at 09:00 in the person's timezone; a step back from REFERRED cancels that person's open "Apply with <name>'s referral". undoOf, the activity id of the person's latest change or touch, takes it back within 15 minutes. Pass followUpAt, with the person's timezone, to add a reminder "Follow up with <name>" on the job. The change is recorded on the job's history. This records information; it does not contact the person.
log_contact_touchWriteLog that you reached a person
Log that the person reached one contact on a tracked job or lead, with an optional note (up to 2000 characters). id is the job's id and contactId the person's, from get_my_job's contacts. channel is MESSAGE (the default), CALL or MEETING (a coffee or meeting in person or by video). It sets the contact's lastContactAt to occurredAt (when it happened, as the person gives it), or now, and never sets it earlier. It never lowers the outreach status: a MESSAGE or CALL moves TO_REACH (or none) to MESSAGED, and a MEETING moves anything before MET to MET and completes the open "Follow up with <name>" reminders; a first contact completes "Reach out to <name>"; any other status stays. Pass followUpAt, with the person's timezone, to add a reminder on the job. Use set_contact_outreach for a reply or referral. This contacts nobody.
record_interviewWriteRecord an interview
Record an interview and its details on a tracked job. Pass scheduledAt as an exact instant and the person's timezone; quote the result's scheduledAtLocal for the weekday and local time instead of working it out. Use chat for interview preparation.
record_offerWriteRecord a job offer
Record offer terms on a tracked job. This does not accept or decline an offer with the employer. Record only terms the employer stated, noting when the person reports them. Payslip maths depends on confirmed paid hours, pay period and plan terms, and a coverage start date does not date deductions; never ask for bank details.
record_follow_upWriteRecord a follow-up
Record a follow-up you already made on a tracked job. This does not send a message.
update_job_reminderWriteUpdate a job reminder
Update or complete an existing reminder for a tracked job.
list_application_materialsReadList application materials
List what you can attach when you record an application to a tracked job: uploaded résumé files (resumes), every active résumé you built (generatedResumes, ones tailored to this job first) and this job's cover letters. Pass the ids to record_application. applications lists each application already recorded on the job; pass applicationId to get that one's submittedMaterials, the résumé and cover letter exactly as they were when it was recorded (null for applications recorded before copies were kept).
get_job_documentReadRead an application document
Read a saved application document such as a cover letter or interview notes.
save_job_documentWriteSave an application document
Save document content on one of your tracked jobs, using the version fields in the schema to avoid overwriting newer work. It returns a receipt: the job's fields, its documents with each id, version and status, and the activity it recorded, without the posting snapshot or history; read get_job_document for the saved text.
export_job_documentWriteExport an application document
Export a prepared document as a PDF for your own use and get a private download link: url and expiresAt. Quote expiresAt as the link's expiry; never estimate it. Calling it again with the same expectedVersion returns a fresh link to the same file without remaking it. Treat url as private. This does not send it to an employer.
check_job_availabilityWriteCheck whether a job is open
Check the availability of a job you are tracking before applying.
get_case_managerReadRead my case manager's status
See who your case manager is for a conversation and whether a request to them is open. caseManager.source says where the assignment comes from: case_conversation (the organization whose shared conversation this is), metaintro, or organization_member (your organization assigned them to you). caseThreadId is the conversation you share with them, which staff read first. When caseManager is set, message_case_manager reaches them; when it is null, a request still reaches the team. No reply is not evidence of absence, leave or intent: report their last visible reply and what is still pending, and offer a follow-up.
message_case_managerWriteMessage my case manager
Send your case manager a message inside Metaintro, in one of your conversations (caseThreadId from get_case_manager is the one you share). It appears in that conversation and in their list of members waiting on a reply, and your case manager gets a Metaintro notification; it emails and texts nobody. While a request is open, or after staff replied and wait on you, it is a follow-up (30 an hour); a new request is limited to 3 an hour. If refused with rate_limited, nothing was sent: keep the text and send it again with the same clientMessageId after retryAfterSeconds. replyByEmail false keeps their reply in the app by turning off email for this conversation; true allows an email again. The result's replyNotifications.email indicates permission for email, not a delivery promise. Staff APP replies appear in Metaintro and do not guarantee an email; tell the person their reply will be available in the conversation. Your approval setting decides whether it waits for you; pass reason so you can tell what you are approving. Pass a stable clientMessageId so a retry sends it once. content holds at most 1,000 characters and is never shortened for you; for longer material, save it first (a job document or a résumé) and name it in the message.
request_case_managerWriteAsk for my case manager
Ask your case manager to step into a conversation, with a priority. message is posted in the conversation as your words to them, exactly as message_case_manager does, and is what they read in their queue; without message the request points at your latest message there. Limits, replyByEmail and replyNotifications work as in message_case_manager; pass a stable clientMessageId so a retry sends it once. acknowledgment is text to show the person: replies appear in the conversation, and email eligibility is not guaranteed delivery.
More actions through search_actions and run_action208
Organization tools130
whoamiReadWho am I
Who this agent acts as, what its key may do, and the organizations where the person works as staff (with each one's slug and id, which the case manager tools take). Call it first.
search_actionsReadSearch actions
Find any action this agent can run beyond the named tools: everything a job seeker or a case manager can do in Metaintro. Describe what you want in plain words; results are ranked best match first. Each result has the action's name, whether it reads, writes or needs a person's approval, and inputSchema for run_action. When tool names a directly callable tool, use toolInputSchema for its arguments, including any approval reason; otherwise both are null.
get_action_requestReadCheck a waiting action
Read one action your agent asked for that waits for you: whether it is still waiting, approved and done, declined or expired, and its result once it ran. Takes the request id a held call returned.
get_operationReadCheck what a change did
Find out whether a change your agent made ran, and what it saved, when you did not see its answer: after an outcome_unknown error, a timeout or a lost connection. Pass operation (error.details.operation, or _meta metaintro/operation on a result), the idempotencyKey or other replay key you sent, or requestId. With nothing, it lists your last 10 changes from the past day on this connection. status is running (check again shortly; do not repeat the change), succeeded (with result), failed (nothing changed) or unknown (next says how to check). Records last 7 days. Held actions are checked with get_action_request.
run_actionWriteRun an action
Run one action that search_actions found, with its input. It runs as you, with the same access you have in the app. Your approvalMode from whoami determines whether a write runs immediately or waits for approval. Reads run immediately.
search_jobsReadJob cardsSearch jobs
Search jobs: find live job openings from employer career sites and job boards that match what the person wants, by role or keywords, place, remote work, employment type and pay. filters.jobTypes takes FULL_TIME, PART_TIME, CONTRACT or other listed types; any of them match. filters.salaryListedOnly keeps only jobs that post pay. filters.minSalary is annual pay in the requested currency, and ranges that only overlap it are included. Each card carries fit (every applied filter as met, partial, unknown or not_met, and verdict match or near_match: present a near_match as a near match, never as a match; a match meets only the applied filters, so lead stays conditional while unconfirmed names pay, hours, commute or licence, and label is the heading to use), posting (age, freshness, last seen live) and the employer's title and summary as source text. Licence requirements and eligibility remain unassessed. coverage says what was searched and whether more pages exist; an empty or short result covers only this search, not every job. Up to 10 cards a page; page with offset. Each job opens at https://www.metaintro.com/job/<id>.
get_jobReadJob cardsRead a job posting
Read one posting in full by its id: description, requirements, pay, location and the employer's apply link. The title, summary and description are employer source text; licence requirements and eligibility remain unassessed. posting gives its age, when it was last seen live and closesAtLocal, the closing weekday and time.
get_market_insightsReadRead the job market for a search
Summarize the live market for a role and place: how many openings match, the median listed pay, the most common work arrangement and the top requested skills, with how the request was understood. Takes a query and the same filters as search_jobs.
get_companyReadRead a company
Read an employer's profile by its slug (companySlug on a job): what it does, size, observed pay bands, work arrangement, benefits, recent events and how it is hiring. hiring.definitions says what each hiring number measures: medianOpenPostingAgeDays is the age of open listings, not time to fill, and removedRoles30d counts postings taken down, not roles filled. Its page is https://www.metaintro.com/company/<slug>.
list_company_jobsReadJob cardsList a company's open jobs
List an employer's open jobs by its slug, newest first, as compact cards with posting age and the employer's title and summary as source text; read one in full with get_job. Pages are cut to fit the response size, so continue with nextCursor until it is null.
find_similar_jobsReadJob cardsFind similar jobs
More openings like one job, by its id: the same kind of role in the same place (or remote, when the job is remote), as up to 10 cards. Use it when a job is closed, a near miss, or the person wants more like it.
get_local_demandReadRead local job demand
Read which kinds of roles are hiring most in a place (city, region, country): open jobs by role category, with total open jobs, employers and sectors. When a place has too few role types it widens to the region, the country or worldwide; scope and locationLabel say which. Use it when someone does not yet know what to look for.
list_member_tasksReadList a member's personal tasks
List a member's own tasks and reminders that are not job postings, such as a benefits enrollment deadline, soonest due first; includeDone adds finished and canceled ones. createdByStaff marks ones staff added. Pass limit (1–100) and return nextCursor as cursor to read the next page until nextCursor is null.
add_member_taskWriteAdd a task for a member
Add a task or reminder to a member's own list when it is not a job posting, such as an enrollment deadline after an offer. The member sees it in their tasks and next steps. dueAt is an exact instant; pass the member's timezone. This does not message the member.
list_membersReadList members
List an organization's members you may see, with stage, status, case manager, last contact and next action. Filter and sort; page with cursor. Each row's memberId is the id every member tool takes as memberId or userId; membershipId is the membership record and caseManagerId the case manager's membership, which assign_case_manager takes as caseManagerMemberId.
get_caseload_digestReadRead a caseload digest
Read concise summaries of up to 25 members in one call: stage, status, next action, case manager, last contact and last seen, profile essentials (target roles, location, pay, schedule, dealbreakers, current focus, profile version), tracked jobs by stage with the newest eight, open promises, whether a reply is owed and the case thread id, and the latest activity. Pass memberIds (user ids), or leave them out for your caseload (caseload: all for everyone you may see). include picks sections and profileFields picks profile fields. Constraints come back complete; a current focus longer than 400 characters comes back as an excerpt with its full length, and get_member_profile_sections reads it in full. A page stops at about 30,000 characters: pass nextCursor back as cursor, with the same other inputs, until it is null. asOf stays fixed across the pages. changedSince is accepted for compatibility, but every accessible member is returned for full reconciliation and unchanged stays empty: update timestamps are not commit-safe checkpoints. Replace cached rows by memberId and finish every page. Use it before reviewing or handing off several people, or with one memberId for one person's case context; detailTools names the small reads for anything more. Members you cannot fully see come back as restricted and ids that are not members come back in notFound; neither is missing data. It counts once against the read quota.
find_memberReadFind a member
Find members of an organization by name or email. Pass a row's memberId to member tools; membershipId is the membership record.
get_memberReadRead a member
Read one member's record in an organization; memberId (also id) is the member's user id that member tools take. Its resumes are uploaded files only; list_member_resumes also lists the résumés the member built in Metaintro. Its notes are filled in only for organization owners and admins: read the notes staff wrote on the member with list_member_notes.
get_member_profileReadRead a member's profile
Read a member's master profile. A certification is held only when its status is issued or verified. Missing status means issuance is unknown. in_training and test_passed are pending.
get_member_profile_sectionsReadRead parts of a member's profile
Read only the named sections of a member's master profile, in full, with its version, such as narrative for the whole current focus or dealbreakers and compensation for their limits. Smaller than get_member_profile when you need one or two sections.
get_member_briefReadRead a member's brief
Read the latest brief on a member: where their search stands and what to do next. Use it as a handoff summary.
generate_member_briefWriteWrite a fresh member brief
Write a fresh brief on a member from their current record, for a handoff or a meeting.
get_what_mattersReadRead what matters to a member
Read the lines on what matters most in a member's search. Until staff save their own list, they come from the latest brief.
set_what_mattersWriteSet what matters to a member
Replace the lines on what matters most in a member's search. Send every line to keep, with source STAFF for any line you wrote or changed.
list_member_activityReadList a member's activity
List a member's timeline: notes, check-ins, outreach, applications and stage changes. Page with cursor.
add_member_noteWriteAdd a note on a member
Add a note to a member's record. Every note is stored the same way; type is recorded only in the audit log. Returns the note's id; list_member_notes reads the member's notes back.
list_member_questionsReadRead questions already asked
Read what staff have already asked this participant, including open and resolved questions, so nobody asks twice. Includes whether an unanswered question is a blocker.
record_member_questionWriteRecord a question asked
Log a question staff asked this participant and whether it blocks progress (isBlocker). This records the question; it does not send a message. Read list_member_questions before retrying to avoid recording it twice.
resolve_member_questionWriteResolve a question
Mark an asked question as resolved after the participant answered it. questionId comes from list_member_questions. This does not record the answer text; keep supporting evidence in the appropriate case note.
promote_member_questionWriteTurn a question into a commitment
Turn an open question into a promise and next action owned by you, with an optional title and dueDate. questionId comes from list_member_questions. Read the returned promise and the member record before retrying.
list_member_claim_restrictionsReadRead what not to say about a member
Read statements that must not be claimed about a participant: expired certifications, inaccurate qualifications, outdated facts or private information. Check these restrictions before writing a resume, introduction or employer message.
add_member_claim_restrictionWriteRecord what not to say about a member
Record a warning not to mention or claim something about this participant, such as an expired certification or an untrue qualification. text is the restriction, up to 280 characters. This does not change their profile or send a message. Read existing restrictions before retrying to avoid duplicates.
remove_member_claim_restrictionWriteRemove a claim restriction
Remove a restriction only after confirming it no longer applies. id comes from list_member_claim_restrictions. This deletes the warning from the member record; it does not verify the underlying qualification.
list_member_notesReadRead the notes on a member
List the notes your organization's staff wrote on a member's record, newest first: each note's id, who wrote it and when, its text and any changes applied from it. Pass nextCursor back as cursor for older notes. Use the id with get_member_note, edit_member_note or delete_member_note.
get_member_noteReadRead one note on a member by id
Read one note on a member's record by its id from list_member_notes or add_member_note: who wrote it and when, its text and any changes applied from it.
edit_member_noteWriteEdit a note on a member
Replace the text of a note you wrote on a member's record. noteId comes from list_member_notes; only the note's author can change it.
delete_member_noteWriteDelete a note on a member
Delete a note you wrote on a member's record. noteId comes from list_member_notes; only the note's author can delete it. Depending on the person's approval setting it may wait for approval; pass reason so they can tell what they are approving.
update_member_profileWriteReplace a section of a member's profile
Replace one section of a member's master profile with value, shaped like that section in get_member_profile. Pass the currentVersion get_member_profile returned as expectedVersion; a stale version is refused so nothing newer is overwritten. The change is recorded as yours.
list_member_resumesReadList a member's résumés
List every résumé a member has, newest first: ones built in Metaintro (source generated: kind, whether it is their primary résumé, latestVersion, updatedAt) and uploaded files (source uploaded). latestGenerated is the most recently changed built résumé. A résumé the member or their own assistant saves appears here at once, so check this list and read the newest built draft with get_member_resume before saying a résumé is missing or writing one from older messages. Archived built résumés are left out unless includeArchived is true.
get_member_resumeReadRead a member's résumé
Read one of a member's résumés by its id from list_member_resumes. A built résumé returns its exact title, kind, primary status, current content and recent versions; an uploaded file returns its details and a private download URL valid for five minutes. When an uploaded file is a PDF of a built résumé, generatedFromResumeId names the built résumé to read for its text.
get_member_resume_upload_urlWriteStart uploading a member's résumé
Get a short-lived URL to upload a résumé file (PDF, Word, PNG or JPEG, up to 10 MB) for a member. PUT the file's bytes to url with Content-Type set to the contentType you declared, within expiresIn seconds, then call upload_member_resume with the returned key.
upload_member_resumeWriteAdd an uploaded résumé to a member
Add the file you uploaded with get_member_resume_upload_url to a member's résumés (s3Key is its key) and read it into their profile. Optionally label the version and note the job and employer it was tailored for.
log_employer_outreachWriteLog employer outreach for a member
Record that you reached out to an employer for a member: an introduction, a follow-up on an application or a cold campaign, the channel, the employer and the person you reached, its status and the day it happened (date as YYYY-MM-DD, not in the future, with your timeZone). Pass savedJobId when it is about a job on the member's board. This records it; it sends nothing.
set_employer_outreach_statusWriteUpdate employer outreach status
Record how an employer answered an introduction or other outreach you logged, as its status: REPLIED, MEETING_BOOKED, DECLINED or NO_RESPONSE, and the day it happened. outreachId is the id of the outreach entry in list_member_activity.
log_check_inWriteLog a check-in
Log a check-in you had with a member: the day, how (method APP for a conversation inside Metaintro, or email, phone, text and the rest), which direction, a note and the next follow-up date.
list_check_insReadList check-ins
List an organization's check-ins, by status and owner.
log_outreachWriteLog outreach
Record contact with an employer or anyone else on a member's behalf: the channel, the direction, what was said and when.
update_pipeline_stageWriteMove a member's stage
Move a member to another pipeline stage: intake, searching, résumé building, applying, interviewing, offer or placed.
update_member_statusWriteChange a member's status
Change a member's status in the organization. Depending on the person's approval setting it may wait for approval; pass reason so they can tell what they are approving.
assign_case_managerWriteAssign a case manager
Assign a member to a case manager. Depending on the person's approval setting it may wait for approval; pass reason so they can tell what they are approving.
list_case_managersReadList case managers
List an organization's active case managers by name, up to 100 a page, with each one's caseload. Narrow it with search (part of a name or email) or staffIds; pass nextCursor back as cursor for the next page.
list_job_listsReadList job lists sent
List the job lists sent to a member, newest first, with how many roles reached each status. Pass nextCursor back as cursor for older lists; read one list's roles with get_job_list.
get_job_listReadRead a job list
Read one job list in full: each role, its status and feedback, and the attachments sent with it.
update_role_statusWriteUpdate a role's status
Record where a member stands on a role from a job list you sent them.
get_member_job_boardReadRead a member's jobs
Read every job and lead a member is tracking, by stage, with how they applied and the title of the résumé they recorded sending (submittedResume; read it with get_member_resume). comingUp lists what is due, with each reminder's reminderId. Each job's leadKind is POSTING, ROLE (no posting) or COMPANY (no role yet), and contacts lists its first five people with each one's outreachStatus, never contact details. Read one job's contacts, reminders, interviews, offer and documents with get_member_job. outcomeEvidence says whether a job's outcome is VERIFIED, SELF_REPORTED or SIMULATED (practice, never a real outcome); isTest marks a disposable test record. byStatus leaves out simulated and test jobs, and archivedTotal leaves out test jobs. Each job's fit checks it against the person's own pay floor, job types, shifts, commute and dealbreakers; while it is conditional, call it a fit only on those terms. Licence requirements, eligibility and hours are not checked.
get_member_jobReadRead one of a member's jobs
Read one job or lead on a member's board in full, as the member sees it in get_my_job: its notes your organization can see, contacts (id, name, role, title, outreachStatus and dates, never contact details), interviews, offer, open reminders (id, kind, label, dueAt, snoozedUntil, timezone, source, createdAt), recently completed reminders (doneReminders), documents such as cover letters (read one with get_member_job_document), the résumé recorded with the latest application, and applications: each time the member applied to this job, with its id, number, date, method, status, notes and the materials sent. Read it to find a reminderId or contactId before changing one, and to read back what you recorded. id is the job's id from get_member_job_board.
list_member_application_materialsReadList a member's application materials
List what a member can attach to an application on one of their jobs, as list_application_materials shows them: uploaded résumé files (resumes), every active résumé they built (generatedResumes, ones tailored to this job first) and this job's cover letters. submitted names the résumé and cover letter recorded with the latest application, with its date and method; applications lists every application to the job, and applicationId (from get_member_job's applications) adds application, that one's résumé and cover letter as they were sent. Read a cover letter with get_member_job_document and a résumé with get_member_resume. id is the job's id from get_member_job_board.
get_member_job_documentReadRead a member's application document
Read one document saved on a member's job, such as a cover letter or application answers, with its full content, status and version, as get_job_document shows it to the member. documentId comes from get_member_job's documents or list_member_application_materials. id is the job's id from get_member_job_board.
save_member_jobWriteAdd a job to a member's board
Add a job or a lead to a member's My jobs board by its posting url, with its title, company, location and pay when you know them. Pass jmeJobId when it is a Metaintro job from search_jobs. For a role with no posting, such as an offer made directly, leave url out and pass title and companyName; for a company with no role yet, pass companyName only; for a person whose company is not known, pass people only, and the lead is titled "<first person's name> (contact)"; never make up a url. Add up to five people at the company in people (name, role, and optionally title, email, phone, linkedinUrl, relationship, outreachStatus, followUpAt); a person saved as MESSAGED, REPLIED or MET is marked contacted now, and followUpAt adds a reminder in the member's timezone: "Reach out to <name>" for someone not yet contacted, else "Follow up with <name>". This records information and contacts nobody. A url, or for a job with no url the same employer and title, is not added twice: saving it again updates the fields you supply and records another save. Pass an idempotencyKey to make a retry safe: repeating the save with the same key returns the job the first save wrote and adds no second set of people, reminders or activities. Returns the job's id. Pass isTest true for a disposable test or demo job, allowed only in a test organization or for a demo account: it is left out of counts and reports and is the only kind delete_member_test_job removes. A job already on the board never becomes a test record. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
update_member_jobWriteEdit a member's job
Correct the title, company, pay or location of a job on a member's board, or set its company logo with companyLogoUrl, an https image url. It keeps its place on the board. Returns changes, each field's previous and new value; the edit is recorded in list_member_activity and the job's history, signed with your name. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
record_member_follow_upWriteRecord a member's follow-up with an employer
Record that the member followed up with the employer on a job. This does not send a message. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
check_member_resume_fitWriteCheck a member's résumé against a job
Score how well the member's primary résumé fits a job on their board, save the score on the job and return fitScore (0 to 100), fitComputedAt and fitDetails, whose resume field names the résumé and version scored. savedJobId is the job's id from get_member_job_board. The job must be a posting in Metaintro's index. A refusal names its reason in details.reason (no_resume, no_primary_resume, resume_file_unavailable, job_not_indexed or not_scorable) and saves nothing. Each successful check also adds a Fit checked activity. Confirm an uncertain outcome from the job's fitComputedAt, fitDetails.resume and activities before repeating the check.
move_member_jobWriteMove a member's job
Update the status of a job on a member's My jobs board by moving it to another stage: SAVED, APPLYING, APPLIED, INTERVIEWING or OFFERED, or close it as ACCEPTED, DECLINED, REJECTED, WITHDRAWN or NO_REPLY. outcomeEvidence says how a closing status is known: VERIFIED, SELF_REPORTED or SIMULATED (practice, left out of counts). Activity records you as the one who moved it. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
add_member_job_noteWriteAdd a note to a member's job
Add a note to a job on a member's board. The member and your team see it, signed with your name. savedJobId is the job's id from get_member_job_board. To correct one of your team's notes, pass supersedes with its id: the old note is kept in history but leaves current reads. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
record_member_applicationWriteRecord a member's application
Record that a member applied to a job on their board: how, when (appliedAt, with the member's timezone) and with which résumé: submittedGeneratedResumeId for any active résumé they built, submittedUserResumeId for an uploaded file, both from list_member_resumes. Each application is kept on its own with a copy of the materials as sent; returns its applicationId. Pass newApplication: true when the member applied to the same job again, or applicationId to change one application's status, notes, date or materials; without either it changes the latest application, or records the first. Moves a saved job to APPLIED; the job's stage follows its most advanced open application. outcomeEvidence: VERIFIED (confirmed by staff, employer or document), SELF_REPORTED (the job seeker says so) or SIMULATED (practice); omit to keep it. Counts skip SIMULATED and test records. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
set_member_job_reminderWriteSet a reminder on a member's job
Add a new reminder on a job on a member's board, such as a follow-up date. The member sees it. Returns reminderId, and outcome created, or unchanged when the same reminder is already open. Each call with a different label or date adds another reminder: to move, finish or cancel an existing one, use update_member_job_reminder with its reminderId instead. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
update_member_job_reminderWriteUpdate a reminder on a member's job
Complete, cancel or snooze (move later) an open reminder on a member's job. Snooze needs snoozedUntil. reminderId comes from set_member_job_reminder's result, get_member_job's reminders or get_member_job_board's comingUp. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
record_member_job_contactWriteRecord a contact on a member's job
Add or update a person on a member's job or lead: a recruiter, hiring manager or referrer, with outreachStatus (TO_REACH, MESSAGED, REPLIED, MET, REFERRAL_OFFERED, REFERRAL_ASKED, REFERRED or NO_REPLY) and lastContactAt when you know them. Returns contactId. Pass contactId, from this result or get_member_job's contacts, to update that contact; a contact with the same email is updated rather than added twice. This records information; it does not contact the person. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
set_member_job_contact_outreachWriteRecord where a member's outreach to a person stands
Record where the member stands with one person on their job or lead: TO_REACH, MESSAGED, REPLIED, MET, REFERRAL_OFFERED, REFERRAL_ASKED, REFERRED or NO_REPLY. contactId comes from get_member_job's contacts or get_member_job_board. MESSAGED, REPLIED and MET set the contact's lastContactAt to occurredAt (when it happened), or now. Pass followUpAt, with the member's timezone, to add a reminder "Follow up with <name>" the member sees; the result's reminderId names it. A step forward to REPLIED, MET, REFERRAL_OFFERED, REFERRAL_ASKED or REFERRED completes that person's open "Reach out to <name>" and "Follow up with <name>" reminders (any step forward completes "Reach out to <name>"), and REFERRED also adds "Apply with <name>'s referral" due two weekdays later at 09:00 in the member's timezone; a step back from REFERRED cancels that person's open "Apply with <name>'s referral". The change is recorded on the job's history, signed with your name. This records information; it does not contact the person. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
log_member_job_contact_touchWriteLog that a member reached a person
Log that the member reached one person on their job or lead, with an optional note (up to 2000 characters). contactId comes from get_member_job's contacts or get_member_job_board. channel is MESSAGE (the default), CALL or MEETING (a coffee or meeting in person or by video). It sets the contact's lastContactAt to occurredAt (when it happened), or now, and never sets it earlier. Outreach never goes back: a MESSAGE or CALL moves TO_REACH (or none) to MESSAGED, a MEETING moves anything before MET to MET and completes that person's open "Follow up with <name>" reminders; a first contact completes "Reach out to <name>", and anything further along stays. Pass followUpAt, with the member's timezone, to add a reminder the member sees; the result's reminderId names it. Use set_member_job_contact_outreach for a reply or referral. The touch is logged on the job's history, signed with your name. This contacts nobody. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
record_member_interviewWriteRecord an interview on a member's job
Add or update an interview round on a member's job: when, format and outcome. outcomeEvidence: VERIFIED (confirmed by staff, employer or document), SELF_REPORTED (the job seeker says so) or SIMULATED (practice); omit to keep it. Counts skip SIMULATED and test records. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
record_member_offerWriteRecord an offer on a member's job
Record or update an offer on a member's job: pay, start date, decision deadline and outcome. outcomeEvidence: VERIFIED (confirmed by staff, employer or document), SELF_REPORTED (the job seeker says so) or SIMULATED (practice); omit to keep it. Counts skip SIMULATED and test records. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
archive_member_jobWriteArchive a member's job
Take a job off a member's board. restore_member_job puts it back. Archiving keeps the job and its history (interviews, offer, notes and reminders) and takes it off the active board; it stays in the member's archive. Only a job marked as a test record can be deleted, with delete_member_test_job. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
restore_member_jobWriteRestore a member's job
Put an archived job back on a member's board. id is the job's id from get_member_job_board. Pass provenance when the change comes from something the member said or sent: a note on why, the channel, when they told you (reportedAt) and when it actually happened (occurredAt, which dates the event). The member can see this record.
delete_member_test_jobWriteDelete a member's test job
Delete a job marked as a test record (isTest true on get_member_job_board) from a member's board, with its interviews, offer, notes and reminders. Any other job is refused: archive it instead. It waits for approval because it cannot be undone. id is the job's id from get_member_job_board.
log_off_list_applicationWriteLog an application
Record an application a member made to a job that was not on a list you sent.
get_work_queueReadRead my work queue
Read the organization's work queue: what is waiting on staff, block by block. Each block holds its first rowsPerBlock rows (25 unless you ask for up to 50), its total (null when only a lower bound is known) and whether more are waiting.
list_reply_queueReadList members waiting on a reply
List members waiting on a staff reply, open help requests first. Page with the returned nextCursor as cursor until it is null. Replied-but-unresolved requests rank ahead of idle conversations. Every request a member sent with message_case_manager or request_case_manager is here as pendingRequest: its id, the member's words (messages, oldest first, or note), when they asked, priority, who it is routed to (routedToYou) and replyNotifications (inApp is always true; email says whether the member allows an email). Answer one with send_member_message, passing its helpRequestId and channel APP. A staff reply does not close a request: it moves to awaitingResolution (id, when they asked, when and by whom it was answered) and stays there until someone runs resolve_help_request, so follow-up work is not lost.
send_member_messageWriteSend a member a message
Send a member a message from you. channel APP posts it in Metaintro only: nothing is emailed or texted. EMAIL posts it in their case conversation and emails it; SMS and WHATSAPP text it from the organization's number and keep it in the conversation. To answer a help request from list_reply_queue, pass its helpRequestId with channel APP: the reply lands in the conversation where they asked and marks the request replied, not closed. Without helpRequestId, APP and EMAIL go to their case conversation and mark its open request replied. A replied request stays in list_reply_queue under awaitingResolution until resolve_help_request closes it. clientRequestId is a UUID you keep; a retry with the same clientRequestId, channel and body sends once. The result's notifications says which channels carried it (email, sms and whatsApp: sent, queued, template or not_sent), with messageId and answeredHelpRequestId. A channel that cannot be used is refused with its reason (no_email, email_blocked, organization, not_connected, opted_out, window_closed) and nothing is sent. Depending on the person's approval setting it may wait for approval; pass reason naming the member.
read_member_threadReadRead a member's conversation
Read one of a member's conversations. Page with cursor. pendingHelpRequests lists the requests nobody has answered yet, with the ids of the messages that make them up. repliedHelpRequests lists the ones staff answered that are still open (when and by whom, and the reply's message id); close one with resolve_help_request once nothing more is owed.
resolve_help_requestWriteResolve a member's help request
Close a member's help request once nothing more is owed on it. helpRequestId comes from list_reply_queue (pendingRequest or awaitingResolution) or read_member_thread. It works on a request that was replied to or not; a request already closed returns alreadyResolved true. note (up to 1000 characters) is kept on the member's history. Nothing is sent to the member. Resolving closes only the request: openFollowUps counts the promises and tasks still open for the member, which stay on the work queue.
add_staff_noteWriteAdd a staff-only note
Add a note on a member's conversation that only staff see. The member never sees it. To correct a note, pass supersedes with its id: the old note leaves current reads and the audit log keeps the link.
list_tasksReadList tasks
List an organization's tasks, by status and owner.
create_taskWriteCreate a task
Create a task, optionally for a member, with a due date.
update_task_statusWriteChange a task's status
Change a task's status.
list_placementsReadList placements
List an organization's placements (a member's path to a specific job: SOURCING, INTERVIEWING, OFFER, PLACED), newest first, with the member and counts by stage. Filter by stage or memberId; page with page and pageSize (up to 100).
list_placement_optionsReadList placements to link
List recent placements as short labels (role • company, and the member's name) with their ids, to link a task to one as placementId.
record_placementWriteRecord a placement
Record a member's path to a specific job: roleTitle and companyName, the stage (SOURCING unless you say otherwise; PLACED when they were hired), notes and where the role came from (source). Placements are what an organization's outcomes are counted from, so record a hire as PLACED. outcomeEvidence says how you know: VERIFIED (confirmed with the employer or a document), SELF_REPORTED (the member said so) or SIMULATED (a practice or demo story, never counted). isTest true marks a disposable test record, allowed only in a test organization or for a demo account; it is left out of reports and counts.
move_placement_stageWriteMove a placement's stage
Move a placement to SOURCING, INTERVIEWING, OFFER or PLACED. Pass occurredAt when it happened earlier than now, such as the member's start date. Moving to PLACED counts the member as placed and resolves the placement's stalled alert, unless the placement's outcomeEvidence is SIMULATED or it is a test record. Pass outcomeEvidence (VERIFIED, SELF_REPORTED or SIMULATED) to record how you know.
update_placementWriteUpdate a placement
Correct a placement's role, company, stage, notes, source, outcomeEvidence (VERIFIED, SELF_REPORTED or SIMULATED) or isTest. Send every field you want to keep; read it with list_placements first.
get_outcomes_overviewReadRead outcomes at a glance
Read an organization's outcomes for a period: caseload, new members, members placed, check-ins completed, staff contacts, median reply time, members gone quiet and how many sit at each stage. window sets the period: from and to as YYYY-MM-DD (at most 366 days apart), timeZone as an IANA name such as America/Chicago, unit (day, week or month) for the trend, and weekStart (0 for Sunday, 1 for Monday). Each figure comes with the previous period of the same length, so say what changed. A case manager without broad access sees their own caseload (scope caseload). sample true means the numbers are demonstration data, never the organization's records: source.used says which you got, source.organizationDefault what the organization shows by default and source.testOrganization whether it is a test organization. Set source to records to compute from the organization's own records (a test organization's fixtures included), or to sample for demonstration data; one response never mixes the two. Simulated outcomes and test records are left out of every count.
get_placements_reportReadRead the placements report
Read placements for a period: members placed, placements and offers, median days to placed, open placements by stage, top employers and the most recent placements. window sets the period: from and to as YYYY-MM-DD (at most 366 days apart), timeZone as an IANA name such as America/Chicago, unit (day, week or month) for the trend, and weekStart (0 for Sunday, 1 for Monday). Each figure comes with the previous period of the same length, so say what changed. A case manager without broad access sees their own caseload (scope caseload). sample true means the numbers are demonstration data, never the organization's records: source.used says which you got, source.organizationDefault what the organization shows by default and source.testOrganization whether it is a test organization. Set source to records to compute from the organization's own records (a test organization's fixtures included), or to sample for demonstration data; one response never mixes the two. Simulated outcomes and test records are left out of every count.
get_pipeline_reportReadRead the pipeline report
Read how members move through the pipeline in a period: members at each stage, moves forward and backward, and median days to placed. window sets the period: from and to as YYYY-MM-DD (at most 366 days apart), timeZone as an IANA name such as America/Chicago, unit (day, week or month) for the trend, and weekStart (0 for Sunday, 1 for Monday). Each figure comes with the previous period of the same length, so say what changed. A case manager without broad access sees their own caseload (scope caseload). sample true means the numbers are demonstration data, never the organization's records: source.used says which you got, source.organizationDefault what the organization shows by default and source.testOrganization whether it is a test organization. Set source to records to compute from the organization's own records (a test organization's fixtures included), or to sample for demonstration data; one response never mixes the two. Simulated outcomes and test records are left out of every count.
get_engagement_reportReadRead the engagement report
Read how engaged members were in a period: how many were active, what they did (searched, wrote a message, saved a job, applied, had an interview, got an offer) and the searches they ran most. window sets the period: from and to as YYYY-MM-DD (at most 366 days apart), timeZone as an IANA name such as America/Chicago, unit (day, week or month) for the trend, and weekStart (0 for Sunday, 1 for Monday). Each figure comes with the previous period of the same length, so say what changed. A case manager without broad access sees their own caseload (scope caseload). sample true means the numbers are demonstration data, never the organization's records: source.used says which you got, source.organizationDefault what the organization shows by default and source.testOrganization whether it is a test organization. Set source to records to compute from the organization's own records (a test organization's fixtures included), or to sample for demonstration data; one response never mixes the two. Simulated outcomes and test records are left out of every count.
get_case_work_reportReadRead the case work report
Read the staff's case work in a period: check-ins, contacts by channel, job lists sent, outreach, reply times and each staff member's share. window sets the period: from and to as YYYY-MM-DD (at most 366 days apart), timeZone as an IANA name such as America/Chicago, unit (day, week or month) for the trend, and weekStart (0 for Sunday, 1 for Monday). Each figure comes with the previous period of the same length, so say what changed. A case manager without broad access sees their own caseload (scope caseload). sample true means the numbers are demonstration data, never the organization's records: source.used says which you got, source.organizationDefault what the organization shows by default and source.testOrganization whether it is a test organization. Set source to records to compute from the organization's own records (a test organization's fixtures included), or to sample for demonstration data; one response never mixes the two. Simulated outcomes and test records are left out of every count.
list_promisesReadList what you promised a member
List the promises staff made to a member, open and kept, each with its owner and due date, and whose turn it is in the conversation. Every open promise is listed, however old, with timing (overdue, due_today, upcoming or undated) and daysLate, so an old promise is never hidden or counted as kept. nextAction is the one open promise shown as the member's next action, with its owner and choice: chosen when staff picked it with choose_next_action, earliest_due otherwise. When an old overdue promise crowds out what matters now, ask the case manager whether to move its date (reschedule_promise), replace it (supersede_promise) or pick a different next action; never mark it kept unless it was done.
choose_next_actionWriteChoose a member's next action
Make one open promise the member's next action, ahead of older or earlier-due ones; promiseId comes from list_promises. Pass promiseId null to go back to the earliest-due promise. The choice ends when that promise is kept or removed. Nothing is sent to the member.
reschedule_promiseWriteChange a promise's wording or date
Move an open promise to a new due date (due as YYYY-MM-DD, or null) or correct its wording (title, required; send the current title to keep it). The change is recorded on the member's history. A kept or removed promise is refused; reopen or put it back first. Nothing is sent to the member.
supersede_promiseWriteReplace a promise with a new one
Replace an open promise that no longer fits with a new one (title and due as YYYY-MM-DD or null), with a stable submissionId so a retry replaces it once. The old promise is removed as replaced, never marked kept, and the new one takes its place as the next action when the old one was chosen. Nothing is sent to the member.
add_promiseWriteRecord a promise to a member
Record something you promised a member, such as sending three warehouse roles by Friday, with a due date (YYYY-MM-DD, or null) and a stable submissionId so a retry records it once. It becomes the member's next action until it is kept.
set_promise_keptWriteMark a promise kept
Mark a promise to a member kept, or open again with kept false. promiseId comes from list_promises.
list_alertsReadList alerts
List an organization's alerts, newest first: unanswered replies (THREAD_REPLY), overdue or due next actions, members gone quiet, sent job lists with no answer, stalled stages, new members and job card outcomes or feedback. Filter by status (OPEN, ACKNOWLEDGED, RESOLVED) or eventType; page with cursor. Alert types you muted are left out.
acknowledge_alertWriteAcknowledge an alert
Acknowledge an alert: you have seen it and it stays open until it is resolved.
resolve_alertWriteResolve an alert
Resolve an alert once what it asked for is done. Needs permission to manage the organization.
snooze_alertWriteSnooze an alert
Hide an alert until a date and time (until, ISO 8601), such as the day after a scheduled check-in.
list_recommendationsReadList recommendations for a member
List the recommendations on a member's record: prompts to try next, jobs to save, check-ins, follow-up tasks and profile corrections. Filter by status (OPEN, RESOLVED) or threadId. Staff see them on the member's record.
recommend_for_memberWriteAdd a recommendation for a member
Add a recommendation to a member's record for the team to act on: type NEXT_PROMPT, SAVED_JOB, CHECK_IN, FOLLOW_UP_TASK or PROFILE_CORRECTION, a short title, a description, an optional link (url) and due date (dueAt). FOLLOW_UP_TASK also creates a task owned by you; it comes back as linkedTask (id, title, status) and has its own lifecycle, so it stays open after the recommendation is resolved unless you complete it.
resolve_recommendationWriteResolve a recommendation
Resolve a recommendation once it is done. recommendationId comes from list_recommendations. Resolving changes only the recommendation: a FOLLOW_UP_TASK's linked task stays open and is returned as linkedTask so you can say so. Pass completeLinkedTask true only when the case manager says the follow-up work is also done; it marks the linked task DONE in the same change (the task's owner or a manager only).
update_check_in_statusWriteChange a check-in's status
Mark a scheduled check-in COMPLETED, NO_SHOW or RESCHEDULE, or back to SCHEDULED. id comes from list_check_ins. Pass outcomeEvidence SIMULATED for a practice check-in that did not happen, so it is not counted. To record what was said, use log_check_in.
update_taskWriteUpdate a task
Change a task's title, description, member, priority, due date or status. Send every field you want to keep; read it with list_tasks first.
list_member_threadsReadList a member's conversations
List a member's recent conversations you may see, newest first, and which one is their case conversation (the one staff and the member share). Read one with read_member_thread.
open_case_threadWriteOpen a member's case conversation
Return the member's case conversation, starting it if they have none yet. Returns its threadId and whether it was created. Job list rounds and staff messages go here.
get_member_work_searchReadRead a member's work-search weeks
Read a member's weekly work-search record for an unemployment program, newest week first (12 unless you pass limit, up to 52): activities, applications and whether each week met the requirement. Only where the organization keeps work-search evidence.
export_member_work_searchWriteExport a member's work-search record
Export a member's work-search activities as CSV, for a program's weekly certification. Needs permission to export data. Depending on the person's approval setting it may wait for approval; pass reason naming the member.
log_job_listWriteLog a job list sent outside Metaintro
Record a job list you already gave a member some other way (email, WhatsApp, in person): the roles (title, employer, location, pay, apply link), when it was sent and a note. Nothing is sent. To send roles to a member from Metaintro, use start_job_list_round.
add_job_list_rolesWriteAdd roles to a logged job list
Add roles to a job list you logged with log_job_list. Nothing is sent.
start_job_list_roundWriteStart a job list for a member
Start the next job list round to email a member; it returns the round's jobListId. Each call starts a new round and carries over roles not yet sent, so first call preview_job_list_round without jobListId: when it returns a round, add to that one. Then add roles with add_job_list_round_role, read it with preview_job_list_round and send it with send_job_list_round. threadId is the member's case conversation, from open_case_thread.
add_job_list_round_roleWriteAdd a role to a job list round
Add a role to an unsent job list round: title, employer, location, pay (comp), the apply link (applyUrl, required, checked before it is added; a closed posting is refused), why it fits the member (whyFits) and any catch (catchNote). A role already in the round (same employer, title, location, pay and posted date) is kept as it is and returns duplicate: true; only a new apply link replaces the old one, so get whyFits and catchNote right the first time. Use roles from search_jobs or find_similar_jobs and name the evidence in whyFits. threadId is the member's case conversation, from open_case_thread.
preview_job_list_roundReadPreview a job list round
Read the email a job list round will send: subject, the roles that will go and the ones skipped or held, the member's constraints it was checked against, and contentHash. Show it to the case manager before sending. round is null when nothing is waiting to send. threadId is the member's case conversation, from open_case_thread.
send_job_list_roundWriteSend a job list round
Email a job list round to the member, signed with your name. Pass the contentHash from preview_job_list_round; if the list changed since, it is refused and you preview again. Depending on the person's approval setting it may wait for approval; pass reason naming the member and the roles. threadId is the member's case conversation, from open_case_thread.
show_resultsReadshow results
Cabinet: Show what has already been found and learned for one job seeker: what we know about them and what is still missing, the questions to ask them, what their recent job searches found and why, and the newest reply drafted for them. Use it first for any question about one person, such as why they have no new jobs, what to ask them, what was found for them, or what was drafted. It reads what exists and starts no new work.
get_status_reportWriteget status report
Cabinet: Write a new status report on the job seekers: what changed, who is waiting, and who to focus on first. The report the case manager is reading is already in the conversation. Call this only when the case manager asks for a report: a fresh one, one since a date, or one about one person. For a question about one person, use show_results instead. It takes up to half a minute. Counts against the cabinet quota of 12 calls a minute, shared by every session on this key; read what it produced with show_results, which uses the read quota.
find_jobsWritefind jobs
Cabinet: Look for jobs for some of the job seekers, or for everyone. Use it when the case manager asks to find, search for, or look for work for somebody. Each search runs on its own and takes a few minutes. Counts against the cabinet quota of 12 calls a minute, shared by every session on this key; read what it produced with show_results, which uses the read quota.
draft_repliesWritedraft replies
Cabinet: Draft the next message to some of the job seekers, or to everyone. Use it when the case manager asks to draft, write, reply to, or check in with somebody. Nothing is sent: each draft waits until the case manager asks to send it. Counts against the cabinet quota of 12 calls a minute, shared by every session on this key; read what it produced with show_results, which uses the read quota.
send_repliesWritesend replies
Cabinet: Send the drafted replies to some of the job seekers, or to everyone with a draft waiting. Use it only when the case manager asks to send, such as send it, send Marisol's draft, or send the replies. Each person gets the newest draft written for them in the last two weeks, as it was written, with its roles. A draft goes nowhere when somebody already replied after it, or when the person wrote after it. Each sent row carries notifications: which channels carried it (inApp is always true; email, sms and whatsApp are sent, queued or not_sent).
check_progressReadcheck progress
Cabinet: How a search or a draft placed in this chat is going: who is finished, and what came of it. Use it when the case manager asks how it is going, or whether it is done. asked_for holds the words the work was placed with: report its results against those terms, and a person with jobs 0 got no new jobs from it.
cancel_requestWritecancel request
Cabinet: Stop a search or a draft placed in this chat. Work already running stops at its next step, and what it wrote stays.
list_job_seekersReadlist job seekers
Cabinet: Who is on the caseload and where each one stands: their stage, how long since anybody reached them, what is booked next, what they want, and what blocks them. Narrow it to the people a question is about.
read_activityReadread activity
Cabinet: Who on the caseload did something over the last days, or did not, person by person. It reads the whole caseload at once, however many people are on it. Use it for questions such as who searched for jobs this week, who has not applied in a month, who has been most active, who did nothing at all, or what Andy and Lena did lately. It answers with how many matched, and lists up to 100 of them with everything each did, when, and the jobs they searched for. Leave activity out to look at everything.
count_activityReadcount activity
Cabinet: How many people on the caseload did each thing over the last days, and how many times, with the job titles they searched for most. It reads the whole caseload at once. Use it for questions such as how many people applied this month, what people are searching for, how activity changed week by week, or which stage or city is most active.
More actions through search_actions and run_action303
[ 04 / 07 ] · Prompts
Ready-made workflows
Clients that support MCP prompts show these as commands. Pick one and your agent starts the workflow with the tools above.
Public
find_jobs_that_fitFind jobs that fit
A short list of live jobs that fit what you want, with what still needs checking.
Arguments: role, location (optional)
explore_careersExplore jobs near me
What is hiring where you live, and which of those roles suit you.
Arguments: location
Personal
plan_my_dayPlan my job search today
What needs doing today: interviews, due reminders, deadlines, stale applications and new matches.
find_jobs_that_fitFind jobs that fit
A short list of live jobs that fit what you want, with what still needs checking.
Arguments: role, location (optional)
explore_careersExplore jobs near me
What is hiring where you live, and which of those roles suit you.
Arguments: location
tailor_resume_for_jobTailor my résumé to a job
A copy of your master résumé tailored to one job, ready to export.
Arguments: jobId
prepare_for_interviewPrepare for an interview
A briefing on the company and role, likely questions and stories from your experience.
Arguments: savedJobId
weekly_reviewReview my week
What you did this week, what came of it and what to change next week.
Organization
triage_my_caseloadTriage my caseload
Who needs you first today and the one action that moves each of them.
prepare_member_meetingPrepare for a member meeting
A one-page briefing on a member: where their search stands and what to agree next.
Arguments: memberId
find_jobs_for_memberFind jobs for a member
Live roles that fit a member, checked against what matters to them, ready to send as a job list.
Arguments: memberId
prepare_case_handoffPrepare a case-manager handoff
An evidence-backed handoff with the participant's priorities, outstanding commitments, accountable owners and next steps.
Arguments: memberId
report_outcomesReport our outcomes
A short outcomes report for a period: placements, engagement and case work, with what changed.
Arguments: period (optional)
[ 05 / 07 ] · Safe by design
Your agent acts as you, and only as you
The same rules hold on every connection and in every client.
Acts as one person
A connection acts as the person who signed in, with that person's access and nothing more.
OAuth and scopes
Sign in with OAuth 2.1, using dynamic client registration and PKCE, or with a personal key. Reading and writing are separate scopes, mcp.read and mcp.write.
You decide what waits
Your approval setting lets agent actions run at once, hold sensitive ones, or hold everything. Held actions wait in Settings > Agents until you approve or decline them.
Organizations stay separate
An organization's address reaches that organization's members only. Any other organization is refused.
Every write is on record
Each change is logged as made by the agent on the person's behalf, and you can disconnect any agent in Settings > Agents.
Data, not instructions
Job postings, company pages and messages reach your agent as data to read, never as instructions to follow.
[ 06 / 07 ] · Limits
Limits and protocol
MCP is free on every connection. Each key has its own budget a minute. Your total across every key and app you connect is capped too, with a daily budget that refills gradually over 24 hours. The public address is limited per network address.
- Public tool calls
- 30 a minute, 5,000 a day per address
- Reads
- 240 a minute per key, 10,000 a day per person
- Writes
- 60 a minute per key, 2,000 a day per person
- Chat with the assistant
- 12 a minute per key, 400 a day per person
- Cabinet tools
- 12 a minute per key, 300 a day per person
- Messages, invites and intros
- 100 a day per person, 500 for staff
- Transport
- Streamable HTTP, stateless
- Protocol
- 2026-07-28 and 2025 revisions
- Results
- Job cards, JSON text and structured content
[ 07 / 07 ] · FAQ
Questions about the MCP server
Is it free?
Yes. Every connection is free: public search, your own job search and organization tools. Rate limits keep it fast for everyone.
Do I need an account?
Not to search. The public address searches jobs and employers with no sign-in. To work on your own profile, résumés and applications, sign in with a free Metaintro account.
Which clients work?
Any client that supports remote MCP servers over Streamable HTTP, including Claude, Claude Code, ChatGPT, Cursor, VS Code and Codex. Claude and ChatGPT show job results as interactive job cards; other clients get the same results as JSON.
Can it apply to jobs for me?
No. It records the applications you make so your tracker stays current, and it never submits one. Anything it sends for you, such as a message to your case manager, follows your approval setting, which can hold it until you approve.
How is this different from the Jobs API?
The Jobs API is a REST endpoint for your own code: one key, job search, 60 requests a minute. The MCP server is built for AI agents: they discover the tools on their own, and once you sign in they can work on your own job search, not only search jobs.
Start now
Search live jobs from your agent in one line
Add the public address now. Sign in later, when you want your agent to work on your own search.