Skip to main content
Glama

job-search-mcp

Servidor MCP local que gestiona una busqueda de empleo sobre archivos Markdown.

El servidor no razona. El usuario habla con Claude, y Claude usa este servidor para leer y escribir sus archivos con una estructura fija. El cerebro es el cliente; esto es la memoria y las manos.

De un solo usuario, sin red, sin base de datos.


Concepto central: dos archivos separados

Es la idea que sostiene todo lo demas.

  • perfil-skills.md es lo que YA se tiene. Todo a nivel [solido] o [parcial], nunca huecos. Un termino entra aqui solo cuando el usuario confirma que lo tiene.

  • radar-huecos.md es lo que el mercado pide y no se tiene, cada termino con un contador de cuantas ofertas objetivo lo han pedido. Ordenado por contador: lo de arriba es lo mas urgente de aprender.

Ciclo de vida de una skill: nace como hueco cuando una oferta la pide, su contador sube cada vez que otra oferta la vuelve a pedir, y se gradua cuando el usuario confirma que la ha adquirido: sale del radar y entra en el perfil con su nivel. Ese es el unico camino de hueco a perfil.


Related MCP server: Job Application MCP

Modelo de datos

Todo vive en DATA_DIR, un directorio que es a la vez una boveda de Obsidian. El MCP escribe los .md y Obsidian los renderiza: la misma carpeta, cero conflicto.

DATA_DIR/
  perfil/
    perfil-skills.md    - [solido|parcial] Termino (nota)          bajo '## Categoria'
    radar-huecos.md     - [contador: N] Termino (Categoria). Fuentes: a; b
    criterios.md        prosa libre: que hace que una oferta merezca el tiempo
    cv.md               CV en Markdown, fuente de la evidencia concreta
  ofertas/
    AAAA-MM-empresa.md  frontmatter YAML + analisis + registro de estados + notas

Estados de una oferta: analizada -> solicitada -> entrevista -> oferta -> aceptada, con dos salidas laterales desde cualquier punto: denegada y descartada.

El servidor nunca regenera un archivo

Parsea solo las lineas que reconoce y edita esa linea concreta, dejando el resto de bytes intactos. El discriminador es el patron (- [contador: N] ), no la posicion: por eso una seccion ## Reglas llena de vinietas normales convive sin problema con las lineas de datos.

Esto es deliberado. Los archivos los edita tambien un humano en Obsidian, asi que el formato es del usuario, no del servidor.


Superficie MCP

Resources (solo lectura, los adjunta el usuario)

URI

Contenido

profile://skills

perfil-skills.md

profile://gaps

radar-huecos.md, ordenado por contador al servir

profile://cv

cv.md

profile://criteria

criterios.md

offers://list

tabla del pipeline: estado, empresa, puesto, score

offers://{id}

una oferta entera: analisis, estados y notas

Tools (escriben, los invoca el modelo)

Tool

Que hace

record_gap(term, category, source)

Sube el contador en 1 y anade la fuente. Si no existe, lo crea con 1. Nunca duplica.

list_gaps()

Huecos ordenados por contador descendente.

confirm_skill(term, level, evidence, category?)

La graduacion: saca del radar y mete en el perfil. Descarta las fuentes: al perfil solo viaja la evidencia.

update_skill_level(term, level)

Cambia solido/parcial de algo que ya esta en el perfil.

save_offer(id, title, company, markdown, score?, salario?, url?, tags?)

Crea o actualiza una oferta. Al actualizar conserva estado y notas.

set_offer_status(id, status)

Mueve por el ciclo de vida y lo anota con fecha.

add_offer_note(id, note)

Nota fechada en "Notas de entrevista".

ping()

Diagnostico: responde y dice sobre que DATA_DIR trabaja.

Prompt (lo invoca el usuario)

analyze_offer devuelve la plantilla de analisis rellenada con perfil, CV y criterios leidos del disco en ese instante, mas las instrucciones de guardar la oferta con save_offer y registrar cada hueco con record_gap. Debajo se pega el texto de la oferta.


Instalacion

Requiere Node >= 18 (probado con 24).

npm install
npm run build

Configuracion: una unica variable de entorno.

Variable

Por defecto

JOB_MCP_DATA_DIR

~/Desktop/Productivo/Trabajo/Perfil

Comprobar que arranca (imprime la ruta de datos y se queda esperando en stdio):

$env:JOB_MCP_DATA_DIR="<ruta a la boveda>"
node build/index.js

Registrarlo en un cliente

Es un servidor stdio: el cliente lo lanza como proceso hijo. La declaracion tiene siempre esta forma:

{
  "command": "node",
  "args": ["<ruta al repo>/build/index.js"],
  "env": { "JOB_MCP_DATA_DIR": "<ruta a la boveda>" }
}
  • Claude Code: ~/.claude.json, o claude mcp add job-search --scope user -- node <ruta>/build/index.js.

  • Claude Desktop: bloque mcpServers en claude_desktop_config.json. Usa la ruta absoluta del ejecutable de node: Desktop se lanza desde el explorador y no hereda el PATH.

Las rutas concretas de esta maquina estan en SETUP.local.md, fuera de git.


La regla que mas tiempo cuesta aprender

Cada npm run build obliga a reiniciar el cliente.

Un servidor MCP por stdio se lanza una vez, cuando arranca el cliente, y ese proceso se queda vivo. No hay recarga en caliente. Cerrar la ventana de Claude Desktop no basta: hay que salir desde el icono de la bandeja del sistema.

Sintoma tipico: pides un tool nuevo y el cliente jura que no existe.


Desarrollo

npm run build     # tsc -> build/
npm test          # tsc + node --test "build/**/*.test.js"   (40 tests)
npm run watch     # recompilar al guardar
src/
  index.ts          solo cablea: resources + tools + prompts + transporte stdio
  config.ts         DATA_DIR y rutas derivadas
  resources.ts      los 6 resources
  tools.ts          los 8 tools, con sus esquemas Zod
  prompts.ts        analyze_offer
  lib/
    markdown.ts     primitivas por linea: cabeceras, secciones, EOL, normalize
    skills.ts       perfil-skills.md
    radar.ts        radar-huecos.md y los contadores
    offers.ts       frontmatter, estados y notas
    graduate.ts     confirm_skill: la operacion que cruza los dos archivos
    files.ts        el UNICO modulo con I/O

src/lib/* son funciones puras con la forma (contenido, args) -> { contenido, changed, message }. Por eso los tests no tocan el disco y corren en 100 ms.

graduate.ts devuelve los dos contenidos nuevos sin escribir: quien llama persiste ambos o ninguno. Es lo mas cerca de una transaccion que tiene sentido aqui.

Nunca uses console.log en el servidor. stdout es el canal JSON-RPC y escribir ahi rompe el protocolo. Los logs van a console.error (stderr).

Probar el servidor sin ningun cliente, hablandole JSON-RPC crudo:

$msgs = @(
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"m","version":"0"}}}'
'{"jsonrpc":"2.0","method":"notifications/initialized"}'
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
)
$msgs | node build/index.js

Donde aparece cada primitivo en el cliente

Los tres primitivos tienen puntos de entrada distintos, segun quien decide usarlos:

Primitivo

Quien lo invoca

Donde aparece

Prompt

el usuario

menu /

Tool

el modelo

no se invoca desde un menu: se pide hablando

Resource

el usuario

menu de adjuntar


Obsidian

El DATA_DIR es una boveda. Dos plugins, y de momento solo estos:

  • Dataview: tabla viva del radar ordenada por contador, y tabla de ofertas filtrada por estado, apoyada en el frontmatter YAML.

  • Kanban: el pipeline de ofertas como tablero por estado.

La vista de grafo y los [[enlaces]] salen gratis.


Fuera de alcance

Sin base de datos (son Markdown a proposito, legibles y versionables a mano), sin interfaz web, sin scraping de portales, sin multiusuario, sin nube. Corre local.

Las mejoras aparcadas estan en IDEAS.md.

Available Tools

8 tools
add_offer_noteAnotar en una ofertaA

Anade una nota fechada a la seccion 'Notas de entrevista' de una oferta. Para quien me entrevista, que me preguntaron, feedback recibido o cualquier cosa que quiera releer antes de la siguiente ronda. Las notas se acumulan, nunca se sobrescriben.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId de la oferta.
noteYesTexto de la nota. Admite varias lineas y Markdown.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate non-destructive behavior (destructiveHint=false), and the description confirms notes accumulate without overwriting. It adds that notes are dated (timestamped) and placed in a specific section, going beyond annotations. However, it doesn't detail return behavior or error cases.

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

Conciseness5/5

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

Two concise sentences: first states the action, second provides context on content and behavior. No wasted words, front-loaded with the core purpose.

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

Completeness5/5

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

For a simple tool with 2 parameters and no output schema, the description covers purpose, usage context, and behavioral traits (accumulation, dating). Given the sibling tools, this is sufficient for an agent to select and invoke correctly.

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

Parameters3/5

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

The input schema already provides descriptions for both parameters ('id' and 'note'), achieving 100% coverage. The tool description repeats that notes accumulate (behavior) but adds no additional semantic detail about the parameters themselves (e.g., format, constraints beyond schema). Baseline of 3 is appropriate.

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?

The description clearly states the tool adds a dated note to the 'Notas de entrevista' section of an offer. It specifies the kind of content suitable for the note (interviewer, questions asked, feedback, anything to review before next round). This distinguishes it from siblings like update_skill_level or confirm_skill.

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

Usage Guidelines4/5

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

The description explains that notes accumulate and never overwrite, which is a key usage behavior. It implicitly tells when to use (for interview-related notes) but does not explicitly compare to alternatives or specify when not to use. Still, it provides clear context for use.

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

confirm_skillGraduar skillA

La graduacion: confirma que ya tengo una skill que estaba en el radar. La saca del radar y la mete en perfil-skills.md con su nivel y la evidencia. Es el UNICO camino de hueco a perfil. Usalo solo cuando el usuario confirme que lo ha adquirido (certificacion, proyecto o experiencia real), nunca por iniciativa propia.

ParametersJSON Schema
NameRequiredDescriptionDefault
termYesTermino tal y como aparece en el radar.
levelYessolido = lo defiendo en entrevista con evidencia en un proyecto. parcial = lo he tocado, no lo domino.
categoryNoSolo si el hueco no traia categoria en el radar.
evidenceYesPor que puedo defenderlo: certificacion, proyecto o experiencia. Va al perfil como nota. La oferta que origino el hueco NO se conserva.

TDQS

A4.6/5.0
Behavior4/5

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

The description reveals side effects: removes from radar, adds to profile, discards the original offer. Annotations only provide idempotentHint=false and destructiveHint=false, but the description adds significant behavioral context not covered by annotations.

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

Conciseness5/5

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

The description is two sentences, dense with information, front-loaded with the key concept, and every sentence adds value without redundancy.

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?

The description covers the tool's purpose, usage constraints, parameter nuances, and behavioral effects. It is fully sufficient for an agent to decide when and how to invoke this tool.

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

Parameters5/5

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

With 100% schema coverage, the description still adds value: it explains that 'term' must match the radar exactly, that 'evidence' is a note and the offer is not preserved, and that 'category' is optional only if missing from radar.

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?

The description clearly states the verb 'confirma' (confirms) and the resource 'skill', and explains that it moves a skill from the radar to the profile. It distinguishes itself as the ONLY path from gap to profile, differentiating it from siblings.

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

Usage Guidelines4/5

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

The description explicitly says to use only when the user confirms acquisition and never on own initiative. It does not name sibling tools as alternatives, but the context and the phrase 'UNICO camino' imply exclusivity.

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

list_gapsListar huecosA
Read-only

Devuelve todos los huecos del radar ordenados por contador descendente: lo primero es lo que mas ofertas han pedido y por tanto lo mas urgente de aprender.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Beyond readOnlyHint annotation, description adds ordering logic and semantic urgency meaning, but doesn't disclose auth or other behaviors (though not needed for a simple read).

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

Conciseness5/5

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

One clear, front-loaded sentence with no wasted words. Perfectly concise for the tool's simplicity.

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?

Given zero parameters and high schema coverage, description fully covers what the tool does. No gaps in understanding.

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?

No parameters, so baseline 4 applies. Description adds no param info since none exist.

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?

Description clearly states it returns all gaps sorted by counter descending, which is a specific verb-resource combination. It distinguishes from siblings like record_gap which are for writing.

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

Usage Guidelines3/5

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

No explicit when/when-not guidance, but purpose is clear enough that an agent can infer usage. No mention of alternatives.

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

pingPingA
Read-only

Comprueba que el servidor esta vivo y sobre que carpeta de datos esta trabajando.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, indicating safe read operation. The description adds that it checks the alive status and data folder, providing context beyond the annotation. No contradictions.

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

Conciseness5/5

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

The description is a single sentence that efficiently conveys the purpose. It is front-loaded with the action and resource, with no unnecessary words.

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?

Given the tool has no parameters, no output schema, and a simple purpose, the description is fully complete. It tells the agent exactly what the tool does and what it returns (status and folder).

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?

The tool has no parameters, so the baseline is 4. The description doesn't need to add parameter meaning beyond what the schema provides (empty).

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?

The description uses a specific verb ('comprueba' meaning checks) and identifies the resource (server aliveness and data folder). It clearly distinguishes from sibling tools (skills, offers, gaps) which are unrelated.

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

Usage Guidelines4/5

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

The context implies this is a health check tool for verifying server status, which is clear. It doesn't explicitly state when not to use or list alternatives, but the purpose is straightforward.

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

record_gapRegistrar huecoA

Registra que una oferta pide una skill que NO tengo. Si el termino ya esta en el radar sube su contador en uno y anade la fuente; si no esta, lo crea con contador 1. Nunca duplica. Llamalo una vez por cada skill que la oferta pida y falte en mi perfil, incluidos los terminos que no sabria definir en una entrevista.

ParametersJSON Schema
NameRequiredDescriptionDefault
termYesLa skill o concepto que falta, tal y como lo llamaria un ingeniero. Ej: 'Kubernetes'.
sourceYesOferta que lo pide, para poder rastrearlo. Ej: 'Google SWE II, Malaga'.
categoryYesCategoria a la que pertenece, para saber bajo que '##' colocarla en el perfil cuando se gradue. Ej: 'Infraestructura'.

TDQS

A4.7/5.0
Behavior5/5

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

The description fully explains the tool's behavior beyond annotations. It specifies that the tool never duplicates, increments a counter and adds the source if the term exists, or creates it with counter 1 if new. This provides clear behavioral transparency. Annotations indicate it is not idempotent (idempotentHint: false) and not destructive (destructiveHint: false), and the description aligns with these traits.

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

Conciseness5/5

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

The description is extremely concise: two sentences. The first sentence states the core action and behavior, and the second provides clear usage guidance. Every sentence adds value without waste.

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?

Given the tool's simplicity (3 required parameters, no output schema), the description covers all necessary context: what the tool does, its behavioral details (upsert logic), and precise usage instructions. It is complete for an agent to understand when and how to invoke it.

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%, so all parameters are documented. The description adds value by providing concrete examples for each parameter (e.g., 'Kubernetes' for term, 'Google SWE II, Malaga' for source, 'Infraestructura' for category), which clarifies the expected format and granularity beyond the schema's brief descriptions.

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?

The description clearly states the tool's purpose: recording that an offer asks for a missing skill. It uses specific verbs ('registra') and resources ('una oferta pide una skill que NO tengo'). It distinguishes itself from sibling tools like 'confirm_skill' (which likely confirms a skill) and 'list_gaps' (which lists gaps).

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

Usage Guidelines4/5

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

The description explicitly tells when to call the tool: once per missing skill per offer, including terms the user couldn't define. It does not explicitly state when not to use it or provide alternatives, but the context ('terminos que no sabria definir en una entrevista') implies it should be used for truly unknown skills. Sibling tool names like 'confirm_skill' and 'update_skill_level' suggest alternatives for existing skills, but this is not spelled out.

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

save_offerGuardar analisis de ofertaA
Idempotent

Crea o actualiza el archivo de una oferta con su analisis. Si la oferta ya existia se sustituye SOLO el analisis: el estado y las notas de entrevista se conservan.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesIdentificador y nombre de archivo, formato AAAA-MM-empresa. Ej: '2026-07-google'.
urlNoEnlace a la oferta original.
tagsNoEtiquetas cortas. Ej: ['backend','bigtech'].
scoreNoPuntuacion 0-12 sumando los seis ejes de criterios.md.
titleYesPuesto tal y como lo titula la oferta.
companyYesEmpresa.
salarioNoRango o cifra tal y como la publica la oferta.
markdownYesEl analisis completo en Markdown, con los seis puntos de la plantilla.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the tool as idempotent and non-destructive. The description adds useful context by specifying that only the analysis is replaced while status and notes are preserved. This goes beyond annotations and helps the agent understand what mutations occur.

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

Conciseness5/5

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

Two sentences with no wasted words. The main action is front-loaded, and the second sentence clarifies behavior. Perfectly concise.

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

Completeness4/5

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

Given 8 parameters and no output schema, the description covers the core behavior, idempotency, and preservation semantics. It lacks mention of return values or error cases, but for a save/update tool it is fairly complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema documents all parameters. The description adds some context for the 'markdown' parameter (expects six-point template), but does not add value for other parameters. Baseline 3 is appropriate.

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?

The description clearly states the tool creates or updates an offer file with its analysis, and explicitly distinguishes from siblings by stating that status and interview notes are preserved. The verb 'crea o actualiza' and resource 'archivo de una oferta con su analisis' are specific.

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

Usage Guidelines4/5

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

The description implies when to use the tool (to save/update analysis) and when not to (for status/notes updates, use sibling tools). However, it does not explicitly name alternative tools like 'set_offer_status' or 'add_offer_note', so the guidance is clear but not fully explicit.

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

set_offer_statusCambiar estado de una ofertaA
Idempotent

Mueve una oferta por su ciclo de vida y deja el cambio anotado con fecha en su registro. Ciclo: analizada -> solicitada -> entrevista -> oferta -> aceptada. Salidas laterales desde cualquier punto: denegada (me rechazan) y descartada (decido no seguir).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesId de la oferta. Ej: '2026-07-google'.
statusYesNuevo estado, uno de los siete del ciclo de vida.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare idempotent and non-destructive. Description adds that changes are recorded with date, enriching the behavioral context without contradiction.

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

Conciseness5/5

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

Three concise sentences: action+effect, cycle definition, lateral exits. No wasted words, well-structured and front-loaded.

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

Completeness4/5

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

Given 2 params and no output schema, description adequately explains lifecycle and lateral moves. Could mention validation or error handling, but sufficient for typical use.

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 covers 100% with descriptions. The description adds lifecycle meaning to the status parameter beyond the enum list, providing useful context for the cycle order.

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?

The description clearly states the tool moves an offer through its lifecycle and records the change. It specifies the cycle sequence and lateral exits, distinguishing it from siblings like save_offer.

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

Usage Guidelines3/5

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

Usage is implied as moving an offer status, but no explicit when-to-use vs alternatives or exclusions are given. Could mention that save_offer is for other modifications.

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

update_skill_levelCambiar nivel de una skillA
Idempotent

Cambia el nivel de un termino que YA esta en perfil-skills.md. Para algo que aun no esta en el perfil usa confirm_skill.

ParametersJSON Schema
NameRequiredDescriptionDefault
termYesTermino tal y como aparece en perfil-skills.md.
levelYesNuevo nivel: solido o parcial.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare idempotent and non-destructive behavior. Description does not contradict and adds minimal additional context (the update action is obvious).

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

Conciseness5/5

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

Two sentences, front-loaded with action, efficient and clear.

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

Completeness4/5

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

Simple tool with only two params and no output schema. Description covers core purpose and usage context, though could mention what happens if term not found.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. Description adds no extra meaning beyond what schema already provides for term and level.

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?

The description clearly states it changes the level of a term already in perfil-skills.md, and distinguishes from confirm_skill for terms not yet in the profile.

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?

Explicitly provides when to use (terms already in profile) and alternative (use confirm_skill for new terms).

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. Dates show when Glama detected each change.

  1. 8 tool updatesv0.1.0
    • First observedadd_offer_note
    • First observedconfirm_skill
    • First observedlist_gaps
    • First observedping
    • First observedrecord_gap
    • First observedsave_offer
    • First observedset_offer_status
    • First observedupdate_skill_level

TDQS

A4.4/5.0
Disambiguation5/5

Each tool has a distinct purpose: skill management (update_skill_level, record_gap, list_gaps, confirm_skill), offer management (save_offer, set_offer_status, add_offer_note), and health check (ping). No overlapping or ambiguous tools.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case, e.g., record_gap, list_gaps, set_offer_status. The naming is predictable and clear.

Tool Count5/5

With 8 tools covering skill tracking and offer management, the server is well-scoped. Each tool serves a necessary function without redundant or excessive entries.

Completeness4/5

The set covers core workflows: skill gap analysis and offer lifecycle. Missing features like listing offers or direct skill removal are minor gaps that agents can work around.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A local-first, open-source MCP server that analyzes jobs, matches your CV, tailors documents, and tracks applications — all on your machine with no data uploaded.
    AGPL 3.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables Claude to search live job postings, rank them against a user's skills profile, and track application statuses locally.
    -
  • A
    license
    A
    quality
    C
    maintenance
    A privacy-first MCP server for locally managing job, fellowship, and graduate-school applications. It offers tools for tracking application status, analyzing role fit, generating LaTeX CV/cover letters, interview prep, and discovering public jobs from ATS APIs.
    8
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JonniThorpe/MCP-JobQualifications'

If you have feedback or need assistance with the MCP directory API, please join our Discord server