Skip to main content
Glama

mcp-staffing-demo

Français

A small, self-contained MCP server used as the live demo of the talk « MCP : donner des mains à vos agents » (English). The domain is deliberately familiar: staffing at a consulting firm. Four tools, one in-memory dataset, no network calls and no database, because a demo on a conference stage shouldn't depend on anything.

Tool names and data are in French, as in the talk. Everything is fictional.

Quick start

git clone https://github.com/brbousnguar/mcp-staffing-demo
cd mcp-staffing-demo
npm install && npm run build

Related MCP server: JobMatch MCP

Connecting

Claude Code

claude mcp add staffing -- node "$PWD/dist/index.js"

Claude Desktop, Cursor, or any client that reads an mcpServers config (for VS Code + Copilot, put the same block in .vscode/mcp.json):

{
  "mcpServers": {
    "staffing": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-staffing-demo/dist/index.js"]
    }
  }
}

Then ask your agent something like: "Can we staff the insurer's mission starting in November, and with whom?"

The tools

Tool

Input

Output

rechercher_collaborateurs

competence?, niveau_min?, agence?, mois?, jours_min?, limite

A short list, sorted by level then availability

obtenir_collaborateur

id

One person's profile: rated skills, day rate, languages, monthly load

analyser_staffing_mission

mission_id, candidats_max

A coverage verdict plus scored candidates, with typed structuredContent

reserver_collaborateur

collaborateur_id, mission_id, mois, jours

A booking confirmation, or an explicit error

What the code demonstrates

Each tool exists to make one point from the talk:

  • z.strictObject everywhere. A parameter the model invents is rejected with Unrecognized key: "…" instead of being silently ignored — the bug from lesson 1 of the talk.

  • The computation lives in the server. analyser_staffing_mission crosses skills, load and budget in tested TypeScript. The model gets a verdict, not tables to reconcile.

  • Two outputs per call. content carries the answer the model reads; structuredContent the same result as typed JSON for orchestrating code.

  • No empty success. reserver_collaborateur fails loudly if the person is unknown or out of capacity. An agent can never believe it wrote something it didn't.

Scripts

Command

Does

npm run build

Compile src/ to dist/

npm run dev

Compile on change

npm run check

Type-check only

npm start

Run the server on stdio

The dataset

src/donnees.ts: 8 people, 3 missions, a capacity of 20 working days a month, four open months (2026-09 to 2026-12). All fictional. Bookings made during a session live in memory and disappear on restart.

Stack

TypeScript 5.9 · @modelcontextprotocol/server 2.0 · Zod 4 · stdio transport · Node ≥ 20

Mind the SDK version. This server uses SDK v2 (@modelcontextprotocol/server, zod/v4, inputSchema as a z.strictObject({…})). Most tutorials still use SDK v1 (@modelcontextprotocol/sdk), whose import paths and inputSchema shape (a raw shape rather than a Zod object) differ. Copying this code into a v1 project won't work as is.

License

MIT

Available Tools

4 tools
analyser_staffing_missionAnalyser le staffing d une missionB

Evalue quels collaborateurs peuvent couvrir une mission : score d'adequation, ecarts de competences, cout estime et alerte budget. Une seule reponse, deja calculee.

NameRequiredDescriptionDefault
mission_idYesIdentifiant de la mission, ex. 'm-101'
candidats_maxNo

Output Schema

NameRequiredDescription
candidatsYes
etp_requisYes
mission_idYes
etp_couvertYes
mois_analyseYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does add one useful behavioral fact — 'Une seule reponse, deja calculee' tells the agent this is a single, pre-computed read-style response rather than an iterative/streaming operation. However, it says nothing about permissions, side effects, rate limits, or freshness of the computation.

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?

Two compact sentences, front-loaded with the core purpose followed by the returned outputs. No filler, though the second sentence's value overlaps with the output schema.

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

Completeness3/5

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

For a 2-parameter analysis tool with an output schema, the description covers purpose and outputs adequately (return values needn't be restated). The notable gap is candidats_max, whose behavior and bounds are left entirely unexplained.

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

Parameters2/5

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

Schema coverage is only 50%: mission_id is documented in the schema, but candidats_max (the cap on returned candidates, default 3, max 10) is undocumented in both schema and description. The description adds no parameter meaning and does not compensate for the gap.

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

Purpose4/5

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

The description gives a specific verb ('Evalue') and resource ('quels collaborateurs peuvent couvrir une mission') and enumerates the analysis dimensions returned (score d'adequation, ecarts de competences, cout estime, alerte budget). This is clearly distinct from the lookup/mutation siblings (obtenir/rechercher/reserver_collaborateur), 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.

Usage Guidelines3/5

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

Usage is implied by the purpose (analyse staffing coverage for a given mission), but there is no explicit when-to-use guidance, no prerequisites, and no routing to or away from siblings like rechercher_collaborateurs. The agent must infer the trigger condition.

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

obtenir_collaborateurObtenir la fiche d un collaborateurA

Fiche detaillee d'un collaborateur : competences notees, TJM, langues et disponibilite mois par mois.

NameRequiredDescriptionDefault
idYesIdentifiant du collaborateur, ex. 'c-001'

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. 'Fiche détaillée' plus the listed fields make clear this is a read/retrieval operation and disclose the substantive return content, but it says nothing about read-only semantics, auth requirements, or behavior when the id is unknown.

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?

A single front-loaded sentence with no filler; the returned-field list is the essential information and nothing is wasted.

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?

With no output schema, the description usefully enumerates the key returned fields, so an agent knows what it gets back. It could still mention error/not-found behavior, but for a one-param read tool it is largely 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 coverage is 100% and the single 'id' parameter is fully documented in the schema with an example ('c-001'), so the description adds nothing about it. Baseline 3 is appropriate when the schema does the work.

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

Purpose4/5

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

States a specific verb+resource (retrieve a collaborator's detail sheet) and enumerates the returned content (rated skills, TJM, languages, monthly availability), which distinguishes it from the search-oriented sibling rechercher_collaborateurs. It does not explicitly name or contrast with siblings, keeping it short of a 5.

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 only implied: fetch a full profile for a known collaborator. There is no explicit statement of when to use this instead of rechercher_collaborateurs (search) or reserver_collaborateur (booking), and no prerequisites are given.

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

rechercher_collaborateursRechercher des collaborateursA

Recherche des collaborateurs disponibles selon une competence, une agence et un mois. Retourne une liste courte, triee par niveau de competence puis par disponibilite.

NameRequiredDescriptionDefault
moisNoMois de besoin au format AAAA-MM (ex. '2026-11')
agenceNoRestreindre a une agence
limiteNoNombre maximum de resultats
jours_minNoNombre minimum de jours disponibles sur le mois demande
competenceNoCompetence recherchee, en minuscules (ex. 'react', 'kafka', 'kubernetes')
niveau_minNoNiveau minimum sur cette competence, de 1 a 5

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose two useful traits beyond the schema: results are a short list and are sorted by skill level then availability. However, it says nothing about authentication requirements, rate limits, empty-result behavior, or what constitutes 'disponible', which are relevant for a staffing search.

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, both earning their place: the first states purpose and filter axes, the second states the return shape and ordering. Front-loaded and free of redundancy.

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

Completeness3/5

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

With six parameters, no required fields, and no output schema, the description should say more about what the returned collaborator entries contain and how vacancy/jours_min interact. It covers the ranking rule and result size but leaves the returned fields and matching semantics unspecified.

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%, with each of the six parameters documented (format for mois, enum values for agence, bounds for limite, jours_min, niveau_min, lowercase convention for competence). The description only names three of the six filter axes and adds no syntax or format detail beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

The description gives a specific verb (Recherche) and resource (collaborateurs) plus the three filter axes (competence, agence, mois), so the agent knows exactly what it returns. It does not, however, explicitly differentiate itself from siblings like obtenir_collaborateur or analyser_staffing_mission, which an agent must infer.

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 by the verb 'recherche' and the filter parameters, so an agent can guess this is the discovery step before reserver_collaborateur. There is no explicit when-to-use statement, no mention of when to prefer obtenir_collaborateur for a single known person, and no exclusions.

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

reserver_collaborateurReserver un collaborateur sur une missionB

Pose une reservation de jours sur un collaborateur pour un mois donne. Echoue explicitement si le collaborateur, la mission ou la capacite ne suivent pas.

NameRequiredDescriptionDefault
moisYes
joursYesJours ouvres a reserver
mission_idYesIdentifiant de la mission, ex. 'm-101'
collaborateur_idYesIdentifiant du collaborateur, ex. 'c-003'

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden and does disclose one meaningful trait: explicit failure when collaborator, mission, or capacity are invalid. However, for a mutation it omits idempotency, permission requirements, and whether it overwrites or coexists with existing reservations.

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?

Two tight sentences with the action front-loaded and the failure condition following. No filler, though it could be marginally sharper about the mutation's side effects.

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

Completeness3/5

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

For a 4-required-param mutation with no annotations and no output schema, the description covers purpose and failure mode but leaves conflict handling, permissions, and post-condition behavior unstated. Adequate but with clear gaps.

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 75%, with mission_id, collaborateur_id and jours already documented and mois self-describing via a pattern. The description loosely maps to all four inputs but adds no syntax or semantic detail beyond the schema, so the baseline 3 is correct.

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

Purpose4/5

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

States a specific verb+resource: placing a day reservation on a collaborator for a given month. The purpose is immediately clear and distinguishable from the read-only siblings (obtenir/rechercher/analyser). It stops short of 5 because it never names or contrasts with those siblings.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no routing to alternatives. The mention that it fails on capacity hints that a pre-check might be relevant (e.g. analyser_staffing_mission), but that connection is left entirely to inference.

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.

  1. 4 tool updatesv1.0.0
    • First observedanalyser_staffing_mission
    • First observedobtenir_collaborateur
    • First observedrechercher_collaborateurs
    • First observedreserver_collaborateur

TDQS

A3.6/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct action: fetch one collaborator's detail, search a list, analyze mission fit, and create a reservation. The boundaries are clear and non-overlapping, so an agent can select confidently.

Naming Consistency5/5

All four names follow a consistent French verb_noun pattern (obtenir_/rechercher_/analyser_/reserver_) with plural/singular nouns used meaningfully. No mixed conventions or vague verbs.

Tool Count4/5

Four tools is on the lean side but well-scoped for a focused staffing demo, with each tool earning its place. Slightly thin given the domain could support more operations.

Completeness3/5

Covers the core search → detail → analysis → reservation flow, but there is no way to cancel/modify a reservation or list existing bookings/missions, leaving dead ends after a booking. Notable lifecycle gaps remain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Provides MCP tools for job search, inbound recruiter activity triage, conversation inbox access, and guarded profile updates.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI-powered job search and resume matching with strict skill verification, resume parsing, and configurable user preferences, plus MCP tools for job search, Excel export, and email dispatch.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables users to search and view job postings and manage career-profile data such as work experiences, job summaries, career goals, and technical skills through MCP-compatible clients.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to search jobs, retrieve job details, and view or update career-profile data such as experiences, job summaries, career goals, and technical skills through MCP tools.
    -