Connect an AI agent to CareerGenius

Connect an AI agent to CareerGenius

CareerGenius is preparing an API and an MCP server for AI agents that act for one person who asked for help with their own job search. Neither is open yet. This page describes how agents will connect, so you can plan; it will say when the API opens.

Coming soon Coming soon: the API and MCP server are not open yet, and calls to the addresses below do not work until they open.

How agents connect

MCP endpoint (Streamable HTTP, JSON responses, no session)
https://api.careergenius.org/mcp
REST base
https://api.careergenius.org/api/agent/v1/

Authentication

  • Every tool call sends an API key in the header Authorization: Bearer <key>. Never put the key in a URL.
  • The key belongs to the person's CareerGenius Premium account and stops working if Premium ends.
  • During the beta, keys are issued by CareerGenius on request and shown once. There is no self-serve key page in Account yet.

Tools

The MCP tools and the REST operations take the same input and return the same output.

  • careergenius_keyword_gapComing soon

    Keywords the posting asks for that the resume shows / doesn't show

    REST: POST https://api.careergenius.org/api/agent/v1/keyword-gap

    Deterministic, no AI. Not a score and not a prediction.

    Input and output schema
    careergenius_keyword_gap input
    FieldTypeNotes
    posting_textstringat least 40 characters; at most 30,000 characters
    job_urlstringat most 2,048 characters; uri; Public http(s) job page on port 80/443. Greenhouse, Lever, Ashby, SmartRecruiters, Workday and pages with schema.org JobPosting read best. LinkedIn links are not fetched: send posting_text.
    on_behalf_of requiredobjectYou confirm a person asked for this, and the resume is theirs (or they are authorised to use it).
    on_behalf_of.human_requested requiredtrue
    on_behalf_of.resume_is_theirs requiredtrue
    resumeobjectStructured resume. Send only what the person has really done; every output is checked against it.
    resume.namestringat most 120 characters
    resume.headlinestringat most 120 characters
    resume.summarystringat most 3,000 characters
    resume.experiencearray of objectsat most 15 items
    resume.experience[].titlestringat most 120 characters
    resume.experience[].employerstringat most 120 characters
    resume.experience[].locationstringat most 120 characters
    resume.experience[].start_datestringat most 20 characters
    resume.experience[].end_datestringat most 20 characters
    resume.experience[].currentboolean
    resume.experience[].bulletsarray of stringat most 15 items
    resume.educationarray of objectsat most 8 items
    resume.education[].degreestring
    resume.education[].fieldstring
    resume.education[].schoolstring
    resume.education[].start_datestring
    resume.education[].end_datestring
    resume.education[].detailsarray of string
    resume.skillsarray of stringat most 80 items
    resume.sectionsarray of objectsat most 6 items
    resume.sections[].titlestring
    resume.sections[].itemsarray of stringat most 15 items
    resume_textstringat least 40 characters; at most 30,000 characters
    keywordsarray of stringat most 30 items; Extra keywords to check (the posting's named tools and credentials are found automatically).
    careergenius_keyword_gap output
    FieldTypeNotes
    request_idstringuuid
    api_versionstring
    operation"keyword_gap"
    postingobject
    posting.titlestring | null
    posting.companystring | null
    posting.sourcestringposting_text, or how the link was read (ats-api, json-ld, embedded-json, generic)
    keywordsobject
    keywords.asked_forarray of string
    keywords.shown_on_resumearray of string
    keywords.not_shown_on_resumearray of string
    keywords.found_in_postinginteger
    keywords.supplied_by_callerinteger
    methodstring
    notesarray of string
  • careergenius_tailor_resumeComing soon

    Reword the summary and job bullets for one posting (fact-checked)

    REST: POST https://api.careergenius.org/api/agent/v1/tailor

    One AI call, then the CareerGenius Suggest fact check on every line. Lines that fail keep their original wording and are listed in held_back by field, index and reason code. Their text is never returned. Counts against the allowance only when at least one suggestion is delivered.

    Input and output schema
    careergenius_tailor_resume input
    FieldTypeNotes
    posting_textstringat least 40 characters; at most 30,000 characters
    job_urlstringat most 2,048 characters; uri; Public http(s) job page on port 80/443. Greenhouse, Lever, Ashby, SmartRecruiters, Workday and pages with schema.org JobPosting read best. LinkedIn links are not fetched: send posting_text.
    on_behalf_of requiredobjectYou confirm a person asked for this, and the resume is theirs (or they are authorised to use it).
    on_behalf_of.human_requested requiredtrue
    on_behalf_of.resume_is_theirs requiredtrue
    resume requiredobjectStructured resume. Send only what the person has really done; every output is checked against it.
    resume.namestringat most 120 characters
    resume.headlinestringat most 120 characters
    resume.summarystringat most 3,000 characters
    resume.experiencearray of objectsat most 15 items
    resume.experience[].titlestringat most 120 characters
    resume.experience[].employerstringat most 120 characters
    resume.experience[].locationstringat most 120 characters
    resume.experience[].start_datestringat most 20 characters
    resume.experience[].end_datestringat most 20 characters
    resume.experience[].currentboolean
    resume.experience[].bulletsarray of stringat most 15 items
    resume.educationarray of objectsat most 8 items
    resume.education[].degreestring
    resume.education[].fieldstring
    resume.education[].schoolstring
    resume.education[].start_datestring
    resume.education[].end_datestring
    resume.education[].detailsarray of string
    resume.skillsarray of stringat most 80 items
    resume.sectionsarray of objectsat most 6 items
    resume.sections[].titlestring
    resume.sections[].itemsarray of stringat most 15 items
    careergenius_tailor_resume output
    FieldTypeNotes
    request_idstringuuid
    api_versionstring
    operation"tailor"
    suggestionsarray of objects
    suggestions[].fieldstring
    suggestions[].originalstring
    suggestions[].suggestedstring
    suggestions[].itemsarray of objects
    suggestions[].items[].indexinteger
    suggestions[].items[].originalstring
    suggestions[].items[].suggestedstring
    held_backarray of objects
    held_back[].fieldstring
    held_back[].indexinteger
    held_back[].reasonsarray of objects
    held_back[].reasons[].codestring
    held_back[].reasons[].whystring
    notesarray of string
  • careergenius_cover_letterComing soon

    A cover letter or hiring-manager letter, every sentence checked against the resume

    REST: POST https://api.careergenius.org/api/agent/v1/cover-letter

    The CareerGenius letter pipeline: draft, check every sentence, at most one rewrite, clean. Unsupported or off-topic sentences are removed and counted by reason (their text is not returned). If what remains is not a letter grounded in this resume, the answer is 422 LETTER_HELD with no text and nothing is charged.

    Input and output schema
    careergenius_cover_letter input
    FieldTypeNotes
    posting_textstringat least 40 characters; at most 30,000 characters
    job_urlstringat most 2,048 characters; uri; Public http(s) job page on port 80/443. Greenhouse, Lever, Ashby, SmartRecruiters, Workday and pages with schema.org JobPosting read best. LinkedIn links are not fetched: send posting_text.
    on_behalf_of requiredobjectYou confirm a person asked for this, and the resume is theirs (or they are authorised to use it).
    on_behalf_of.human_requested requiredtrue
    on_behalf_of.resume_is_theirs requiredtrue
    resumeobjectStructured resume. Send only what the person has really done; every output is checked against it.
    resume.namestringat most 120 characters
    resume.headlinestringat most 120 characters
    resume.summarystringat most 3,000 characters
    resume.experiencearray of objectsat most 15 items
    resume.experience[].titlestringat most 120 characters
    resume.experience[].employerstringat most 120 characters
    resume.experience[].locationstringat most 120 characters
    resume.experience[].start_datestringat most 20 characters
    resume.experience[].end_datestringat most 20 characters
    resume.experience[].currentboolean
    resume.experience[].bulletsarray of stringat most 15 items
    resume.educationarray of objectsat most 8 items
    resume.education[].degreestring
    resume.education[].fieldstring
    resume.education[].schoolstring
    resume.education[].start_datestring
    resume.education[].end_datestring
    resume.education[].detailsarray of string
    resume.skillsarray of stringat most 80 items
    resume.sectionsarray of objectsat most 6 items
    resume.sections[].titlestring
    resume.sections[].itemsarray of stringat most 15 items
    resume_textstringat least 40 characters; at most 30,000 characters
    kind"cover-letter" | "hiring-manager-letter"default "cover-letter"
    applicant_namestringat most 120 characters
    job_titlestringat most 120 characters; Recommended; otherwise read from the posting.
    company_namestringat most 120 characters; Recommended; otherwise read from the posting.
    careergenius_cover_letter output
    FieldTypeNotes
    request_idstringuuid
    api_versionstring
    operation"cover_letter"
    kindstring
    letterstring
    removedarray of objectsat most 20 items
    removed[].reason"unsupported_claim" | "off_topic"
    removed[].whystringat most 160 characters
    rewordedarray of objectsat most 20 items
    reworded[].reason"stretched_wording"
    reworded[].now_readsstring
    reworded[].whystring
    added_from_resumearray of string
    attemptsinteger1 to 2
    notesarray of string
  • careergenius_interview_prepComing soon

    Likely interview questions for a posting, with answer outlines built only from the resume

    REST: POST https://api.careergenius.org/api/agent/v1/interview-prep

    Same resume and posting inputs as tailor-resume-pdf (no template / page_size). One AI call with a fixed prompt; the posting and resume are fenced as data and instructions inside them are ignored. A question is kept only if it is a short question about this posting. Every answer point must cite one resume line (summary or an experience bullet) and pass the CareerGenius fact check against that line: a point that adds a tool, number, result, title or employer is removed and listed by reason code. One paid call (allowance + AI cap) when at least one question is delivered. Scope: interview_prep. Idempotency-Key supported.

    Input and output schema
    careergenius_interview_prep input
    FieldTypeNotes
    resumeobjectStructured resume. Send only what the person has really done; every output is checked against it.
    resume.namestringat most 120 characters
    resume.headlinestringat most 120 characters
    resume.summarystringat most 3,000 characters
    resume.experiencearray of objectsat most 15 items
    resume.experience[].titlestringat most 120 characters
    resume.experience[].employerstringat most 120 characters
    resume.experience[].locationstringat most 120 characters
    resume.experience[].start_datestringat most 20 characters
    resume.experience[].end_datestringat most 20 characters
    resume.experience[].currentboolean
    resume.experience[].bulletsarray of stringat most 15 items
    resume.educationarray of objectsat most 8 items
    resume.education[].degreestring
    resume.education[].fieldstring
    resume.education[].schoolstring
    resume.education[].start_datestring
    resume.education[].end_datestring
    resume.education[].detailsarray of string
    resume.skillsarray of stringat most 80 items
    resume.sectionsarray of objectsat most 6 items
    resume.sections[].titlestring
    resume.sections[].itemsarray of stringat most 15 items
    resume_textstringat most 30,000 characters; Pasted plain text. Read by a fixed layout parser (no AI). Headings such as Summary, Experience, Education, Skills help.
    resume_fileobject
    resume_file.format required"pdf" | "docx"
    resume_file.content_base64 requiredstringAt most 1.5 MB decoded. PDFs need a text layer (scans are refused: FILE_UNREADABLE).
    resume_file.filenamestringat most 200 characters
    contactobject
    contact.namestringat most 120 characters
    contact.emailstringat most 254 characters
    contact.phonestringat most 40 characters
    contact.locationstringat most 120 characters
    linksarray of objectsat most 5 items
    links[].labelstringat most 40 characters
    links[].url requiredstringat most 300 characters
    posting_textstringat least 40 characters; at most 30,000 characters
    job_urlstringat most 2,048 characters; uri; Public http(s) job page on port 80/443. Greenhouse, Lever, Ashby, SmartRecruiters, Workday and pages with schema.org JobPosting read best. LinkedIn links are not fetched: send posting_text.
    on_behalf_of requiredobjectYou confirm a person asked for this, and the resume is theirs (or they are authorised to use it).
    on_behalf_of.human_requested requiredtrue
    on_behalf_of.resume_is_theirs requiredtrue
    careergenius_interview_prep output
    FieldTypeNotes
    request_idstringuuid
    api_versionstring
    operation"interview_prep"
    questionsarray of objectsat most 8 items
    questions[].questionstring
    questions[].answer_outlinearray of objectsat most 4 items
    questions[].answer_outline[].textstring
    questions[].answer_outline[].fromstringThe resume line it restates, e.g. experience[0].bullets[2] or summary.
    questions[].answer_outline[].resume_linestring
    held_backarray of objects
    held_back[].questioninteger
    held_back[].pointinteger
    held_back[].reasonsarray of objects
    notesarray of string
  • careergenius_render_resume_pdfComing soon

    Lay out a structured resume as a clean, single-column, ATS-readable PDF (no AI)

    REST: POST https://api.careergenius.org/api/agent/v1/resume-pdf

    Real selectable text with embedded fonts (Liberation Sans / Serif, SIL OFL), single column, no images, no tables, no clickable links (web addresses are printed as text), no scripts, actions or form fields. Letter or A4; templates classic (serif, centred header) and modern (sans-serif, left-aligned). At most 3 pages: a longer resume is refused with 422 TOO_MANY_PAGES. Text is printed exactly as sent (no rewording, no fact check), after removing control, zero-width and bidi-override characters. Characters the fonts cannot print (scripts other than Latin, Greek and Cyrillic) are refused with 400 UNSUPPORTED_CHARACTER and the field. The file is returned in the response as base64 and is never stored (no download link). Idempotency-Key is ignored here: a retry is a new call. One render at a time per key (429 CONCURRENCY); the server renders in a small worker pool with a queue (429 RENDER_BUSY when full) and stops a render after 5 s (503 RENDER_TIMEOUT). Counts one call of the monthly allowance when the file is delivered. Scope: render_resume.

    Input and output schema
    careergenius_render_resume_pdf input
    FieldTypeNotes
    on_behalf_of requiredobjectYou confirm a person asked for this, and the resume is theirs (or they are authorised to use it).
    on_behalf_of.human_requested requiredtrue
    on_behalf_of.resume_is_theirs requiredtrue
    resume requiredobjectClosed schema at every level (an unknown field is 400 UNKNOWN_FIELD). At most 40,000 characters of JSON.
    resume.contact requiredobject
    resume.contact.name requiredstringat most 120 characters
    resume.contact.headlinestringat most 160 characters
    resume.contact.emailstringat most 254 characters
    resume.contact.phonestringat most 40 characters
    resume.contact.locationstringat most 120 characters
    resume.linksarray of objectsat most 5 items; http(s) only, no user name or password. Printed as text without the scheme, never as a clickable link.
    resume.links[].labelstringat most 40 characters
    resume.links[].url requiredstringat most 300 characters
    resume.summarystringat most 2,000 characters; Line breaks start new paragraphs.
    resume.experiencearray of objectsat most 15 items
    resume.experience[].title requiredstringat most 160 characters
    resume.experience[].employerstringat most 160 characters
    resume.experience[].locationstringat most 120 characters
    resume.experience[].start_datestringat most 25 characters; Printed as sent
    resume.experience[].end_datestringat most 25 characters
    resume.experience[].currentbooleanPrints "Present"; do not also send end_date.
    resume.experience[].bulletsarray of stringat most 12 items
    resume.educationarray of objectsat most 8 items
    resume.education[].school requiredstringat most 160 characters
    resume.education[].degreestringat most 160 characters
    resume.education[].fieldstringat most 160 characters
    resume.education[].locationstringat most 120 characters
    resume.education[].start_datestringat most 25 characters
    resume.education[].end_datestringat most 25 characters
    resume.education[].detailsarray of stringat most 6 items
    resume.skillsarray of stringat most 80 items
    resume.certificationsarray of objectsat most 20 items
    resume.certifications[].name requiredstringat most 200 characters
    resume.certifications[].issuerstringat most 160 characters
    resume.certifications[].datestringat most 25 characters
    template"classic" | "modern"default "classic"
    page_size"letter" | "a4"default "letter"
    careergenius_render_resume_pdf output
    FieldTypeNotes
    request_idstringuuid
    api_versionstring
    format required"pdf" | "docx"
    template required"classic" | "modern"
    page_size required"letter" | "a4"
    pages requiredinteger | null1 to 3; PDF page count; null for docx.
    bytes requiredinteger
    sha256 requiredstringSHA-256 of the file bytes (hex).
    filename requiredstring
    content_type requiredstring
    data_base64 requiredstringThe file. Decode and save it: nothing is kept on our side.
  • careergenius_tailor_resume_pdfComing soon

    One call: job posting + resume (text, PDF, DOCX or JSON) -> tailored, fact-checked PDF + what changed

    REST: POST https://api.careergenius.org/api/agent/v1/tailor-resume-pdf

    1. Reads the posting (posting_text, or job_url through the job-import engine: public addresses only, redirects re-checked, size and time limits). 2. Reads the resume: structured JSON; or plain text / a PDF or DOCX file (base64, at most 1.5 MB, needs a text layer) read by a fixed layout parser (no AI; every value is the resume's own words; a field it cannot find stays empty). Files are parsed in an isolated worker with a time and memory limit. 3. Lists the keywords the posting asks for and which the resume shows (not a score). 4. Rewords the summary and job bullets for this posting (one AI call) and runs every rewording through the CareerGenius fact check. ONLY rewordings that pass are applied; the others keep the original wording and are listed in held_back by field, index and reason code (their text is never returned). 5. Lays out the tailored resume as a single-column, ATS-readable PDF (as resume-pdf) and returns it with the summary. Nothing is stored; Idempotency-Key is ignored (a retry is a new call). Counts one call of the monthly allowance when the PDF is delivered; the AI cost counts against the key's AI cap. One request at a time per key. Scope: tailor_resume_pdf.

    Input and output schema
    careergenius_tailor_resume_pdf input
    FieldTypeNotes
    resumeobjectStructured resume. Send only what the person has really done; every output is checked against it.
    resume.namestringat most 120 characters
    resume.headlinestringat most 120 characters
    resume.summarystringat most 3,000 characters
    resume.experiencearray of objectsat most 15 items
    resume.experience[].titlestringat most 120 characters
    resume.experience[].employerstringat most 120 characters
    resume.experience[].locationstringat most 120 characters
    resume.experience[].start_datestringat most 20 characters
    resume.experience[].end_datestringat most 20 characters
    resume.experience[].currentboolean
    resume.experience[].bulletsarray of stringat most 15 items
    resume.educationarray of objectsat most 8 items
    resume.education[].degreestring
    resume.education[].fieldstring
    resume.education[].schoolstring
    resume.education[].start_datestring
    resume.education[].end_datestring
    resume.education[].detailsarray of string
    resume.skillsarray of stringat most 80 items
    resume.sectionsarray of objectsat most 6 items
    resume.sections[].titlestring
    resume.sections[].itemsarray of stringat most 15 items
    resume_textstringat most 30,000 characters; Pasted plain text. Read by a fixed layout parser (no AI). Headings such as Summary, Experience, Education, Skills help.
    resume_fileobject
    resume_file.format required"pdf" | "docx"
    resume_file.content_base64 requiredstringAt most 1.5 MB decoded. PDFs need a text layer (scans are refused: FILE_UNREADABLE).
    resume_file.filenamestringat most 200 characters
    contactobject
    contact.namestringat most 120 characters
    contact.emailstringat most 254 characters
    contact.phonestringat most 40 characters
    contact.locationstringat most 120 characters
    linksarray of objectsat most 5 items
    links[].labelstringat most 40 characters
    links[].url requiredstringat most 300 characters
    posting_textstringat least 40 characters; at most 30,000 characters
    job_urlstringat most 2,048 characters; uri; Public http(s) job page on port 80/443. Greenhouse, Lever, Ashby, SmartRecruiters, Workday and pages with schema.org JobPosting read best. LinkedIn links are not fetched: send posting_text.
    on_behalf_of requiredobjectYou confirm a person asked for this, and the resume is theirs (or they are authorised to use it).
    on_behalf_of.human_requested requiredtrue
    on_behalf_of.resume_is_theirs requiredtrue
    template"classic" | "modern"default "classic"
    page_size"letter" | "a4"default "letter"
    careergenius_tailor_resume_pdf output
    FieldTypeNotes
    request_idstringuuid
    api_versionstring
    operation"tailor_resume_pdf"
    postingobject
    resume_source"structured" | "text" | "pdf" | "docx"
    parse_notesarray of string
    keywordsobjectLists, not a score.
    keywords.asked_forarray of string
    keywords.shown_beforearray of string
    keywords.shown_afterarray of string
    keywords.newly_shownarray of string
    keywords.not_shown_afterarray of string
    changesarray of objectsApplied rewordings (same items as tailor's suggestions).
    held_backarray of objectsRewordings that failed the fact check: field, index, reason codes. Never their text.
    pdfobject
    pdf.templatestring
    pdf.page_sizestring
    pdf.pagesinteger
    pdf.bytesinteger
    pdf.sha256string
    pdf.filenamestring
    pdf.content_type"application/pdf"
    pdf.data_base64string
    notesarray of string
  • careergenius_render_resume_docxComing soon

    The same resume layout as an editable Word (.docx) file (no AI)

    REST: POST https://api.careergenius.org/api/agent/v1/resume-docx

    Same input, rules and limits as resume-pdf. Plain paragraphs and a bullet list; no hyperlinks, fields, images or macros; fonts referenced by name (Times New Roman / Arial). pages is null (a Word file has no fixed page count until it is opened). Scope: render_resume.

    Input and output schema
    careergenius_render_resume_docx input
    FieldTypeNotes
    on_behalf_of requiredobjectYou confirm a person asked for this, and the resume is theirs (or they are authorised to use it).
    on_behalf_of.human_requested requiredtrue
    on_behalf_of.resume_is_theirs requiredtrue
    resume requiredobjectClosed schema at every level (an unknown field is 400 UNKNOWN_FIELD). At most 40,000 characters of JSON.
    resume.contact requiredobject
    resume.contact.name requiredstringat most 120 characters
    resume.contact.headlinestringat most 160 characters
    resume.contact.emailstringat most 254 characters
    resume.contact.phonestringat most 40 characters
    resume.contact.locationstringat most 120 characters
    resume.linksarray of objectsat most 5 items; http(s) only, no user name or password. Printed as text without the scheme, never as a clickable link.
    resume.links[].labelstringat most 40 characters
    resume.links[].url requiredstringat most 300 characters
    resume.summarystringat most 2,000 characters; Line breaks start new paragraphs.
    resume.experiencearray of objectsat most 15 items
    resume.experience[].title requiredstringat most 160 characters
    resume.experience[].employerstringat most 160 characters
    resume.experience[].locationstringat most 120 characters
    resume.experience[].start_datestringat most 25 characters; Printed as sent
    resume.experience[].end_datestringat most 25 characters
    resume.experience[].currentbooleanPrints "Present"; do not also send end_date.
    resume.experience[].bulletsarray of stringat most 12 items
    resume.educationarray of objectsat most 8 items
    resume.education[].school requiredstringat most 160 characters
    resume.education[].degreestringat most 160 characters
    resume.education[].fieldstringat most 160 characters
    resume.education[].locationstringat most 120 characters
    resume.education[].start_datestringat most 25 characters
    resume.education[].end_datestringat most 25 characters
    resume.education[].detailsarray of stringat most 6 items
    resume.skillsarray of stringat most 80 items
    resume.certificationsarray of objectsat most 20 items
    resume.certifications[].name requiredstringat most 200 characters
    resume.certifications[].issuerstringat most 160 characters
    resume.certifications[].datestringat most 25 characters
    template"classic" | "modern"default "classic"
    page_size"letter" | "a4"default "letter"
    careergenius_render_resume_docx output
    FieldTypeNotes
    request_idstringuuid
    api_versionstring
    format required"pdf" | "docx"
    template required"classic" | "modern"
    page_size required"letter" | "a4"
    pages requiredinteger | null1 to 3; PDF page count; null for docx.
    bytes requiredinteger
    sha256 requiredstringSHA-256 of the file bytes (hex).
    filename requiredstring
    content_type requiredstring
    data_base64 requiredstringThe file. Decode and save it: nothing is kept on our side.

Example calls

Replace the placeholder with the person's key. Until the API opens, these calls do not work.

REST with curl

curl -sS -X POST 'https://api.careergenius.org/api/agent/v1/keyword-gap' \
  -H 'Authorization: Bearer <your CareerGenius API key>' \
  -H 'Content-Type: application/json' \
  -d '{"on_behalf_of":{"human_requested":true,"resume_is_theirs":true},"resume_text":"Jordan Example. Data analyst since 2021: weekly sales reports in SQL and Tableau.","posting_text":"Data Analyst. You will build reports for the sales team with SQL, Python and Tableau."}'

MCP with curl

curl -sS -X POST 'https://api.careergenius.org/mcp' \
  -H 'Authorization: Bearer <your CareerGenius API key>' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-06-18' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"careergenius_keyword_gap","arguments":{"on_behalf_of":{"human_requested":true,"resume_is_theirs":true},"resume_text":"Jordan Example. Data analyst since 2021: weekly sales reports in SQL and Tableau.","posting_text":"Data Analyst. You will build reports for the sales team with SQL, Python and Tableau."}}}'

Claude Desktop

In claude_desktop_config.json, through the mcp-remote bridge (the key stays in an environment variable):

{
  "mcpServers": {
    "careergenius": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.careergenius.org/mcp",
        "--header",
        "Authorization:${CAREERGENIUS_AUTH}"
      ],
      "env": {
        "CAREERGENIUS_AUTH": "Bearer <your CareerGenius API key>"
      }
    }
  }
}

Claude Code

claude mcp add --transport http careergenius https://api.careergenius.org/mcp --header "Authorization: Bearer <your CareerGenius API key>"

ChatGPT and the OpenAI API

ChatGPT's app connectors sign in with OAuth, which CareerGenius does not offer yet. Agents built on the OpenAI Responses API can pass the key in the MCP tool's authorization field:

{
  "type": "mcp",
  "server_label": "careergenius",
  "server_url": "https://api.careergenius.org/mcp",
  "authorization": "<your CareerGenius API key>",
  "require_approval": "always"
}

Limits

  • Each key has a monthly allowance of 600 delivered results and a monthly cap on AI cost. Only delivered results count: a refused or failed call is not charged.
  • Per key: 20 requests a minute, 300 a day, 2 requests at a time and 1 file render at a time.
  • Up to 3 active keys per account. Keys expire after 90 days unless CareerGenius sets a different date.
  • A request body is at most 96 KB (2.2 MB for tailor_resume_pdf, interview_prep and the MCP endpoint, which accept a resume file). Resume text and posting text are at most 30,000 characters each; up to 30 extra keywords.
  • Resume files are at most 3 pages, letter or A4, in a classic or modern layout.
  • Job links: public job pages only. LinkedIn links are not fetched: send the posting text.
  • These are the planned defaults and may change before the API opens.

Pricing

Included with CareerGenius Premium. Agent access has no separate price. Premium: $29.99 a month, renewing until you cancel; $119.94 every 6 months, renewing until you cancel. See pricing.

Safety

  • Fact check: every AI result passes the same checks as the website. A rewrite or sentence that adds a tool, number, title, result or employer the resume doesn't show is held back and listed by reason, never by its text. The checks are automatic, so the person reviews every result before using it.
  • Nothing stored: CareerGenius doesn't store the resumes, postings or files you send or get back. Files come back in the response (base64), with no download link. If you send an Idempotency-Key for a safe retry, that one answer is kept for 24 hours, then deleted. Each call is logged by time, tool, outcome and cost, never by its content.
  • A person asked: every request confirms on_behalf_of (a person asked for this, and the resume is theirs).
  • Fixed tasks only: it is not a general text generator, and instructions hidden inside a resume or job posting are ignored.
  • No ATS score, pass/fail result, interview probability or salary guess is ever returned.

Rules for agents

  • A real person asked for this: the agent acts for one person, with their own resume.
  • The person reviews every rewrite and letter before using it.
  • It is not a general text generator, and instructions hidden inside a resume or job posting are ignored.
  • No ATS score, pass/fail result, interview probability or salary guess is ever returned.

More