Skip to main content
Glama

Levels.fyi

upload-resume

DestructiveIdempotent

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.

Input Schema

NameRequiredDescriptionDefault
fileTypeYesThe resume file's format: "pdf" or "docx".

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

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

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

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.