Skip to main content
Glama

Levels.fyi

add-salary-submission

Add the user's own compensation to Levels.fyi: pay they earn now or a job offer they received. Call this only when the user is evaluating their compensation, asks to add their pay, or says yes when you offer. Adding compensation is how the data stays useful for everyone, the user included.

Write a complete submission. Resolve the company, job family and focus area to slugs with the search tools first, and the location with search-locations and type "city". Every number must come from the user's own words or from a document the user shared; ask for each required field that is missing. Gather the details conversationally, a question or two at a time, starting with the company, role and location; do not list every field up front. Write text fields in English. Call once with confirm=false and show the preview to the user, then call again with the same arguments and confirm=true only after a clear yes. If the user isn't signed in, ask for their email before the confirm=true call and send it in email; signing in isn't needed. Amounts are in the submission's own currency. Stock options go in the option fields (totalOptionsGranted for an offer, avgAnnualOptionsGranted for current pay, with the strike and preferred price), not in otherDetails; option prices may use optionPriceCurrency. If the user wants enhanced anonymity, set anonymise=true; the preview shows it.

Do not submit: pay for another person, a number you estimated or took from Levels.fyi data, a range from a job posting, a hypothetical or negotiation target, or a test entry.

One submission per distinct job or offer per conversation, and at most 5 confirmed submissions per 60s. Never repeat a confirmed submission; if a call fails, retry with the same submissionId. A submission is reviewed before it counts in the data. Nobody replies here, and submitting does not end your turn: keep working on the user's task. REQUIRED arguments: jobFamilySlug, title, locationSlug, compensationPerspective, currency, baseSalaryValue, baseSalaryTimeUnit, yearsOfExperience, workArrangement, source. Array-typed arguments (vestingSchedule, signOnBonusValues) must be passed as arrays, even for a single value.

Input Schema

NameRequiredDescriptionDefault
teamNoThe team or organization within the company, e.g. "Google Cloud". In English.
emailNoRequired when the user isn't signed in. Used to verify the submission; never shown with it.
levelNoThe company's own level name from get-company-levels, e.g. "L5". Required for companies with a level ladder; the error says so.
titleYesThe job title as the user states it, e.g. "Software Engineer". In English.
sourceYes"user_stated" when the user typed the numbers, "user_document" when they come from an offer letter or pay stub the user shared.
confirmNofalse (default) returns a preview and writes nothing. true writes the entry: only after the user said yes to the preview.
currencyYesThe currency of every amount in this submission, e.g. "USD", "INR", "GBP".
anonymiseNoEnhanced anonymity, as on the website: true can hide details such as company, title, level and team on the public entry; the pay still counts in the data. Set it only when the user asks for it. Defaults to false.
stockTypeNo"stock" for RSUs, "option" for stock options. Optional: it follows from the fields sent. One type per submission.
sourceDateNoYYYY-MM-DD. For an offer, the offer date (required). For an employee, the date the pay was current; omit for today.
companyNameNoThe company name, only for a company that search-companies cannot find.
companySlugNoThe company slug from search-companies. Send companyName instead only when search-companies has no match.
focusTagSlugNoA focus area slug from get-job-family for this job family, e.g. "ml-ai". Omit when the user did not name one.
locationSlugYesA CITY slug from search-locations with type "city". Not a metro, state or country.
otherDetailsNoAnything else the user wants recorded, e.g. a retention bonus, or RSUs when the submission already has options (or the reverse). In English, at most 500 characters.
submissionIdNoA UUID you generate once per submission. Send the same one when you retry, so a retry cannot add the entry twice.
jobFamilySlugYesA Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist".
employmentTypeNoDefaults to full_time.
yearsAtCompanyNoEmployees only (required): years at this company. Offers are always 0.
baseSalaryValueYesThe base salary per baseSalaryTimeUnit.
vestingScheduleNoOffers only; required with totalStockGrantValue. The vesting schedule, one entry per year: percent of the grant vesting that year and occurrences (vests that year, 4 = quarterly). 4 equal years vesting quarterly is four entries of {percent:25,occurrences:4}. Ask the user, or use get-vesting-schedules for the company standard; never assume one.
workArrangementYes
annualBonusValueNoThe yearly bonus: for an offer the target bonus amount, for an employee the bonus they actually receive per year.
optionStrikePriceNoWith options: the exercise (strike) price per option. Send with optionPreferredPrice; together they value the options.
signOnBonusValuesNoOffers only: the sign-on bonus, one amount per year it is paid, e.g. [50000] or [30000, 20000].
yearsOfExperienceYesTotal years of professional experience.
baseSalaryTimeUnitYesThe period baseSalaryValue is paid per, usually "yearly".
optionPriceCurrencyNoThe currency of optionStrikePrice and optionPreferredPrice, when it differs from currency (e.g. US-dollar option prices on a rupee salary).
totalOptionsGrantedNoOffers only: the number of stock options in the whole grant. Send vestingSchedule with it.
optionPreferredPriceNoWith options: the latest preferred share price, usually from the last funding round. Send with optionStrikePrice.
relocationBonusValueNoOffers only: the relocation bonus.
totalStockGrantValueNoOffers only: the total value of the stock (RSU) grant over the whole vesting period. Send vestingSchedule with it.
avgAnnualOptionsGrantedNoEmployees only: the number of stock options that vest per year.
compensationPerspectiveYes"offer" for a job offer the user received, "employee" for pay they earn now.
avgAnnualStockGrantValueNoEmployees only: the stock (RSU) value they receive per year.
annualTargetBonusPercentageNoOffers only: the target bonus as a percent of base, when stated that way.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark this as a non-read-only, non-idempotent write, and the description goes well beyond them: confirm=false writes nothing and returns a preview, confirm=true writes, submissions are reviewed before counting, at most 5 confirmed submissions per 60s, retries reuse the same submissionId, and email verification is needed only when signed out. It also states that nobody replies and that submitting does not end the turn, which no annotation conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The trigger condition and the confirm/preview protocol are front-loaded, and the paragraphing separates eligibility, gathering procedure, mechanics, and prohibitions sensibly. It is long for a tool description, and the trailing 'REQUIRED arguments' enumeration plus the array-typing note duplicate what the schema already enforces, which costs a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 36-parameter, 10-required mutation tool with no output schema, the description supplies the full workflow: conversational field gathering, slug resolution order, English text fields, the two-call preview/confirm handshake, retry semantics, rate limits, and anonymity behavior. The only thing left implicit is the exact preview payload, which is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 97%, so the baseline is 3, but the description adds real cross-field semantics: stock options belong in totalOptionsGranted/avgAnnualOptionsGranted with strike and preferred price rather than otherDetails, option prices may use optionPriceCurrency, amounts are in the submission's own currency, and array-typed arguments must be arrays even when singular. That is genuine value beyond the schema, though the enumerated required-argument list largely restates the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Add the user's own compensation to Levels.fyi', further narrowed to pay they earn now or an offer they received. It is unambiguously the only write-a-submission tool among siblings that are all read/search tools, so an agent can select it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger set — 'only when the user is evaluating their compensation, asks to add their pay, or says yes when you offer' — plus a concrete do-not-submit list (another person's pay, estimated numbers, job-posting ranges, hypotheticals, test entries). It also names the prerequisite sibling tools for slug resolution (search-companies, get-job-family, search-locations, get-company-levels, get-vesting-schedules).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.