mcp-staffing-demo
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-staffing-demoCan we staff the insurer's mission starting in November, and with whom?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-staffing-demo
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 buildRelated 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 |
|
| A short list, sorted by level then availability |
|
| One person's profile: rated skills, day rate, languages, monthly load |
|
| A coverage verdict plus scored candidates, with typed |
|
| A booking confirmation, or an explicit error |
What the code demonstrates
Each tool exists to make one point from the talk:
z.strictObjecteverywhere. A parameter the model invents is rejected withUnrecognized key: "…"instead of being silently ignored — the bug from lesson 1 of the talk.The computation lives in the server.
analyser_staffing_missioncrosses skills, load and budget in tested TypeScript. The model gets a verdict, not tables to reconcile.Two outputs per call.
contentcarries the answer the model reads;structuredContentthe same result as typed JSON for orchestrating code.No empty success.
reserver_collaborateurfails loudly if the person is unknown or out of capacity. An agent can never believe it wrote something it didn't.
Scripts
Command | Does |
| Compile |
| Compile on change |
| Type-check only |
| 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,inputSchemaas az.strictObject({…})). Most tutorials still use SDK v1 (@modelcontextprotocol/sdk), whose import paths andinputSchemashape (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 toolsanalyser_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.
| Name | Required | Description | Default |
|---|---|---|---|
| mission_id | Yes | Identifiant de la mission, ex. 'm-101' | |
| candidats_max | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| candidats | Yes | |
| etp_requis | Yes | |
| mission_id | Yes | |
| etp_couvert | Yes | |
| mois_analyse | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Identifiant du collaborateur, ex. 'c-001' |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mois | No | Mois de besoin au format AAAA-MM (ex. '2026-11') | |
| agence | No | Restreindre a une agence | |
| limite | No | Nombre maximum de resultats | |
| jours_min | No | Nombre minimum de jours disponibles sur le mois demande | |
| competence | No | Competence recherchee, en minuscules (ex. 'react', 'kafka', 'kubernetes') | |
| niveau_min | No | Niveau minimum sur cette competence, de 1 a 5 |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mois | Yes | ||
| jours | Yes | Jours ouvres a reserver | |
| mission_id | Yes | Identifiant de la mission, ex. 'm-101' | |
| collaborateur_id | Yes | Identifiant du collaborateur, ex. 'c-003' |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v1.0.0- First observed
analyser_staffing_mission - First observed
obtenir_collaborateur - First observed
rechercher_collaborateurs - First observed
reserver_collaborateur
TDQS
Scored across 4 tools
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.
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.
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.
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
Related MCP Connectors
Hire specialists by the hour — search, schedule, and pay via MCP protocol.
184 MCP tools for field-service CRM, scheduling and double-entry accounting. Hosted; BYO agent.
23 MCP tools: compliance, verification, messaging, booking, US contracts. 15 need no key.
Connects Amazon Seller Central and Amazon Advertising to any MCP client. Settlement-accurate P&L - every fee, refund and reimbursement as Amazon posted it - plus contribution margin and breakeven per product, per marketplace, per day. Full Sponsored Products, Brands and Display management: search terms, placements, keyword and competitor research, dayparting, automation rules. 110 tools: 78 read-only (P&L, PPC at every grain, SQP/Brand Analytics, inventory, forecasting), 28 staged writes (every change is a proposal you review and confirm before it reaches Amazon - there is no autonomous-write mode), and 4 confirmation & support tools. 4 additional AI Workforce tools appear once a client is connected.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceProvides MCP tools for job search, inbound recruiter activity triage, conversation inbox access, and guarded profile updates.-
- FlicenseNot gradedqualityCmaintenanceEnables 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.-
- FlicenseNot gradedqualityAmaintenanceEnables 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.-
- FlicenseNot gradedqualityAmaintenanceEnables 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.-