Skip to main content

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.

Try it in Claude Code
claude mcp add --transport http metaintro-public https://www.metaintro.com/api/mcp/public

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/public

    Live 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/mcp

    Your 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

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.

## ClaudeIn the Claude app or on claude.ai, open Settings, then Connectors, and choose Add custom connector. Name it Metaintro and paste an address.## ChatGPTIn ChatGPT, open Settings, then Connectors, and create a custom connector with an address. Choose OAuth when it asks how to sign in.> Depending on your plan, custom connectors may need developer mode or your workspace admin's approval.Your job search, sign-in: `https://www.metaintro.com/api/mcp`Search 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

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 cards

    Search 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 cards

    Read 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_insightsRead

    Read 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_companyRead

    Read 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 cards

    List 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 cards

    Find 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_demandRead

    Read 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
  • chatWrite

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

  • whoamiRead

    Who 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_actionsRead

    Search 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_requestRead

    Check 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_operationRead

    Check 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_actionWrite

    Run 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_profileRead

    Read 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_sectionWrite

    Replace 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_fieldsWrite

    Change 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_changesRead

    List 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_changeRead

    Read 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_preferencesRead

    Read 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_dealbreakersWrite

    Set dealbreakers

    Set the things a job must not have. Pass the profile's current version as expectedVersion.

  • update_compensationWrite

    Set pay expectations

    Set the pay you are looking for. Pass the profile's current version as expectedVersion.

  • get_master_resumeRead

    Read my master résumé

    Read your primary résumé, the one Metaintro tailors from, with its content and design.

  • list_resumesRead

    List my résumés

    List the résumés you built in Metaintro.

  • get_resumeRead

    Read a résumé

    Read one résumé you built, by its id.

  • update_resumeWrite

    Edit 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_resumesRead

    List uploaded résumé files

    List the résumé files you uploaded.

  • get_resume_upload_urlWrite

    Start 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_resumeWrite

    Add 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_resumeWrite

    Build 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_resumeWrite

    Export 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_resumeWrite

    Archive 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_resumeWrite

    Choose my master résumé

    Choose which of your résumés is the primary résumé used for tailoring.

  • duplicate_resumeWrite

    Copy a résumé

    Make an editable copy of one of your résumés.

  • list_resume_versionsRead

    List résumé versions

    Read the saved versions of one of your résumés before restoring or editing it.

  • get_resume_downloadRead

    Download an uploaded résumé

    Get a download URL for one of your uploaded résumé files. Treat the returned URL as private.

  • search_jobsReadJob cards

    Search 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 cards

    Read 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_insightsRead

    Read 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_companyRead

    Read 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 cards

    List 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 cards

    Find 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_demandRead

    Read 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_taskWrite

    Add 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_tasksRead

    List 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_taskWrite

    Finish 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_jobsRead

    List 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_stepsRead

    What 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_jobsRead

    List 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_jobRead

    Read 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_fitWrite

    Check 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_jobWrite

    Save 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_jobWrite

    Update 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_jobWrite

    Archive 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_jobsRead

    List my archived jobs

    List the jobs you took off your board, most recently archived first, with the stage each was in.

  • restore_my_jobWrite

    Restore 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_jobWrite

    Delete 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_noteWrite

    Add 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_applicationWrite

    Record 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_reminderWrite

    Set 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_searchRead

    Read 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_searchWrite

    Export 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_preferencesWrite

    Change 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_advisorWrite

    Invite 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_channelsWrite

    Choose 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_memoryRead

    Read 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_threadsRead

    List my conversations

    List your conversations, newest first. Page with cursor.

  • read_threadRead

    Read 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_contactWrite

    Save 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_outreachWrite

    Record 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_touchWrite

    Log 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_interviewWrite

    Record 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_offerWrite

    Record 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_upWrite

    Record a follow-up

    Record a follow-up you already made on a tracked job. This does not send a message.

  • update_job_reminderWrite

    Update a job reminder

    Update or complete an existing reminder for a tracked job.

  • list_application_materialsRead

    List 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_documentRead

    Read an application document

    Read a saved application document such as a cover letter or interview notes.

  • save_job_documentWrite

    Save 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_documentWrite

    Export 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_availabilityWrite

    Check whether a job is open

    Check the availability of a job you are tracking before applying.

  • get_case_managerRead

    Read 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_managerWrite

    Message 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_managerWrite

    Ask 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
  • whoamiRead

    Who 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_actionsRead

    Search 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_requestRead

    Check 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_operationRead

    Check 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_actionWrite

    Run 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 cards

    Search 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 cards

    Read 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_insightsRead

    Read 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_companyRead

    Read 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 cards

    List 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 cards

    Find 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_demandRead

    Read 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_tasksRead

    List 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_taskWrite

    Add 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_membersRead

    List 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_digestRead

    Read 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_memberRead

    Find 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_memberRead

    Read 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_profileRead

    Read 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_sectionsRead

    Read 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_briefRead

    Read 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_briefWrite

    Write a fresh member brief

    Write a fresh brief on a member from their current record, for a handoff or a meeting.

  • get_what_mattersRead

    Read 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_mattersWrite

    Set 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_activityRead

    List a member's activity

    List a member's timeline: notes, check-ins, outreach, applications and stage changes. Page with cursor.

  • add_member_noteWrite

    Add 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_questionsRead

    Read 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_questionWrite

    Record 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_questionWrite

    Resolve 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_questionWrite

    Turn 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_restrictionsRead

    Read 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_restrictionWrite

    Record 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_restrictionWrite

    Remove 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_notesRead

    Read 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_noteRead

    Read 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_noteWrite

    Edit 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_noteWrite

    Delete 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_profileWrite

    Replace 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_resumesRead

    List 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_resumeRead

    Read 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_urlWrite

    Start 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_resumeWrite

    Add 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_outreachWrite

    Log 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_statusWrite

    Update 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_inWrite

    Log 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_insRead

    List check-ins

    List an organization's check-ins, by status and owner.

  • log_outreachWrite

    Log 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_stageWrite

    Move a member's stage

    Move a member to another pipeline stage: intake, searching, résumé building, applying, interviewing, offer or placed.

  • update_member_statusWrite

    Change 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_managerWrite

    Assign 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_managersRead

    List 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_listsRead

    List 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_listRead

    Read a job list

    Read one job list in full: each role, its status and feedback, and the attachments sent with it.

  • update_role_statusWrite

    Update a role's status

    Record where a member stands on a role from a job list you sent them.

  • get_member_job_boardRead

    Read 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_jobRead

    Read 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_materialsRead

    List 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_documentRead

    Read 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_jobWrite

    Add 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_jobWrite

    Edit 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_upWrite

    Record 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_fitWrite

    Check 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_jobWrite

    Move 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_noteWrite

    Add 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_applicationWrite

    Record 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_reminderWrite

    Set 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_reminderWrite

    Update 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_contactWrite

    Record 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_outreachWrite

    Record 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_touchWrite

    Log 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_interviewWrite

    Record 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_offerWrite

    Record 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_jobWrite

    Archive 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_jobWrite

    Restore 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_jobWrite

    Delete 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_applicationWrite

    Log an application

    Record an application a member made to a job that was not on a list you sent.

  • get_work_queueRead

    Read 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_queueRead

    List 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_messageWrite

    Send 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_threadRead

    Read 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_requestWrite

    Resolve 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_noteWrite

    Add 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_tasksRead

    List tasks

    List an organization's tasks, by status and owner.

  • create_taskWrite

    Create a task

    Create a task, optionally for a member, with a due date.

  • update_task_statusWrite

    Change a task's status

    Change a task's status.

  • list_placementsRead

    List 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_optionsRead

    List 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_placementWrite

    Record 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_stageWrite

    Move 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_placementWrite

    Update 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_overviewRead

    Read 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_reportRead

    Read 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_reportRead

    Read 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_reportRead

    Read 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_reportRead

    Read 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_promisesRead

    List 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_actionWrite

    Choose 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_promiseWrite

    Change 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_promiseWrite

    Replace 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_promiseWrite

    Record 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_keptWrite

    Mark a promise kept

    Mark a promise to a member kept, or open again with kept false. promiseId comes from list_promises.

  • list_alertsRead

    List 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_alertWrite

    Acknowledge an alert

    Acknowledge an alert: you have seen it and it stays open until it is resolved.

  • resolve_alertWrite

    Resolve an alert

    Resolve an alert once what it asked for is done. Needs permission to manage the organization.

  • snooze_alertWrite

    Snooze an alert

    Hide an alert until a date and time (until, ISO 8601), such as the day after a scheduled check-in.

  • list_recommendationsRead

    List 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_memberWrite

    Add 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_recommendationWrite

    Resolve 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_statusWrite

    Change 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_taskWrite

    Update 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_threadsRead

    List 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_threadWrite

    Open 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_searchRead

    Read 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_searchWrite

    Export 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_listWrite

    Log 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_rolesWrite

    Add roles to a logged job list

    Add roles to a job list you logged with log_job_list. Nothing is sent.

  • start_job_list_roundWrite

    Start 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_roleWrite

    Add 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_roundRead

    Preview 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_roundWrite

    Send 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_resultsRead

    show 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_reportWrite

    get 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_jobsWrite

    find 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_repliesWrite

    draft 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_repliesWrite

    send 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_progressRead

    check 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_requestWrite

    cancel 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_seekersRead

    list 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_activityRead

    read 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_activityRead

    count 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

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_fit

    Find jobs that fit

    A short list of live jobs that fit what you want, with what still needs checking.

    Arguments: role, location (optional)

  • explore_careers

    Explore jobs near me

    What is hiring where you live, and which of those roles suit you.

    Arguments: location

Personal

  • plan_my_day

    Plan my job search today

    What needs doing today: interviews, due reminders, deadlines, stale applications and new matches.

  • find_jobs_that_fit

    Find jobs that fit

    A short list of live jobs that fit what you want, with what still needs checking.

    Arguments: role, location (optional)

  • explore_careers

    Explore jobs near me

    What is hiring where you live, and which of those roles suit you.

    Arguments: location

  • tailor_resume_for_job

    Tailor my résumé to a job

    A copy of your master résumé tailored to one job, ready to export.

    Arguments: jobId

  • prepare_for_interview

    Prepare for an interview

    A briefing on the company and role, likely questions and stories from your experience.

    Arguments: savedJobId

  • weekly_review

    Review my week

    What you did this week, what came of it and what to change next week.

Organization

  • triage_my_caseload

    Triage my caseload

    Who needs you first today and the one action that moves each of them.

  • prepare_member_meeting

    Prepare 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_member

    Find 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_handoff

    Prepare a case-manager handoff

    An evidence-backed handoff with the participant's priorities, outstanding commitments, accountable owners and next steps.

    Arguments: memberId

  • report_outcomes

    Report our outcomes

    A short outcomes report for a period: placements, engagement and case work, with what changed.

    Arguments: period (optional)

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.

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

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.

Return to navigation