Koskamo

theluckystrike MCP Resume and Cover Letter

Generates tailored Word resumes and cover letters from a stored profile, performing keyword gap analysis against job postings without inventing facts. It supports multiple styles and exports, allowing users to apply to postings efficiently while maintaining factual accuracy.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

theluckystrike MCP Resume and Cover Letter logo, by theluckystrikeCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by theluckystrike
You need:Free tokens allow 600 calls an hourPro key 6000a token lasts 30 days from last use
MCP endpoint (Streamable HTTP)
https://mcp.zovo.one/mcp/resume
Vendor documentation

What its tools do

13 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

13 of 13 have a description · 13 of 13 declare behavior hints · 2 of 11 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Tailor a resume to a specific job posting
  • Generate a cover letter from stored profile
  • Analyze keyword gaps between CV and job description

Source and maintenance

Community listingRegistry 0.23.0
Maintenance checked

Protocol and capabilities

Server
mcp-resume 0.22.6
MCP protocol negotiated in check
2025-11-25
Tools
13 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Resume and cover letter writing from one stored CV profile. It covers contact details, summary, skills, roles, education, certifications and languages, resumes as .docx, markdown or printable HTML within a page budget, reading an existing .docx resume, one-page cover letters, and keyword gap analysis against a job posting that only reorders facts the user already stated. McpStamp's hosted service has no file system, so existing documents arrive as base64 uploads or public URLs and are kept per user account. The free tier allows 3 cover letters a month. One lifetime key unlocks this server and all 58 others: https://mcp.zovo.one/buy/bundle?src=instr.resume

Tools

13 advertised

profile_set — Store your CV facts
Advertised by the server during the last successful anonymous check.

Store the profile every resume and cover letter is built from: contact details, summary, skills, roles with bullets, education, certifications and languages. Returns a count of what was stored.

profile_set input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "description": "Your own name. Leave it out and the shared business profile's name is used, so you are never asked for a name the suite already holds"
    },
    "email": {
      "type": "string",
      "description": "Your own email address. Leave it out and the shared business profile's email is used; with neither, letters and letterheads show \"[add: email]\" and say so. Never invent one"
    },
    "links": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Portfolio, LinkedIn, GitHub"
    },
    "merge": {
      "type": "boolean",
      "description": "Update the stored profile: fields you pass replace their stored value, fields you leave out are kept. Required when a profile already exists, unless you pass replace"
    },
    "phone": {
      "type": "string",
      "description": "Your own phone number. Defaults to the shared business profile's phone"
    },
    "skills": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "replace": {
      "type": "boolean",
      "description": "Discard the stored profile and store exactly what this call carries. Required when a profile already exists, unless you pass merge"
    },
    "summary": {
      "type": "string",
      "description": "Two or three lines. Used verbatim as the fit paragraph of a cover letter."
    },
    "variant": {
      "type": "string",
      "description": "Name a second profile, e.g. \"backend\". One profile per data directory on the free tier; named variants are Pro only."
    },
    "location": {
      "type": "string"
    },
    "education": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "school",
          "degree"
        ],
        "properties": {
          "end": {
            "type": "string"
          },
          "start": {
            "type": "string"
          },
          "degree": {
            "type": "string",
            "minLength": 1
          },
          "school": {
            "type": "string",
            "minLength": 1
          }
        },
        "additionalProperties": false
      },
      "default": []
    },
    "languages": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "experience": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "company",
          "title",
          "start",
          "bullets"
        ],
        "properties": {
          "end": {
            "type": "string",
            "description": "Leave out for a current role; it prints as \"present\""
          },
          "start": {
            "type": "string",
            "minLength": 1,
            "description": "As you want it printed: \"2021\" or \"Jan 2021\""
          },
          "title": {
            "type": "string",
            "minLength": 1
          },
          "bullets": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What you did, one line each. Facts only: everything else in this server refuses to state anything that is not here."
          },
          "company": {
            "type": "string",
            "minLength": 1
          }
        },
        "additionalProperties": false
      },
      "default": [],
      "description": "Roles in any order you like -- profile_set sorts and stores them newest-first (an open role with no `end` first, then by `end` descending, then by `start` descending) before saving, since page-budget trimming and cover-letter bullet ranking both trust array order to mean recency."
    },
    "accent_color": {
      "type": "string",
      "description": "Letterhead colour, six hex digits, e.g. 1F3864. Pro only."
    },
    "certifications": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
profile_set annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
profile_get — Show the stored profile
Advertised by the server during the last successful anonymous check.
Advertised read-only

Return the stored CV profile exactly as resume_create, cover_letter_create and tailor_to_job will use it, plus the variant read and every stored variant name. Call it before any rewrite.

profile_get input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "variant": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
profile_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
resume_create — Write a resume .docx
Advertised by the server during the last successful anonymous check.

Call this tool to write the stored profile to a Word .docx. Returns the output path, the estimated page count, which bullets were dropped to fit, and which keywords matched or are missing.

resume_create input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "style": {
      "enum": [
        "modern",
        "classic",
        "compact"
      ],
      "type": "string",
      "default": "modern",
      "description": "Free tier prints \"modern\" only; \"classic\" and \"compact\" are Pro."
    },
    "variant": {
      "type": "string"
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "From the posting. A keyword that appears anywhere in the profile is printed in bold; one that does not is reported as missing and is never added to the resume."
    },
    "out_path": {
      "type": "string",
      "description": "Where to write the .docx. Defaults to <data dir>/documents/<name>-resume.docx, numbered -2, -3, ... if that exists."
    },
    "max_pages": {
      "type": "integer",
      "default": 2,
      "maximum": 5,
      "minimum": 1,
      "description": "Bullets are ordered by relevance to target_role and keywords, then trimmed to fit this many pages against a measured word budget. Default 2."
    },
    "overwrite": {
      "type": "boolean",
      "default": false,
      "description": "Replace an existing file at out_path. Default false: the call fails and nothing is written."
    },
    "target_role": {
      "type": "string",
      "description": "Printed under your name and used to rank bullets"
    }
  },
  "additionalProperties": false
}
resume_create annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
resume_to_markdown — Resume as markdown
Advertised by the server during the last successful anonymous check.

Return the stored profile as markdown text inline, ready to paste into a form or an ATS box. Same page-budget trimming as resume_create for max_pages. Nothing is written to disk. Free.

resume_to_markdown input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "variant": {
      "type": "string"
    },
    "max_pages": {
      "type": "integer",
      "default": 2,
      "maximum": 5,
      "minimum": 1
    },
    "target_role": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
resume_to_markdown annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
resume_to_html — Printable resume HTML
Advertised by the server during the last successful anonymous check.

Call this tool to write the resume as semantic HTML with a print stylesheet and return where it went; print it to PDF from a browser, because there is no doc_to_pdf here. Bullets are trimmed to fit max_pages. Free.

resume_to_html input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "variant": {
      "type": "string"
    },
    "out_path": {
      "type": "string",
      "description": "Where to write the .html. Defaults to <data dir>/documents/<name>-resume.html, numbered -2, -3, ... if that exists."
    },
    "max_pages": {
      "type": "integer",
      "default": 2,
      "maximum": 5,
      "minimum": 1,
      "description": "Bullets are trimmed to fit this many pages against a measured word budget. Default 2."
    },
    "overwrite": {
      "type": "boolean",
      "default": false,
      "description": "Replace an existing file at out_path. Default false: the call fails and nothing is written."
    },
    "target_role": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
resume_to_html annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
resume_read — Read an existing resume .docx
Advertised by the server during the last successful anonymous check.
Advertised read-only

Call this tool to read an existing .docx resume into the profile shape, with the sections found and anything unplaced. It saves nothing unless save is true, so review it first. .doc and .rtf are refused.

resume_read input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "path": {
      "type": "string",
      "minLength": 1,
      "description": "Name of a document uploaded with doc_upload"
    },
    "save": {
      "type": "boolean",
      "default": false,
      "description": "Store the result as the profile. Review it first."
    },
    "variant": {
      "type": "string"
    },
    "docx_base64": {
      "type": "string",
      "description": "The .docx itself, base64-encoded, instead of uploading it first"
    }
  },
  "additionalProperties": false
}
resume_read annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
cover_letter_create — Write a cover letter .docx
Advertised by the server during the last successful anonymous check.

Call this tool to write a one-page cover letter .docx from the stored profile and return the path, word count and bracketed prompts. Nothing from the posting is restated as yours. Free: 3 a month.

cover_letter_create input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "company",
    "role"
  ],
  "properties": {
    "role": {
      "type": "string",
      "minLength": 1
    },
    "tone": {
      "enum": [
        "formal",
        "direct",
        "warm"
      ],
      "type": "string",
      "default": "formal",
      "description": "Default \"formal\"."
    },
    "company": {
      "type": "string",
      "minLength": 1
    },
    "out_path": {
      "type": "string",
      "description": "Where to write the .docx. Defaults to <data dir>/documents/<company>-<role>-cover-letter.docx, numbered -2, -3, ... if that exists."
    },
    "overwrite": {
      "type": "boolean",
      "default": false,
      "description": "Replace an existing file at out_path. Default false: the call fails and nothing is written."
    },
    "highlights": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Points to lead with. Each is checked against the profile; anything not found there is returned as a bracketed prompt, not printed as fact."
    },
    "hiring_manager": {
      "type": "string"
    },
    "job_description": {
      "type": "string",
      "description": "Paste the posting. Used only to pick which of your own skills to lead with; no figure from the posting is ever restated as yours."
    }
  },
  "additionalProperties": false
}
cover_letter_create annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
tailor_to_job — Gap analysis against a posting
Advertised by the server during the last successful anonymous check.
Advertised read-only

READ-ONLY gap analysis against a posting: writes nothing, changes nothing. Returns matched keywords, missing ones, a coverage figure and orderings of facts you already stated. Act on it with resume_create.

tailor_to_job input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "job_description"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 30,
      "maximum": 60,
      "minimum": 5,
      "description": "How many keywords to extract from the posting. Default 30."
    },
    "variant": {
      "type": "string"
    },
    "job_description": {
      "type": "string",
      "minLength": 1,
      "description": "Paste the posting. The free tier reads up to 2,000 characters; Pro reads any length."
    }
  },
  "additionalProperties": false
}
tailor_to_job annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
license_status — License status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.

license_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
license_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
license_activate — Activate license
Advertised by the server during the last successful anonymous check.

Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.

license_activate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "key"
  ],
  "properties": {
    "key": {
      "type": "string",
      "description": "License key from checkout, MCPL1.<payload>.<signature>"
    }
  },
  "additionalProperties": false
}
license_activate annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
doc_upload — Upload a .docx to work on
Advertised by the server during the last successful anonymous check.
Advertised destructive

Send an existing Word document to this hosted endpoint. There is no filesystem here, so instead of a path you upload the file once with doc_upload and then pass its name as `path` to doc_read, doc_to_html and doc_fill_template. Give exactly one of docx_base64 or url. url: fetch a public file instead of pasting base64 (recommended above about 10 KB): a 13 KB base64 paste can take minutes to write out, while a url costs one line and the fetch happens here (10 second timeout, at most 3 redirects, public http(s) hosts only, 2 MB cap). Uploads are kept for your token between calls; doc_read and doc_fill_template also take docx_base64 directly; that file is stored under the name you give (default 'inline' / 'template') and can be removed with doc_delete_upload. Documents this server writes come back as a download link valid for one hour.

doc_upload input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "url: fetch a public file instead of pasting base64 (recommended above about 10 KB). Public http(s) only; private, link-local and this endpoint's own zone are refused"
    },
    "name": {
      "type": "string",
      "maxLength": 70,
      "minLength": 1,
      "description": "Name to refer to this document by: 1-64 characters of letters, digits, underscore or dash, e.g. \"contract\""
    },
    "docx_base64": {
      "type": "string",
      "description": "The .docx file, base64-encoded"
    }
  },
  "additionalProperties": false
}
doc_upload annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
doc_files — List uploaded documents
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the documents uploaded for your token, with their sizes.

doc_files input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
doc_files annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
doc_delete_upload — Delete an uploaded document
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete one document uploaded for your token: name is the name it was uploaded under, without .docx. doc_files lists them. A name nothing is stored under is refused and nothing is deleted.

doc_delete_upload input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 70,
      "minLength": 1
    }
  },
  "additionalProperties": false
}
doc_delete_upload annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}

Prompts

2 advertised

apply_to_job — Apply to a job

Advertised by the server during the last successful anonymous check.

Chain tailor_to_job, resume_create and cover_letter_create against one posting.

company
The employer (required)
role
The role as the posting names it (required)
job_description
Paste the posting (required)
upgrade_to_pro — Explain the upgrade

Advertised by the server during the last successful anonymous check.

Explain what Pro on the resume server costs and exactly what the user has to do, without leaving the conversation.

feature
The capped feature that prompted this, if there was one

Resources

2 advertised

profile — Stored profile

Advertised by the server during the last successful anonymous check.

The stored CV facts, as JSON. Every tool in this server reads from here and nowhere else.

profile URI
resume://profile

MIME type: application/json

pricing — Pricing and upgrade

Advertised by the server during the last successful anonymous check.

What resume costs, what Pro unlocks, the checkout link that carries this connection's token, and the one step a person has to take. Machine-readable; read it before telling a user how to lift a free-tier cap.

pricing URI
pricing://resume

MIME type: application/json

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1102 ms
95th percentile latency
1102 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1102 ms · metadata changed · 13 tool(s), 2 resource(s), 0 resource template(s), 2 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http mcp-resume-and-cover-letter https://mcp.zovo.one/mcp/resume

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add mcp-resume-and-cover-letter --url https://mcp.zovo.one/mcp/resume

Cursor

Merge this server into .cursor/mcp.json in your project, then enable mcp-resume-and-cover-letter in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "mcp-resume-and-cover-letter": {
      "url": "https://mcp.zovo.one/mcp/resume"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "mcp-resume-and-cover-letter": {
      "type": "streamableHttp",
      "url": "https://mcp.zovo.one/mcp/resume",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start mcp-resume-and-cover-letter and inspect its tools.
VS Code configuration
{
  "servers": {
    "mcp-resume-and-cover-letter": {
      "type": "http",
      "url": "https://mcp.zovo.one/mcp/resume"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http mcp-resume-and-cover-letter https://mcp.zovo.one/mcp/resume

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.zovo.one/mcp/resume

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "mcp-resume-and-cover-letter": {
      "serverUrl": "https://mcp.zovo.one/mcp/resume"
    }
  }
}

Let your agent find its tools

Find servers like theluckystrike MCP Resume and Cover Letter from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.