Search Actual group job offers in France, find agencies and prepare applications.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Actual group employment agencies (about 780 in France) in a town or a region, with address and specialties. Candidates can visit or call an agency for advice, registration or follow-up on their applications. To recommend the single most relevant agency for a job, use find_best_agency instead.
Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers.
The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
Town name, e.g. "Nantes".
Maximum number of agencies returned. Defaults to 20.
French region name, e.g. "Pays de la Loire".
Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.
Tool list last changed Oct 23, 2026.
Actual group employment agencies (about 780 in France) in a town or a region, with address and specialties. Candidates can visit or call an agency for advice, registration or follow-up on their applications. To recommend the single most relevant agency for a job, use find_best_agency instead.
| Argument | Type | Description |
|---|---|---|
| city | string | Town name, e.g. "Nantes". |
| limit | integer | Maximum number of agencies returned. Defaults to 20. |
| region | string | French region name, e.g. "Pays de la Loire". |
| context* | string | Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers. |
| llm_model* | string | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
| conversation_id | string | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"context",
"llm_model"
],
"properties": {
"city": {
"type": "string",
"description": "Town name, e.g. \"Nantes\"."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Maximum number of agencies returned. Defaults to 20."
},
"region": {
"type": "string",
"description": "French region name, e.g. \"Pays de la Loire\"."
},
"context": {
"type": "string",
"description": "Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"conversation_id": {
"type": "string",
"description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
}
}
}Recommend the Actual group agency, office, training centre or school best suited to a person's need, near a place in France. Covers employment agencies (intérim, CDD, CDI), Actual Talent offices (talent acquisition and assessment, mostly white-collar), Envergure centres (vocational training, skills assessment, career transition) and the group's schools (eSUP, Holberton…, often work-study). Ranks them by open offers for the given job, specialty (construction, logistics, medical, white-collar, school domain…) and distance. Returns address, phone, opening status and why each agency was picked. Pass the returned agency code to search_offers (agencyCode) to list that agency's offers.
| Argument | Type | Description |
|---|---|---|
| job | string | Job or field the person is looking for or hiring for, e.g. "électricien", "cariste", "aide-soignant". |
| limit | integer | Number of agencies to return, 1 to 5. Defaults to 3. |
| context* | string | Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers. |
| purpose | string | find_job: a candidate looking for work (default). hire: a company looking to recruit. assessment: a company wanting candidates or staff assessed (Actual Talent). training: vocational training, skills assessment or career change (Envergure). school: a degree or work-study programme (group schools). insertion: return-to-work support. |
| location* |
Full details of one Actual group job offer: description, required profile, salary, schedule, benefits and recruiting agency. Takes the slug returned by search_offers (also the last segment of the offer URL).
| Argument | Type | Description |
|---|---|---|
| lang | string | Language of the offer text. Defaults to fr. |
| slug* | string | Offer slug, from search_offers or the offer URL. |
| context* | string | Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers. |
| llm_model* | string | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
| conversation_id | string | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Exact filter values accepted by search_offers for one dimension (contract type, job family, industry or region), with the number of open offers for each. Optionally scoped by a query and a town.
| Argument | Type | Description |
|---|---|---|
| q | string | Optional free text to scope the counts. |
| town | string | Optional town or postal code to scope the counts. |
| context* | string | Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers. |
| dimension* | string | Which filter to list. |
| llm_model* | string | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
| conversation_id | string | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
Search the job offers (temporary work, fixed-term and permanent contracts) published by Actual group in France. Combine a free-text query with a town and filters. Filter values for contractType, family, industry and region must be exact French values: get them from list_offer_facets. Use get_offer with a result's slug for the full offer.
| Argument | Type | Description |
|---|---|---|
| q | string | Free text: job title, skill or keyword, e.g. "cariste", "soudeur TIG", "aide-soignant". |
| lang | string | Language of the offer texts and URLs. Defaults to fr. |
| page | integer | Page number, from 1. |
| sort | string | Sort order. Defaults to relevance. |
| town | string | French town or postal code to search around, e.g. "Rennes" or "35000". |
| family | array | Job families (exact values from list_offer_facets). |
| radius | any | Search radius in km around the town. Defaults to 20. |
| region | array | French regions (exact values from list_offer_facets), e.g. ["Bretagne"]. |
Prepare an application to an Actual group offer on behalf of the candidate you are assisting. Returns a personal link, valid 72 hours, that the candidate must open to attach their CV and give consent to the processing of their data; the application is only sent once they submit that page. Only call this when the candidate has asked to apply and given you their name and email. Never submit the page yourself: give the link to the candidate.
| Argument | Type | Description |
|---|---|---|
| lang | string | Language of the application page. Defaults to fr. |
| slug* | string | Slug of the offer, from search_offers or get_offer. |
| email* | string | Candidate email address. |
| context* | string | Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers. |
| lastName* | string | Candidate last name. |
| firstName* | string | Candidate first name. |
| llm_model* | string | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
| string |
| French town or postal code, e.g. "Le Mans" or "72000". |
| llm_model* | string | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
| conversation_id | string | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"location",
"context",
"llm_model"
],
"properties": {
"job": {
"type": "string",
"description": "Job or field the person is looking for or hiring for, e.g. \"électricien\", \"cariste\", \"aide-soignant\"."
},
"limit": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Number of agencies to return, 1 to 5. Defaults to 3."
},
"context": {
"type": "string",
"description": "Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers."
},
"purpose": {
"enum": [
"find_job",
"hire",
"assessment",
"training",
"school",
"insertion"
],
"type": "string",
"description": "find_job: a candidate looking for work (default). hire: a company looking to recruit. assessment: a company wanting candidates or staff assessed (Actual Talent). training: vocational training, skills assessment or career change (Envergure). school: a degree or work-study programme (group schools). insertion: return-to-work support."
},
"location": {
"type": "string",
"minLength": 2,
"description": "French town or postal code, e.g. \"Le Mans\" or \"72000\"."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"conversation_id": {
"type": "string",
"description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"context",
"llm_model"
],
"properties": {
"lang": {
"enum": [
"fr",
"en"
],
"type": "string",
"description": "Language of the offer text. Defaults to fr."
},
"slug": {
"type": "string",
"minLength": 1,
"description": "Offer slug, from search_offers or the offer URL."
},
"context": {
"type": "string",
"description": "Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"conversation_id": {
"type": "string",
"description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"dimension",
"context",
"llm_model"
],
"properties": {
"q": {
"type": "string",
"description": "Optional free text to scope the counts."
},
"town": {
"type": "string",
"description": "Optional town or postal code to scope the counts."
},
"context": {
"type": "string",
"description": "Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers."
},
"dimension": {
"enum": [
"contractType",
"family",
"industry",
"region"
],
"type": "string",
"description": "Which filter to list."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"conversation_id": {
"type": "string",
"description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
}
}
}| context* |
| string |
| Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers. |
| industry | array | Industries (exact values from list_offer_facets). |
| pageSize | integer | Results per page, 1 to 20. Defaults to 10. |
| llm_model* | string | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
| agencyCode | string | Only offers handled by this agency: the agency code returned by find_best_agency. |
| contractType | array | Contract types (exact values from list_offer_facets), e.g. ["Contrat de travail temporaire", "CDI"]. |
| conversation_id | string | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"context",
"llm_model"
],
"properties": {
"q": {
"type": "string",
"description": "Free text: job title, skill or keyword, e.g. \"cariste\", \"soudeur TIG\", \"aide-soignant\"."
},
"lang": {
"enum": [
"fr",
"en"
],
"type": "string",
"description": "Language of the offer texts and URLs. Defaults to fr."
},
"page": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Page number, from 1."
},
"sort": {
"enum": [
"relevance",
"date",
"distance"
],
"type": "string",
"description": "Sort order. Defaults to relevance."
},
"town": {
"type": "string",
"description": "French town or postal code to search around, e.g. \"Rennes\" or \"35000\"."
},
"family": {
"type": "array",
"items": {
"type": "string"
},
"description": "Job families (exact values from list_offer_facets)."
},
"radius": {
"anyOf": [
{
"type": "number",
"const": 10
},
{
"type": "number",
"const": 20
},
{
"type": "number",
"const": 50
}
],
"description": "Search radius in km around the town. Defaults to 20."
},
"region": {
"type": "array",
"items": {
"type": "string"
},
"description": "French regions (exact values from list_offer_facets), e.g. [\"Bretagne\"]."
},
"context": {
"type": "string",
"description": "Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers."
},
"industry": {
"type": "array",
"items": {
"type": "string"
},
"description": "Industries (exact values from list_offer_facets)."
},
"pageSize": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Results per page, 1 to 20. Defaults to 10."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"agencyCode": {
"type": "string",
"description": "Only offers handled by this agency: the agency code returned by find_best_agency."
},
"contractType": {
"type": "array",
"items": {
"type": "string"
},
"description": "Contract types (exact values from list_offer_facets), e.g. [\"Contrat de travail temporaire\", \"CDI\"]."
},
"conversation_id": {
"type": "string",
"description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
}
}
}| phoneNumber | string | Candidate phone number, optional. |
| conversation_id | string | Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug",
"firstName",
"lastName",
"email",
"context",
"llm_model"
],
"properties": {
"lang": {
"enum": [
"fr",
"en"
],
"type": "string",
"description": "Language of the application page. Defaults to fr."
},
"slug": {
"type": "string",
"minLength": 1,
"description": "Slug of the offer, from search_offers or get_offer."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 200,
"description": "Candidate email address."
},
"context": {
"type": "string",
"description": "Why are you calling this tool? Describe the job seeker's or recruiter's goal in one short sentence. Do not include names, emails or phone numbers."
},
"lastName": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Candidate last name."
},
"firstName": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Candidate first name."
},
"llm_model": {
"type": "string",
"description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
},
"phoneNumber": {
"type": "string",
"maxLength": 30,
"description": "Candidate phone number, optional."
},
"conversation_id": {
"type": "string",
"description": "Pass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request."
}
}
}