Levels.fyi
Server Details
Salary, level and job data from 1M+ pay reports. Benchmark pay, evaluate offers, search open jobs.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Levels-fyi/levels-fyi-plugin
- GitHub Stars
- 0
TDQS
Scored across 30 tools
Purpose boundaries are mostly clear: search tools resolve entities, benchmark tools answer pay questions, and profile/submission/job tools have distinct roles. There is some overlap among search-all, search-role-terms, the type-specific searches, and among the percentile/location/top-company benchmarking tools, but descriptions give enough guidance to choose.
All tools use lowercase hyphenated verb-noun naming such as get-company, search-locations, add-salary-submission, and upload-resume. The pattern is predictable throughout, with no camelCase or mixed naming conventions.
With 30 tools, the surface is well above the typical well-scoped range of 3-15. Although Levels.fyi is a broad domain, many search/resolution and benchmark tools could be consolidated or exposed through fewer entry points.
The surface covers entity resolution, company and level salary benchmarking, location and top-company comparisons, raw submissions, job search/details, vesting schedules, profile/resume operations, salary submission, feedback, filters, and domain knowledge. The core lifecycle for agent tasks appears complete, with no obvious dead ends.
Available Tools
30 toolsadd-salary-submissionAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | The team or organization within the company, e.g. "Google Cloud". In English. | |
| No | Required when the user isn't signed in. Used to verify the submission; never shown with it. | ||
| level | No | The company's own level name from get-company-levels, e.g. "L5". Required for companies with a level ladder; the error says so. | |
| title | Yes | The job title as the user states it, e.g. "Software Engineer". In English. | |
| source | Yes | "user_stated" when the user typed the numbers, "user_document" when they come from an offer letter or pay stub the user shared. | |
| confirm | No | false (default) returns a preview and writes nothing. true writes the entry: only after the user said yes to the preview. | |
| currency | Yes | The currency of every amount in this submission, e.g. "USD", "INR", "GBP". | |
| anonymise | No | Enhanced 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. | |
| stockType | No | "stock" for RSUs, "option" for stock options. Optional: it follows from the fields sent. One type per submission. | |
| sourceDate | No | YYYY-MM-DD. For an offer, the offer date (required). For an employee, the date the pay was current; omit for today. | |
| companyName | No | The company name, only for a company that search-companies cannot find. | |
| companySlug | No | The company slug from search-companies. Send companyName instead only when search-companies has no match. | |
| focusTagSlug | No | A focus area slug from get-job-family for this job family, e.g. "ml-ai". Omit when the user did not name one. | |
| locationSlug | Yes | A CITY slug from search-locations with type "city". Not a metro, state or country. | |
| otherDetails | No | Anything 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. | |
| submissionId | No | A UUID you generate once per submission. Send the same one when you retry, so a retry cannot add the entry twice. | |
| jobFamilySlug | Yes | A Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist". | |
| employmentType | No | Defaults to full_time. | |
| yearsAtCompany | No | Employees only (required): years at this company. Offers are always 0. | |
| baseSalaryValue | Yes | The base salary per baseSalaryTimeUnit. | |
| vestingSchedule | No | Offers 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. | |
| workArrangement | Yes | ||
| annualBonusValue | No | The yearly bonus: for an offer the target bonus amount, for an employee the bonus they actually receive per year. | |
| optionStrikePrice | No | With options: the exercise (strike) price per option. Send with optionPreferredPrice; together they value the options. | |
| signOnBonusValues | No | Offers only: the sign-on bonus, one amount per year it is paid, e.g. [50000] or [30000, 20000]. | |
| yearsOfExperience | Yes | Total years of professional experience. | |
| baseSalaryTimeUnit | Yes | The period baseSalaryValue is paid per, usually "yearly". | |
| optionPriceCurrency | No | The currency of optionStrikePrice and optionPreferredPrice, when it differs from currency (e.g. US-dollar option prices on a rupee salary). | |
| totalOptionsGranted | No | Offers only: the number of stock options in the whole grant. Send vestingSchedule with it. | |
| optionPreferredPrice | No | With options: the latest preferred share price, usually from the last funding round. Send with optionStrikePrice. | |
| relocationBonusValue | No | Offers only: the relocation bonus. | |
| totalStockGrantValue | No | Offers only: the total value of the stock (RSU) grant over the whole vesting period. Send vestingSchedule with it. | |
| avgAnnualOptionsGranted | No | Employees only: the number of stock options that vest per year. | |
| compensationPerspective | Yes | "offer" for a job offer the user received, "employee" for pay they earn now. | |
| avgAnnualStockGrantValue | No | Employees only: the stock (RSU) value they receive per year. | |
| annualTargetBonusPercentage | No | Offers only: the target bonus as a percent of base, when stated that way. |
TDQS
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.
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.
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.
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.
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.
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.
get-available-filtersARead-onlyInspect
List which inputs and filter values the free tier can use. The free inputs are jobFamilySlug, one locationSlug or countrySlug, and companySlug; every result is total compensation from the last 12 months. Dimensions marked free: false (levels, years of experience, focus areas, titles, company size, funding stage, revenue, valuation, work arrangement, offer vs employee) are not accepted by any tool here. Call this before building a query if unsure what a tool accepts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only safety, so the description adds valuable behavioral context: it enumerates free inputs, specifies a 12-month data scope, and clarifies that certain dimensions are not accepted by any tool here. It stops short of describing return format or pagination, but those are less critical for a parameter-free discovery tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, then efficiently packs essential details about free inputs, exclusions, and when to call it. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema and no parameters, the description effectively communicates what the tool returns (free input list and non-free dimensions) and the data scope (total compensation from last 12 months). An agent has enough information to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description doesn't need to explain parameters, and it actually provides useful meta-information about accepted inputs across the toolset, which enhances understanding without being redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifically states the tool lists available inputs and filter values for the free tier, with clear examples of free and non-free dimensions. This distinguishes it from all sibling tools, which either query data or manage entities, by making it an explicit discovery mechanism for accepted parameters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to call this before building a query if unsure what a tool accepts, which is a clear when-to-use directive. The implication is that it need not be called when the agent already knows accepted inputs, providing adequate when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-companyARead-onlyInspect
Look up a single company by its slug (preferred) or name, returning its full profile: name, slug, employee count, headquarters, founding year, ticker, company type, and estimated valuation. Use search-companies first if you only have a name and need the exact slug. REQUIRED arguments: companyNameOrSlug.
| Name | Required | Description | Default |
|---|---|---|---|
| companyNameOrSlug | Yes | Name or slug of a company |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered and the description carries a lighter burden. It adds real value by enumerating the returned profile fields (compensating for the missing output schema) and by flagging slug as the preferred lookup key. It does not say what happens when the company is not found or when a name matches multiple companies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the return shape, then the routing hint, then the required-argument note. The trailing 'REQUIRED arguments: companyNameOrSlug' is mildly redundant with the schema's required array but does no harm.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with annotations and no output schema, the definition is nearly complete: it covers purpose, input preference, alternative routing, and the returned field set. The only meaningful gap is error/ambiguity behavior, which an agent would need to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema coverage, the baseline is 3, but the description adds genuine semantics: slug is preferred over name, and the argument is marked required. The schema description alone ('Name or slug of a company') conveys none of that preference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Look up a single company') and enumerates the returned profile fields, so the agent knows exactly what it gets back. The parenthetical '(preferred)' for slug and the reference to search-companies distinguish it from the search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: prefer slug over name, and use search-companies first when only a name is available and the exact slug is needed. That names the alternative and the condition that selects it, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-company-groupARead-onlyInspect
Resolve a named company group (e.g. "FAANG", "AI", "Fintech") into its list of company slugs, for use in the benchmark tools' companySlugs filter. Matching is case- and separator-insensitive. Omit "group" (or pass an unknown one) to get the list of available group names. Available groups: FAANG, AUTOMOTIVE, SPACE, SOCIAL_MEDIA, AI, AI_PLUS, FINTECH, FAANG_PLUS, HEDGE_FUNDS, SEMICONDUCTOR, BIOTECH, WEB3, TRADING_FIRMS, DEFENSE.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Company group name to resolve (e.g. "FAANG", "AI", "Fintech"). Case/separator-insensitive. Omit to list all available groups. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, closed-world lookup. The description adds meaningful behavior beyond that: matching is case- and separator-insensitive, unknown groups fall back to listing available groups, and the full set of available group names is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core resolve action comes first, followed by matching behavior, fallback behavior, and the available values. Every sentence contributes operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only lookup with no output schema, the description is complete: it explains the return value, the fallback behavior, case/separator insensitivity, and all available group names. An agent has enough information to call it correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds usable semantics beyond the schema by enumerating all available group names and clarifying the unknown-group fallback. It does not add new syntax detail, so it is slightly above baseline rather than fully exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: resolve a named company group into company slugs. It also names the downstream use case, the benchmark tools' companySlugs filter, which makes the tool's role distinct from sibling search/get tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to omit the group parameter or pass an unknown group to list available groups, and explains that the result is intended for the benchmark tools' companySlugs filter. This gives clear when-to-use and practical routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-company-levelsARead-onlyInspect
Get a company's INTERNAL level names for a job family, ordered by seniority (e.g. Google L3/L4/L5, Meta E3/E4/E5, Stripe IC1/IC2/IC3), with any alternate names per level. Use this FIRST when a question names a specific level at a specific company (e.g. "what does a Meta E5 make"), then call get-salaries-by-company-level. Returns an empty list with an explanation when the company has no known level structure. Free limit: Full level data for Amazon, Google, Microsoft, Meta and Apple. Other companies: level names only. Pass canonical slugs (jobFamilySlug, locationSlug, countrySlug, companySlug): resolve names first with search-job-families, search-locations and search-companies; never guess a slug. REQUIRED arguments: companySlug, jobFamilySlug.
| Name | Required | Description | Default |
|---|---|---|---|
| companySlug | Yes | The company (slug) whose internal level structure to list, e.g. "google", "meta", "stripe". Resolve a company name to its slug via search-companies first. | |
| jobFamilySlug | Yes | A Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/destructive, and the description layers on non-obvious behavior: alternate names are included per level, results are ordered by seniority, and an empty list with an explanation is returned when no level structure is known. It also discloses a free-tier data limit (full detail for Amazon/Google/Microsoft/Meta/Apple, names only elsewhere), which materially affects result interpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then sequencing, then limits, then slug discipline — dense and mostly waste-free. Minor slack: the trailing 'REQUIRED arguments: companySlug, jobFamilySlug' restates the schema, and the locationSlug/countrySlug mention is noise for a 2-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read with annotations and no output schema, the description covers purpose, ordering, return shape (names plus alternates), empty-result behavior, and data-coverage limits. Nothing needed to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real value by mandating canonical slugs and pointing at the resolver tools rather than allowing name input. It loses a point for referencing locationSlug and countrySlug, which are not parameters of this tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (internal level names per job family, ordered by seniority) and gives concrete examples of the naming convention it returns. It explicitly distinguishes itself from the sibling get-salaries-by-company-level, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing guidance: 'Use this FIRST when a question names a specific level at a specific company... then call get-salaries-by-company-level,' including a worked example query. It also names the prerequisite resolution tools (search-job-families, search-locations, search-companies) and forbids guessing slugs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-domain-knowledgeARead-onlyInspect
Get reference knowledge about the Levels.fyi data model, by topic: compensation, levels, vesting, company_groups, locations, job_families, enums, negotiation_coaching. Covers compensation concepts, the standard level ladder, vesting patterns, company groups, and how to resolve locations / job families / enums. negotiation_coaching describes Levels.fyi's offer negotiation coaching: use it only when the user asks for help negotiating. Omit "topic" to get every data-model topic.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Data-model topic to fetch. Omit to get all topics. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered by structured data. The description adds real behavior beyond that: the omit-topic fallback returns the union of all topics, and negotiation_coaching carries a usage restriction. It does not describe the shape of the returned reference material (format, size), which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the purpose, and the topic enumeration earns its length because it drives selection. There is mild repetition between the topic list and the follow-up 'Covers ...' sentence, which restates several entries rather than adding to them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter, single-enum reference tool with no output schema, the description covers what to fetch, what each value means, and the default behavior. The only missing piece is the form of the returned reference content, which an agent might want before deciding whether to fetch all topics at once.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description earns above that by annotating the enum values themselves — 'the standard level ladder', 'vesting patterns', 'how to resolve locations / job families / enums' — which the bare enum list does not convey. Some entries (enums, company_groups) are glossed only loosely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Get reference knowledge about the Levels.fyi data model') and immediately enumerates the eight topics, which signals a documentation/reference tool rather than an entity fetch. An agent can distinguish it from siblings like get-company or get-vesting-schedules without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit conditional for a delicate topic ('negotiation_coaching ... use it only when the user asks for help negotiating') and states the default ('Omit "topic" to get every data-model topic'). It stops short of routing against near neighbors such as get-metric-explanation or get-vesting-schedules, so no cross-tool preference is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-jobARead-onlyInspect
Get one job posting by its jobId from search-jobs: the full description as text, locations, work arrangement, employment type, the pay range the posting states, Levels.fyi's estimated total compensation by level for the role (USD; matchesThisPosting marks the level the posting is for), the company, the url of the Levels.fyi job page, and applyUrl to apply on the employer's site. REQUIRED arguments: jobId.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | A jobId from search-jobs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context by disclosing the shape of the response (full text, locations, pay range, Levels.fyi estimated comp with matchesThisPosting flag, applyUrl) — important since no output schema exists. It does not address failure modes for invalid or expired jobIds, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, and the field enumeration earns its space because there is no output schema to convey the return shape. The closing 'REQUIRED arguments' sentence is mildly redundant with the schema's required array, a small amount of waste in an otherwise tight description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by listing returned fields, including the non-obvious USD currency and the matchesThisPosting marker semantics. It is nearly complete for a one-parameter read tool; only error/expiry behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's schema description ('A jobId from search-jobs') already carries the meaning. The description's 'REQUIRED arguments: jobId' largely restates the schema's required list rather than adding syntax, format, or provenance detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one job posting by its jobId') and explicitly anchors it to the search-jobs sibling, so an agent can tell it apart from search-jobs without opening a schema. It goes further by enumerating the payload the tool returns, making the scope of the operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by its jobId from search-jobs' plus 'REQUIRED arguments: jobId' makes the intended workflow clear: search first, then fetch by id. It stops short of stating exclusions (e.g., what to do if the posting has expired or the id is stale), so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-job-familyARead-onlyInspect
Look up a job family by its slug and get its focus areas (specializations) with their titles, plus untagged titles. Use this to discover the focus tags and titles available within a role (e.g. to find focusTagSlugs for the benchmark tools). Use search-job-families first if you only have a name. REQUIRED arguments: jobFamilySlug.
| Name | Required | Description | Default |
|---|---|---|---|
| jobFamilySlug | Yes | A Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, destructive=false, and closed-world, so the safety profile is covered; the description adds what the call actually yields (focus areas with titles plus untagged titles). It does not say what happens with an unknown or malformed slug, which is a minor behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, all front-loaded with the core action before the discovery hint and the ordering guidance. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the work of explaining the return payload (focus areas, their titles, untagged titles) and the prerequisite lookup path. Only error/empty-result behavior for an invalid slug is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single string parameter and examples already listed in the schema. The description's "REQUIRED arguments: jobFamilySlug" restates the schema rather than adding meaning beyond "by its slug".
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Look up a job family by its slug and get its focus areas (specializations) with their titles, plus untagged titles" gives a specific verb, resource, and scope of returned content. It is clearly separable from the sibling search-job-families tool, which the description names explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a concrete downstream use case ("to find focusTagSlugs for the benchmark tools") and routes the agent to search-job-families when only a name is known. Both the when-to-use and the alternative are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-locationARead-onlyInspect
Look up one or more location slugs and get their details: name, type (country / metro-DMA / state), parent country, currency, and coordinates. Use search-locations first if you only have a name. Errors if any slug is invalid. REQUIRED arguments: locationSlugs. Array-typed arguments (locationSlugs) must be passed as arrays, even for a single value.
| Name | Required | Description | Default |
|---|---|---|---|
| locationSlugs | Yes | Location slug for the locations |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: it is all-or-nothing ('Errors if any slug is invalid'), meaning a single bad slug fails the whole batch, and it warns about array coercion for single values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return fields, then routing, then the failure mode and array rule — a sensible order with no filler. The 'REQUIRED arguments: locationSlugs' line largely repeats the schema's required array, so it is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with annotations covering safety and no output schema, the description covers return fields, error semantics, and input coercion. Minor gaps remain, such as any limit on how many slugs can be passed in one call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with an example, so the parameter is documented structurally. The description still adds meaning: it clarifies the parameter accepts 'one or more' slugs and that a single value must still be wrapped in an array — a real failure mode not stated in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (look up) and resource (location slugs by identifier) and enumerates exactly what is returned: name, type (country / metro-DMA / state), parent country, currency, coordinates. It also implicitly separates itself from the name-based search path by pointing to search-locations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use search-locations first if you only have a name,' giving a clear routing condition to the most confusable sibling. However, it does not distinguish itself from get-location-stats, another location sibling an agent could plausibly pick for detail-style queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-location-statsARead-onlyInspect
Get the top-paying locations for a job family within one country, ranked by median (p50) yearly total compensation in USD from submissions in the last 2 years. Returns up to 10 locations with their median. Use it to compare where a role pays most inside a country. Its window differs from get-salary-percentiles (the last 12 months), so the same location can show a different median: quote get-salary-percentiles for one location's pay. Free limit: Median (p50) total compensation for the top locations in one country. No company or level filter. Pass canonical slugs (jobFamilySlug, locationSlug, countrySlug, companySlug): resolve names first with search-job-families, search-locations and search-companies; never guess a slug. REQUIRED arguments: jobFamilySlug, countrySlug.
| Name | Required | Description | Default |
|---|---|---|---|
| countrySlug | Yes | A COUNTRY location slug, e.g. "united-states", "india", "united-kingdom". Resolve it with search-locations first; cities, metros and states are rejected. | |
| jobFamilySlug | Yes | A Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/destructive annotations: a 2-year lookback window that differs from the sibling's 12 months, a result cap of 10, USD currency, and the absence of company/level filters. It is docked slightly because the "Free limit:" sentence is garbled/truncated and the slug list references companySlug, which is not a parameter of this tool and could mislead an agent about available filters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose well, but the middle section is dense and repeats itself (ranking/window explained twice), and the "Free limit:" fragment is an incomplete sentence that reads as a copy-paste error. The companySlug mention is also dead weight for a 2-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read with readOnly annotations and no output schema, the description covers ranking metric, time window, currency, result cap and slug prerequisites — enough to call it correctly. Absent output schema, it partially compensates by saying what comes back (up to 10 locations with their median).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes further by insisting both parameters are required, that they be canonical slugs resolved via search tools rather than guessed, and that countrySlug must be a country (cities/metros/states rejected, which the schema also states). The stray companySlug reference is the only noise.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: top-paying locations for a job family within one country, ranked by p50 median yearly total comp in USD over the last 2 years, capped at 10 results. It also explicitly distinguishes itself from get-salary-percentiles, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the intended use ("compare where a role pays most inside a country") and names the alternative with the condition that selects it ("quote get-salary-percentiles for one location's pay"). It also gives a prerequisite workflow: resolve names with search-job-families / search-locations / search-companies and never guess a slug.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-metric-explanationARead-onlyInspect
Explain a Levels.fyi compensation metric or concept (e.g. "TC" / total_compensation, base salary, total_cash, tc_first_year, vesting, sign_on, target_bonus) — its meaning, formula, and caveats. Pass an unknown metric to get the list of known ones. REQUIRED arguments: metric.
| Name | Required | Description | Default |
|---|---|---|---|
| metric | Yes | Compensation metric or concept to explain, e.g. "TC", "total_compensation", "base", "vesting", "sign_on", "tc_first_year". Case/separator-insensitive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds non-obvious behavior beyond the annotations: an unrecognized metric returns the list of known metrics instead of erroring. It doesn't describe the shape of the explanation payload, but nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the metric list, then the unknown-metric fallback, then the required arg. Efficient overall; the trailing 'REQUIRED arguments: metric' heading is mildly redundant with the schema's required array.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only explainer with no output schema, the description says what the answer contains (meaning, formula, caveats) and how invalid input resolves, which is enough for an agent to call it correctly. Only a hint at the actual return structure is missing, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter's schema already documents examples and case/separator-insensitivity. The description reinforces this with a longer example set but contributes no additional syntax or matching rules beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Explain a Levels.fyi compensation metric or concept') plus the exact output content (meaning, formula, caveats), and enumerates concrete metric examples like 'TC', 'vesting', 'sign_on'. That scope cleanly separates it from lookup siblings such as get-vesting-schedules or get-domain-knowledge.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes the usage case explicit — call this to resolve what a metric means — and adds a concrete fallback path: 'Pass an unknown metric to get the list of known ones.' It doesn't explicitly name alternatives like get-domain-knowledge for broader concepts, so there is no stated exclusion, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-permissionsARead-onlyInspect
Connectivity check for the Levels.fyi MCP server. Returns "pong", echoes an optional message, and lists what each tool returns and the rate limits. Call it when a result looks smaller than expected, instead of retrying.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Optional text to echo back in the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely non-inferable behavior: the exact response token ('pong'), the echo of the optional message, and the fact that the response includes a table of per-tool outputs and rate limits — the latter is the key operational detail an agent could not guess.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: purpose first, response contents second, invocation guidance last. No filler, and the most decision-relevant instruction (when to call) is not buried. Minor deduction because the response-contents clause and the rate-limits clause are compressed into one run-on sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing returns — and it does, naming the ping token, the echoed message, and the tool/rate-limit listing. For a single-optional-param read-only diagnostic, that covers what an agent needs to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter, and schema description coverage is 100%, so baseline is 3. The description's 'echoes an optional message' merely restates what the schema already says without adding format, limits, or edge-case behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete function: a connectivity check for the Levels.fyi MCP server that returns "pong", echoes a message, and enumerates per-tool return shapes and rate limits. That is specific enough for an agent to act on, though it conspicuously diverges from the tool name 'get-permissions', which suggests permission retrieval rather than a health probe — the description has to correct the name rather than reinforce it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('call it when a result looks smaller than expected, instead of retrying'), which is a clear when-to-use directive with a named alternative behavior (retrying). It stops short of stating when NOT to call it or naming which sibling to prefer, but for a diagnostic tool the routing instruction is unusually actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-profileARead-onlyInspect
Get the signed-in user's own Levels.fyi career profile: current title, company, career level, job family, focus area, location, years of experience, skills, certifications and work history, plus the status of their resume (none, pending while it is being parsed, parsed, or failed) and when it was uploaded. Never returns contact details or the resume file. Use it to personalize answers about the user's own pay, level or career.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description adds real value beyond them: the enumerated return payload, resume parse-state values (none/pending/parsed/failed), and the privacy guarantee about contact details and resume files. It omits edge behavior such as what happens when no profile exists or the user is unauthenticated, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in the first clause, then the return payload, then usage. The long field enumeration is justified because there is no output schema, though the resume-status parenthetical is slightly wordy relative to its importance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates well by enumerating returned fields and resume status states. It lacks failure/empty-state behavior (no profile, not signed in, auth requirement), which an agent would need for a personal-data endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly does not invent parameter semantics for a no-arg call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and scoped resource: 'Get the signed-in user's own Levels.fyi career profile', then enumerates the returned fields (title, company, level, job family, focus area, location, YoE, skills, certifications, work history). No sibling tool overlaps with 'my own profile', and the 'Never returns contact details or the resume file' clause draws a clean boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use it: 'to personalize answers about the user's own pay, level or career.' It also states a scope exclusion (no contact details, no resume file). It does not name an alternative for adjacent needs (e.g. get-permissions, upload-resume for resume actions), so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-salaries-by-company-levelARead-onlyInspect
Get median (p50) yearly total compensation in USD for each of ONE company's internal levels (e.g. Google L3/L4/L5, Meta E3/E4/E5) for a job family in one location, from submissions in the last 12 months. Call get-company-levels first to learn the company's level names. The company must have a known level structure. Free limit: Total compensation per level for one company and job family. No percentiles or counts. Pass canonical slugs (jobFamilySlug, locationSlug, countrySlug, companySlug): resolve names first with search-job-families, search-locations and search-companies; never guess a slug. REQUIRED arguments: jobFamilySlug, locationSlug, companySlug.
| Name | Required | Description | Default |
|---|---|---|---|
| companySlug | Yes | A company slug, e.g. "google". Resolve it with search-companies first. | |
| locationSlug | Yes | One location slug (metro, state, country or region; not a city), e.g. "san-francisco-bay-area". Resolve it with search-locations first; for a city, use its parent metro. | |
| jobFamilySlug | Yes | A Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuinely new behavior: the 12-month lookback window, the requirement of a known level structure (a failure mode), and the free-tier limit that omits percentiles and counts. It does not say what an empty result looks like or how many levels are typically returned, which is the only meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by prerequisites, then limits, then slug resolution — a sensible priority order with no filler. The trailing 'REQUIRED arguments' sentence largely duplicates the schema's required array, which is the one redundant element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-slug read tool with no output schema, the description covers the data window, currency, metric definition (p50 of yearly total comp), the axis of aggregation (internal level), the free-tier truncation, and the full prerequisite/slug-resolution chain. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter's description already instructs resolving with search-companies, search-locations and its parent-metro rule. The description repeats that guidance and adds 'never guess a slug' plus a restatement of the required list, so it adds emphasis but little new semantic content beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: median (p50) yearly total compensation per internal company level, for one company, one job family, one location, over a 12-month window. It scopes itself against siblings by naming 'get-company-levels' as a prerequisite and ruling out 'percentiles or counts' (the domain of get-salary-percentiles). An agent can distinguish it from every other salary tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit preconditions and ordering: call get-company-levels first, the company must have a known level structure, and slugs must be resolved via search-job-families / search-locations / search-companies rather than guessed. It also names the sibling it is not (percentiles/counts), so the when-to-use versus alternatives is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-salary-percentilesARead-onlyInspect
Get the median (p50) yearly total compensation in USD for a job family in one location, across all levels, from submissions in the last 12 months. This is the figure to quote for one location's pay; get-location-stats ranks locations over a longer window, so its medians can differ. For one company's pay by level, use get-salaries-by-company-level instead. Free limit: Median (p50) total compensation for one job family in one location. No other percentiles, sample size, level split, or company, focus area or funding filters. Pass canonical slugs (jobFamilySlug, locationSlug, countrySlug, companySlug): resolve names first with search-job-families, search-locations and search-companies; never guess a slug. REQUIRED arguments: jobFamilySlug, locationSlug.
| Name | Required | Description | Default |
|---|---|---|---|
| locationSlug | Yes | One location slug (metro, state, country or region; not a city), e.g. "san-francisco-bay-area". Resolve it with search-locations first; for a city, use its parent metro. | |
| jobFamilySlug | Yes | A Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/non-destructive safety, so the description correctly spends its words elsewhere: the 12-month submission window, the free-tier ceiling listing what is NOT returned (other percentiles, sample size, level split, company/focus-area/funding filters), and the never-guess-a-slug rule. It stops short of describing the response shape or behavior when data is sparse, which is the remaining gap given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the definition, then alternatives, then limits, then slug rules — a sensible priority order with no filler. The "Free limit:" sentence restates the opening line almost verbatim before adding the exclusions, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read with no output schema, the description covers what is measured, the time window, currency, exclusions and slug prerequisites — enough to call it confidently. Missing edge-case behavior (empty results, sample-size thresholds) is the only shortfall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by adding the canonical-slug contract and naming the specific resolver tools (search-job-families, search-locations, search-companies) plus the 'never guess a slug' rule, which is operational guidance the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource with full scope: median p50 yearly total compensation in USD, one job family, one location, all levels, last 12 months. It explicitly distinguishes itself from get-location-stats and get-salaries-by-company-level, so an agent can pick it without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"This is the figure to quote for one location's pay" gives an affirmative use case, and the two sibling comparisons give explicit alternatives with the condition (longer window, per-company-by-level) that selects them. Prerequisite workflow (resolve slugs with the search tools first) is also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-salary-submission-by-idARead-onlyInspect
Get a single salary submission by its UUID: company, title, level, location, years of experience, offer date, base salary and total compensation. Every amount is in USD; originalCurrency is only the currency the salary was submitted in. Use the uuid from a search-raw-data-points row. Free limit: Base salary and total compensation only, in USD. REQUIRED arguments: uuid.
| Name | Required | Description | Default |
|---|---|---|---|
| uuid | Yes | The unique uuid of the salary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: a free-tier limit that returns only base salary and total compensation, and the USD normalization rule vs. originalCurrency. It could still clarify what happens when a UUID is unknown or the row is out of plan scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The return fields are front-loaded, followed by currency semantics and the free-tier caveat, so the most decision-relevant content comes first. The closing 'REQUIRED arguments: uuid' sentence is pure redundancy against the schema and slightly dilutes an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return shape — and it does, field by field, plus the currency semantics an agent would otherwise misread. Combined with the free-tier limitation and the uuid provenance, nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter at 100% schema coverage the baseline is 3, and the description earns above that by telling the agent where the uuid comes from (a search-raw-data-points row) rather than leaving the format unexplained. 'REQUIRED arguments: uuid' merely restates the schema's required array.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single salary submission by its UUID') and enumerates exactly what comes back: company, title, level, location, YoE, offer date, base and total comp. That field list clearly separates it from the aggregate siblings like get-salary-percentiles and get-salaries-by-company-level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use the uuid from a search-raw-data-points row' explicitly routes the agent to the sibling that produces the required identifier, which is the main usage decision for a by-id lookup. It doesn't state exclusions (e.g. when to prefer search-raw-data-points instead of this call), so it falls short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-vesting-schedulesARead-onlyInspect
Get equity vesting schedules for one or more companies, decoded into structured data: per-year vesting percent and frequency (cliff/quarterly/monthly), whether there's a 1-year cliff, whether it's backloaded (e.g. Amazon 5/15/40/40) / frontloaded / linear, plus a plain-English description and vesting type (RSU, options). Pass company slugs (use search-companies to resolve names first). REQUIRED arguments: companySlugs. Array-typed arguments (companySlugs) must be passed as arrays, even for a single value.
| Name | Required | Description | Default |
|---|---|---|---|
| companySlugs | Yes | Company slugs to fetch vesting schedules for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds useful context about the shape of the decoded output (cliff detection, backloaded patterns like 5/15/40/40, plain-English description), but says nothing about failure modes, unknown slugs, or rate/volume limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded with the output contract first, then the input requirement and the array-shape caveat. It runs long in a single block and mixes return-value detail with invocation rules, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, no output schema, and no nested objects, the description compensates well by describing the returned vesting fields in detail so the agent needn't guess. It lacks coverage of edge cases (missing/unknown slugs, multiple companies returned in what container), which keeps it from full marks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is typed as an array with an example, so the description's array-must-be-array reminder mostly restates the schema. The one genuine addition is that values are company slugs resolvable via search-companies, which gives the agent a source for valid values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Get equity vesting schedules') and enumerates exactly what is returned (per-year percent, frequency, cliff, back/front/linear loading, RSU vs options). It does not distinguish itself from the sibling search-companies-by-vesting, which sounds like an adjacent capability, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite/workflow: 'Pass company slugs (use search-companies to resolve names first)', which is real routing guidance to another tool. It stops short of saying when to prefer this over search-companies-by-vesting or what to do when a slug yields no data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-allARead-onlyInspect
Search across ALL entity types at once (companies, job families, job titles, focus tags, locations, and industries) by passing searchText (required) and get a single ranked list, each result tagged with its type and slug/id. Use this when you don't yet know which track an entity belongs to, or to disambiguate an ambiguous name; once the type is known, prefer the type-specific tools (search-companies, search-job-titles, search-locations, search-job-families, search-focus-areas) for tighter results. If a match is found under a DIFFERENT entity type than the user expected, do not silently substitute it — surface that mismatch and confirm with the user before proceeding. REQUIRED arguments: searchText.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (1–15). | |
| searchText | Yes | Free-text query to search across all entity types (companies, job families, job titles, focus tags, locations, industries). | |
| excludeFamilyLikeTitles | No | When true, exclude TITLE results that are effectively the same as their job family. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint, so the safety profile is covered. Beyond that, the description discloses that results come as a single ranked list with each item tagged by type and slug/id, and mandates surfacing entity-type mismatches to the user instead of silently substituting — a non-obvious behavioral constraint not present in any structured field. It stops short of describing empty-result or pagination behavior, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the scope and entity list, followed by routing guidance and then the mismatch rule. The first sentence is dense with parenthetical enumerations, but every clause carries decision-relevant information and nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema available, the description supplies exactly the missing piece — the shape of the return value (single ranked list, type- and slug-tagged) — plus routing guidance across a 27-tool sibling set. An agent has everything needed to call it and to interpret or escalate its results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, searchText, and excludeFamilyLikeTitles semantics. The description only restates that searchText is required and enumerates the covered entity types; it adds nothing about the limit range or the excludeFamilyLikeTitles flag beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search across ALL entity types'), enumerates every entity type covered, and explicitly contrasts itself with the type-specific search siblings. An agent can distinguish it from search-companies or search-job-titles without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('you don't yet know which track an entity belongs to, or to disambiguate an ambiguous name') and a when-to-prefer-alternative rule naming five concrete sibling tools. It even prescribes a workflow for the cross-type mismatch case, which is a genuine routing decision left to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-companiesARead-onlyInspect
Search companies using searchText input (required) and get their Levels.fyi slugs. Use this FIRST to resolve a company name (e.g. "Google", "Meta") into the slug that the benchmark tools require in their companySlugs filter. Also matches former names and aliases, so a renamed company is found under its old name. Returns an array of { name, slug } matches. If this returns no matches, fall back to search-all, which searches every entity type and applies a fuzzy fallback. REQUIRED arguments: searchText.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (1–15). | |
| searchText | Yes | Company name to search for, current or former (e.g. "Google", "Pure Storage"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds non-obvious behaviors the annotations cannot: alias/former-name matching and the exact return shape ({ name, slug }). Minor gaps remain (no mention of the limit ceiling behavior here), keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the slug-resolution rationale, then layers fallback guidance and return shape in a logical order. Slightly wasteful: the closing 'REQUIRED arguments: searchText' duplicates the schema's required field.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating the exact return type (array of { name, slug }) plus empty-result behavior. For a two-parameter lookup tool, everything needed to call it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already describes searchText as accepting current or former names, so the description largely repeats structured data. It does reinforce that searchText is required, but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search companies') plus the concrete output ('Levels.fyi slugs'), and distinguishes itself from search-all by naming the fallback sibling. An agent can tell immediately what this returns and why slugs matter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs 'Use this FIRST' as the resolution step before benchmark tools, and states the fallback condition ('If this returns no matches, fall back to search-all'). Both when-to-use and the alternative path are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-companies-by-vestingARead-onlyInspect
Find companies by their equity vesting characteristics: vesting/equity type (e.g. "RSU"), vesting shape (frontloaded, backloaded like Amazon, linear, one/two/three_year, or extended 5+ years), total years, and whether there's a 1-year cliff. Returns matching companies (most data-rich first) with their decoded vesting schedules.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max companies to return (1–50). | |
| hasCliff | No | Filter by whether the schedule has a 1-year cliff. | |
| maxYears | No | Maximum total vesting years. | |
| minYears | No | Minimum total vesting years. | |
| vestingType | No | Filter by vesting/equity type substring, e.g. "RSU", "Stock Options". | |
| vestingPattern | No | Filter by vesting shape: frontloaded, backloaded (e.g. Amazon), linear (equal each year), one_year / two_year / three_year (total length), or extended (5+ years). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real value with the ranking rule ('most data-rich first') and the fact that decoded vesting schedules are returned, but says nothing about how filters combine (AND vs OR) or default result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the filter dimensions and the return behavior front-loaded; nothing wasted. Slight overlap with the schema enum is acceptable given the compactness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does explain the return shape and ordering. However, for a six-parameter search tool it leaves open the key calling questions: filter conjunction semantics and behavior with no filters applied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description largely restates the enum values already in the schema, adding only a modest hint ('backloaded like Amazon') that clarifies an otherwise opaque enum member.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find companies') scoped to equity vesting characteristics, and enumerates the filter axes (type, shape, years, cliff). This separates it in spirit from the generic search-companies and get-vesting-schedules siblings, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the filter list: use it when you want companies filtered by vesting traits. There is no explicit statement of when to prefer search-companies or get-vesting-schedules instead, and no note on what happens if all six optional filters are omitted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-focus-areasARead-onlyInspect
Search focus tags (specializations within a role, e.g. "mobile-ios-android", "ml-ai", "devops", "security") using searchText input (required) and get their slugs. Use this to resolve a specialization into the focusTagSlugs the benchmark tools accept. Returns matching focus tags with their slugs. If this returns no matches, fall back to search-all, which searches every entity type and applies a fuzzy fallback. REQUIRED arguments: searchText.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (1–15). | |
| searchText | Yes | Focus tag / specialization name to search for (e.g. "mobile", "ml", "devops"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavior beyond that: it returns matching tags with slugs and returns no matches when nothing hits, triggering the search-all fallback. It doesn't mention pagination or the limit default, but with annotations carrying the safety context this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the slug-resolution use case, then the fallback. Mild waste from restating the requirement twice ('searchText input (required)' and 'REQUIRED arguments: searchText'), which the schema already enforces, but no sentence obscures the key routing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating the return shape (matching focus tags with their slugs). The limit parameter's effect on result count is left to the schema, which documents it, so an agent has enough to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including the 'focus tag / specialization name' phrasing and the 1–15 limit range. The description repeats that searchText is required and gives examples, which is redundant with the schema rather than additive, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (search focus tags), defines what a focus tag is with concrete examples, and states what the caller gets back (slugs). It is clearly distinguishable from the sibling search-* tools, which search companies, jobs, locations, and so on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('resolve a specialization into the focusTagSlugs the benchmark tools accept') and what to do when it fails ('fall back to search-all, which searches every entity type and applies a fuzzy fallback'). Both the primary case and the fallback route are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-job-familiesARead-onlyInspect
Search job families / roles using searchText input (required) and get their Levels.fyi slugs. Use this to resolve a role name (e.g. "software engineer", "product manager", "data scientist") into the jobFamilySlug the benchmark tools require. Returns matching job families with their slugs. A specific title (e.g. "UX designer") is not a job family: if this returns no matches, use search-role-terms, which returns the title with its job family slug, then search-all. REQUIRED arguments: searchText.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (1–15). | |
| searchText | Yes | Job family / role name to search for (e.g. "software engineer", "product"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral value by explaining the slug-resolution outcome and the no-match routing chain. It doesn't cover result ordering or whether matching is fuzzy/substring, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded with purpose, then usage, then fallback. The trailing 'REQUIRED arguments: searchText' is redundant with the schema's required array and slightly restates earlier content, but overall the text earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only search with no output schema, the description supplies what matters: what is returned (matching job families with slugs), why it matters (benchmark tools need the slug), and what to do on empty results. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented with examples and the 1–15 limit bound. The description only restates that searchText is required and gives role-name examples already present in the schema. Baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search job families/roles) and its output (Levels.fyi slugs), then distinguishes itself from search-role-terms and search-all by naming each. An agent can tell exactly what this returns versus its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (resolving a role name into a jobFamilySlug that benchmark tools require) and gives a concrete fallback path: if no matches, go to search-role-terms, then search-all. It even warns that specific titles like 'UX designer' are not job families.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-jobsARead-onlyInspect
Search open jobs on Levels.fyi, with the pay range each posting states. Returns { jobs, totalMatchingJobs, nextOffset }; each job has its title, company, locations, work arrangement, posting date, pay range, url (the Levels.fyi job page) and applyUrl.
Simplify the user's request to role names and terms that appear in job posts. Pass at most one location per call, and only one the user named: resolve it with search-locations, and never use the user's own position. Resolve companies and job families with search-companies and search-job-families. If nothing matches, widen the search (drop a filter or simplify the query) and try once more; if there's still nothing, say so rather than listing unrelated jobs.
When the user asks for jobs without saying which role, offer to search from their Levels.fyi profile. If they agree, call get-profile and draft the query from its title, job family and location (locationSlug). Before searching, show the user the values you will use and ask them to confirm or change them: a profile describes the job they have, not necessarily the one they want next. Do not call get-profile without asking.
Results come up to 2 jobs per company; limit counts companies, except with a single companySlug, where it counts jobs. A page can hold fewer than limit; keep paging while nextOffset is not null. Put each job's url on its title and keep URLs complete. When the client shows results as cards, do not list them again in text: summarise the patterns instead. Call get-job for a posting's full description. REQUIRED arguments: query. Array-typed arguments (e.g. companySlugs, jobFamilySlugs) must be passed as arrays, even for a single value.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Companies per page (default 10, max 25). Each returns up to 2 jobs; with one companySlug it is jobs per page. | |
| query | Yes | Role names and terms that appear in job posts, e.g. "backend engineer" or "product designer fintech". Simplify the user's words; leave out locations and salary. | |
| offset | No | Pass the previous result's nextOffset to get the next page. | |
| sortBy | No | relevance | |
| companySlugs | No | Company slugs from search-companies, at most 5. | |
| locationSlug | No | One location slug from search-locations (city, metro, state or country). Only a location the user named. | |
| jobFamilySlugs | No | Job family slugs from search-job-families, at most 10. | |
| standardLevels | No | ||
| employmentTypes | No | ||
| postedWithinDays | No | Only jobs posted in the last N days. | |
| workArrangements | No | ||
| minBaseCompensation | No | Minimum base salary, compared with the top of the posting's range as posted (most postings are USD). | |
| minMedianTotalCompensation | No | Minimum total compensation, compared with the top of the posting's range. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive annotations, it discloses the non-obvious result cap of 2 jobs per company, the fact that limit counts companies unless a single companySlug is supplied, that a page may hold fewer than limit, and how to page via nextOffset. Those are exactly the behaviors an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded — purpose, return shape, then procedural rules — with no filler sentences. It is long for a description, and a few presentation directives (putting url on the title, card-dedup guidance) sit at the same weight as core search logic, but each rule is actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with no output schema, the description supplies the return shape itself ({ jobs, totalMatchingJobs, nextOffset } and per-job fields), query-construction rules, filter-resolution dependencies, pagination, and failure handling. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 69%, and the description adds real meaning on top: array-typed arguments must be passed as arrays even for one value, locationSlug is single-valued and only for user-named locations, and query should be stripped of locations, salary and the user's own position. It leaves the enum-bearing params (standardLevels, employmentTypes, workArrangements) entirely to the schema, which is acceptable but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource — 'Search open jobs on Levels.fyi' — plus the differentiator that results carry pay ranges. It also names the sibling it is not ('Call get-job for a posting's full description'), so an agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: resolve locations via search-locations, companies via search-companies, job families via search-job-families, and only one user-named location. It also covers the empty-result case (widen and retry once, then report honestly) and the profile-derived search flow, including the prohibition on calling get-profile without asking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-job-titlesARead-onlyInspect
Search specific job titles by name. Each result includes its id (the titleId the benchmark tools accept in the jobTitleIds filter) and its parent job family, so use this to narrow a benchmark query to an exact title (e.g. "Forward Deployed Software Engineer") within a job family. Set excludeFamilyLikeTitles to drop titles that are effectively just the job family. If this returns no matches, fall back to search-all, which searches every entity type and applies a fuzzy fallback. REQUIRED arguments: searchText.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (1–15). | |
| searchText | Yes | Job title to search for (e.g. "forward deployed engineer", "iOS engineer"). | |
| excludeFamilyLikeTitles | No | When true, exclude titles that are effectively the same as their job family. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint=true, openWorldHint=false, destructiveHint=false), so the description doesn't need to restate safety. It adds real context beyond that: the shape of each result (id + parent job family), how callers should use that id downstream, and the no-match behavior. It doesn't mention result limits or ordering, which would make it a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then result shape, then the tuning flag, then the fallback — a logical order with no wasted sentences. The trailing 'REQUIRED arguments: searchText' line is redundant with the schema and costs it a point, as does the slightly nested parenthetical about jobTitleIds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns, and it does name the two fields that matter (id and parent job family). For a 3-parameter read tool with full schema coverage and clear annotations, this is close to complete; only the remaining result fields and ordering/limit behavior are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit, searchText, and excludeFamilyLikeTitles are all documented in the schema. The description reinforces the exclusion flag's intent and the 'REQUIRED arguments: searchText' note, but that largely repeats the schema's required array rather than adding new semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Search specific job titles by name') that immediately distinguishes it from siblings like search-jobs and search-job-families. It also explains what the result is for: the id is the titleId consumed by the benchmark tools' jobTitleIds filter, so an agent knows exactly which tool family this feeds.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage: use this to narrow a benchmark query to an exact title within a job family, plus a named fallback ('If this returns no matches, fall back to search-all, which... applies a fuzzy fallback'). It also states when to set excludeFamilyLikeTitles, so both the happy path and the failure path are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-locationsARead-onlyInspect
Search locations (countries, metro areas / DMAs, and US states) using searchText input (required) and get their Levels.fyi slugs. Use this to resolve a location name (e.g. "San Francisco", "United States") into the slug the benchmark tools require in their locationSlugs filter. Each result includes its location type. Optionally restrict to one type. Without a type, a name that matches no country, metro or state is searched as a city: each city comes with its parent location (a metro, or the country where there is none), which is the slug to pass to the pay tools. Several places can share a name: pick the one the user means from context, and ask if unsure. If this returns no matches, fall back to search-all, which searches every entity type and applies a fuzzy fallback. REQUIRED arguments: searchText.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Restrict results to one location type. Omit to search countries, metros (DMAs), and states together. Cities are only returned with type "city". | |
| limit | No | Max results to return (1–15). | |
| searchText | Yes | Location name to search for (country, metro area / DMA, or US state). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-destructive, and the description adds non-obvious behavior on top: omitting type searches countries/metros/states but never cities, city results carry a parent location whose slug is what the pay tools consume, and ambiguous names may match multiple places. These are exactly the traits an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and slug-resolution rationale before the fallback and ambiguity rules. Mostly earned length, though the trailing 'REQUIRED arguments: searchText' line duplicates the schema's required array and could be dropped.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing what results contain (location type) and the city-plus-parent shape that determines which slug to forward. Combined with the fallback path and the ambiguity guidance, an agent has everything needed to call it and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so type, limit, and searchText are already documented in the schema with an enum and range. The description restates 'REQUIRED arguments: searchText' without adding syntax or format guidance, and never mentions limit. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search), an explicit resource set (countries, metro areas / DMAs, US states, plus city fallback), and the returned artifact (Levels.fyi slugs). It distinguishes itself from get-location (single lookup) and search-all by naming the latter as the fallback.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (resolve a name into the slug the benchmark tools need), how to narrow with the optional type, and what to do on zero results (fall back to search-all, which applies a fuzzy fallback). It also gives disambiguation policy: pick the place the user means from context, ask if unsure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-raw-data-pointsARead-onlyInspect
Get the newest individual salary submissions for a job family, optionally narrowed to one location and/or one company. Each row has the company, title, level, location, years of experience, base salary and total compensation. Every amount is in USD; originalCurrency is only the currency the salary was submitted in. Returns { total, rows }; total counts matches up to 250, and only the newest rows are returned. Free limit: The 3 newest submissions, with base salary and total compensation only. No text search, level, years-of-experience, sort or paging. Pass canonical slugs (jobFamilySlug, locationSlug, countrySlug, companySlug): resolve names first with search-job-families, search-locations and search-companies; never guess a slug. REQUIRED arguments: jobFamilySlug.
| Name | Required | Description | Default |
|---|---|---|---|
| companySlug | No | A company slug, e.g. "google". Resolve it with search-companies first. | |
| locationSlug | No | One location slug (city, metro, state, country or region), e.g. "san-francisco-bay-area". Resolve it with search-locations first. | |
| jobFamilySlug | Yes | A Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/non-destructive, which is the low bar; the description adds substantive behavior the agent could not infer: results are capped at 250 matches, only the newest rows are returned, the free tier returns just the 3 newest submissions with base salary and total compensation only, and every amount is normalized to USD with originalCurrency being merely the submission currency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then proceeds through output shape, limitations, free-tier limits and slug prerequisites in a logical order. It is dense and somewhat long, but essentially every sentence carries operational information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape ({ total, rows }) and names the row fields, plus the 250-match cap and newest-only behavior. Combined with the free-tier caveat and required-argument note, nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already states the slug format and names the resolver tools for each parameter, so the description's 'pass canonical slugs' and 'resolve names first' guidance largely echoes structured data. It adds marginal value via the 'REQUIRED arguments: jobFamilySlug' restatement, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: the newest individual salary submissions for a job family, with optional location/company narrowing. The phrase 'individual salary submissions' implicitly separates it from aggregate tools like get-salary-percentiles or get-salaries-by-company-level, but it never names or contrasts those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists what is NOT supported (no text search, level, years-of-experience, sort or paging), states the prerequisite resolution workflow via search-job-families / search-locations / search-companies, warns 'never guess a slug', and flags the free-tier restriction. An agent knows both when to call this and when it cannot satisfy the request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-role-termsARead-onlyInspect
Resolve a role term by searching job families, job titles, and focus tags TOGETHER in one call. Use this when you're unsure whether a term (e.g. "ML engineer", "mobile", "SRE") is a job family, a specific title, or a specialization — each result is tagged with its type and slug so you can feed the right one to the benchmark tools. REQUIRED arguments: searchText.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (1–15). | |
| searchText | Yes | Role term to resolve across job families, titles, and focus tags. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint=false, and destructiveHint=false, so safety is covered. The description adds real value beyond that by disclosing the shape of results: each hit is tagged with its type and slug. It does not discuss result volume, ranking, or empty-result behavior, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the capability, then the selection heuristic, then the payoff. No filler and no repetition of schema details beyond the single required-flag note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 params, 100% schema coverage) and read-only, so the bar is modest. The description nonetheless compensates for the absent output schema by explaining that results carry type and slug tags, which is exactly the information an agent needs to act on the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in-schema, so baseline is 3. The description adds only the required-argument callout for searchText, which merely restates the schema's required list, and says nothing extra about how limit interacts with the result set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (resolve) plus a named resource set (job families, job titles, focus tags) and the distinctive scope: searched TOGETHER in one call. That framing separates it immediately from the single-type siblings search-job-families, search-job-titles, and search-focus-areas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection condition — "use this when you're unsure whether a term ... is a job family, a specific title, or a specialization" — and contrasts it against the single-type searches via "TOGETHER in one call." It also states the downstream purpose ("feed the right one to the benchmark tools"), so the agent knows what to do with the output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search-top-companiesARead-onlyInspect
Get the top-paying companies for a job family within one country, ranked by median (p50) yearly total compensation in USD. Returns up to 10 companies with their median. Companies with too few submissions are left out. Free limit: Median (p50) total compensation for the top companies in one country. No sample size, level or years-of-experience filter. Pass canonical slugs (jobFamilySlug, locationSlug, countrySlug, companySlug): resolve names first with search-job-families, search-locations and search-companies; never guess a slug. REQUIRED arguments: jobFamilySlug, countrySlug.
| Name | Required | Description | Default |
|---|---|---|---|
| countrySlug | Yes | A COUNTRY location slug, e.g. "united-states", "india", "united-kingdom". Resolve it with search-locations first; cities, metros and states are rejected. | |
| jobFamilySlug | Yes | A Levels.fyi job family slug, e.g. "software-engineer", "product-manager", "data-scientist". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and closed-world safety, and the description adds real behavior: the result is capped at 10 companies, companies with too few submissions are silently excluded, values are USD medians, and a free-tier limit applies. The 'Free limit' sentence is garbled and never states what the paid tier unlocks, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded well with the core behavior in the first two sentences, but 'Median (p50) total compensation' is repeated, the required-arguments line duplicates the schema's required array, and the free-limit sentence is fragmented mid-description. Roughly a third of the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the necessary work by stating the return shape (up to 10 companies plus their median), the currency, and the exclusion rule for thin data. Missing only minor details such as what identifies each company and whether ordering ties are broken.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters already carry examples plus the city/state rejection rule, so the schema does the heavy lifting. The description only restates that jobFamilySlug and countrySlug are required and repeats the slug-resolution advice, adding little semantic meaning beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the top-paying companies'), the scope (one job family, one country), the ranking key (median p50 yearly total compensation in USD) and the result cap (up to 10). This is clearly distinguishable from search-companies (slug lookup) and get-company-levels (per-level data) 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says slugs must be resolved first via search-job-families, search-locations and search-companies, and warns 'never guess a slug' — a concrete prerequisite. It also names what is NOT supported (no sample size, level or years-of-experience filter), but stops short of routing the agent to the alternative tool for those needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send-feedbackAInspect
Report wrong or missing Levels.fyi data, or a missing feature, to the Levels.fyi team. Call it only after telling the user what you will send and getting their agreement. Never include personal details; contactEmail only when the user wants a reply and gives it. Returns { received, id }. REQUIRED arguments: kind, message.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What the report is about. | |
| message | Yes | What is wrong or missing, in the user’s words. No personal details. | |
| toolName | No | The tool whose result the report is about. | |
| companySlug | No | The company the report is about, as a slug. | |
| contactEmail | No | Only when the user wants a reply and gives this address. | |
| locationSlug | No | The location the report is about, as a slug. | |
| jobFamilySlug | No | The job family the report is about, as a slug. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-idempotent, non-destructive write; the description adds the real behavioral burdens: mandatory user consent before sending, a hard prohibition on personal details, a conditional rule for contactEmail, and the return shape { received, id }.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then consent, then privacy, then return value — a good order with no filler. The final 'REQUIRED arguments' sentence is redundant with the schema's required array and is the one line that does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter write tool with full schema coverage and no output schema, everything an agent needs is present: consent gate, privacy constraint, conditional email, and the response shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is already documented, so the baseline is 3. The description's restatement of the required arguments (kind, message) is redundant, and its contactEmail rule largely duplicates the schema's own description, adding only the privacy framing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and object: report wrong/missing Levels.fyi data or a missing feature to the Levels.fyi team. It is clearly distinguishable from the many read-oriented siblings and from add-salary-submission, which is a data contribution rather than a feedback report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition: only call after telling the user what will be sent and receiving agreement. It does not, however, route between alternatives (e.g., telling the agent to use add-salary-submission instead when the user wants to supply missing salary data).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload-resumeADestructiveIdempotentInspect
Add or replace the signed-in user's resume on Levels.fyi. Call this only when the user asks to upload their resume. Before you call, tell the user Levels.fyi uses it to fill in their profile and match them with jobs and recruiters. Never upload a resume for another person.
Accepts a PDF (at most 5 pages) or a DOCX, at most 4.5 MB. Set fileType from the file's actual extension: the upload must be a file of that format, or it cannot be read. Returns two ways to upload:
upload: a presigned S3 upload that expires in 10 minutes. Use it only if you can read the user's file and make HTTP requests yourself, e.g. a terminal agent with the file on disk: send an HTTP POST with multipart/form-data to upload.url, with every entry of upload.fields as form fields, followed by the file in a field named "file". A 201 response means it worked; a larger file is refused.
webUploadUrl: otherwise, give the user this link to upload the file themselves after signing in. Never paste the resume's text or contents anywhere else.
The resume is parsed in the background, usually within a couple of minutes. Call get-profile afterwards to check it; until parsing finishes, it can still show the previous resume. REQUIRED arguments: fileType.
| Name | Required | Description | Default |
|---|---|---|---|
| fileType | Yes | The resume file's format: "pdf" or "docx". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true; the description goes well beyond them by disclosing that the previous resume is replaced, that parsing happens in the background and can take a couple of minutes, that upload URLs expire in 10 minutes, and that a 201 response is the success signal. It also states a consent obligation ('tell the user Levels.fyi uses it to fill in their profile and match them with jobs') that no annotation carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then constraints, then the two upload paths as bullets, then post-call behavior. The trailing 'REQUIRED arguments: fileType' restates the schema's required array and earns nothing, and the size/format limits are split between paragraph and bullet, but overall the density is justified by the operational detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return contract itself — and it does, explaining both the presigned S3 payload structure (url, fields, 'file' part), the 201 success signal, and the web fallback. Size limits, page limit, expiry, async parsing, and the verification step are all covered; nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum is self-documenting, but the description still adds real meaning: fileType must be set from the file's actual extension, and a mismatch means the file cannot be read. It also supplies the operational constraints the enum cannot express (PDF at most 5 pages, DOCX or PDF, at most 4.5 MB).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair and resource: 'Add or replace the signed-in user's resume on Levels.fyi.' No sibling tool touches resumes, and the account scoping ('signed-in user's') is stated explicitly, so there is no ambiguity about which tool handles this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Call this only when the user asks to upload their resume'), an explicit prohibition ('Never upload a resume for another person'), and a decision rule between the two upload paths (presigned S3 only if the agent can read the file and make HTTP requests; otherwise hand off webUploadUrl). It also names the follow-up tool: 'Call get-profile afterwards to check it.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
30 tool updates
- First observed
add-salary-submission - First observed
get-available-filters - First observed
get-company - First observed
get-company-group - First observed
get-company-levels - First observed
get-domain-knowledge - First observed
get-job - First observed
get-job-family - First observed
get-location - First observed
get-location-stats - First observed
get-metric-explanation - First observed
get-permissions - First observed
get-profile - First observed
get-salaries-by-company-level - First observed
get-salary-percentiles - First observed
get-salary-submission-by-id - First observed
get-vesting-schedules - First observed
search-all - First observed
search-companies - First observed
search-companies-by-vesting - First observed
search-focus-areas - First observed
search-job-families - First observed
search-job-titles - First observed
search-jobs - First observed
search-locations - First observed
search-raw-data-points - First observed
search-role-terms - First observed
search-top-companies - First observed
send-feedback - First observed
upload-resume
Related MCP Connectors
H1B visa salary disclosures + compensation benchmarks — real numbers, not estimates.
Search open jobs, track new and closed roles, and get salaries on Greenhouse, Ashby, Lever, Workday.
Live healthcare pay data: advertised ranges by role/state/city, offer checks, transparency scores.
Tech job market intelligence: jobs, companies, salaries, skill velocity, hiring trends.
Related MCP Servers
- AlicenseAqualityCmaintenanceLive tech-hiring intelligence for AI agents. Search 130K+ open jobs collected daily from ~500 tech companies' own career sites â plus company hiring profiles, tech stacks, salary benchmarks, and skill trends. Five tools work with no account.3171 npmMIT
- AlicenseAqualityBmaintenanceEnables querying open job postings directly from company applicant-tracking systems (Greenhouse, Ashby, Lever), finding a company's job board, listing and comparing roles, and accessing salary data, all without scraping or API keys.335 PyPI1MIT
- AlicenseNot gradedqualityCmaintenanceUS + EU salary benchmarking, pay transparency compliance, and semantic endpoints. 1,400+ US occupations, 28 EU countries. MCP server for AI agents.MIT
- FlicenseNot gradedqualityDmaintenanceEnables querying real disclosed salary data across 20 regions, with tools to search jobs, retrieve salary statistics, and find similar roles.-
Glama MCP Gateway
Add one secure layer between your agents and this server.