arbeitsagentur-mcp
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., "@arbeitsagentur-mcp Suche Jobs als Softwareentwickler in Berlin"
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.
arbeitsagentur-mcp
MCP server for customers of the German Bundesagentur für Arbeit (Agentur für Arbeit / Jobcenter).
Live public data (no login): Jobbörse search and job ads, Weiterbildungssuche (mein NOW / KURSNET), BERUFENET occupation profiles, Entgeltatlas salaries, Dienststellen finder.
Local case file (SQLite, mode 0600, never leaves your machine): profile, applications / Eigenbemühungen with Nachweis export (Markdown/CSV), Vermittlungsvorschläge, appointments, correspondence with automatic Widerspruch deadlines, tasks,
overviewdashboard.Deadline calculators: Widerspruch (§ 84 SGG, § 37 SGB X incl. the 4-day rule since 2025), Arbeitsuchend-/Arbeitslosmeldung (§§ 38, 141 SGB III), generic periods with weekend/holiday shift for all Bundesländer, ALG duration (§ 147 SGB III).
Letter drafts: Widerspruch, Akteneinsicht/DSGVO, Überprüfungsantrag, Veränderungsmitteilung, Terminabsage, Krankmeldung, Rückmeldung Vermittlungsvorschlag, Bildungsgutschein, Ortsabwesenheit.
rulestool with short, sourced explanations of duties and sanctions.Your own "Meine BA" account (
meineba_*): Postfach (read, download attachments, send after explicit confirmation), Termine, Verlauf, Antragsübersicht, Leistungen, Jobsuche watch list with notes and application status, saved searches.
General information, not legal advice.
Meine BA login
You sign in yourself; the server never sees your password.
meineba_login_start(service="postfach")returns a link tosso.arbeitsagentur.de.Open it in your own browser and sign in (password + second factor, passkey or BundID).
The browser lands on an arbeitsagentur.de page whose address contains
code=…&state=…(the page itself may show an error; that's fine). Copy the full address within about a minute and pass it tomeineba_login_finish.
This is the OpenID Connect authorization-code flow with PKCE that the BA web apps use. Each BA web
app is its own client (postfach, termine, verlauf, antraege, leistungen, jobsuche), so each
needs a login; after the first one your browser's single sign-on makes the others instant. Tokens are
stored in meineba-tokens.json next to the case file (mode 0600, override with
ARBEITSAGENTUR_MCP_TOKENS) and refreshed automatically; meineba_logout ends the sessions.
The endpoints are the ones the BA's own web apps call, not a documented API. They were mapped from the apps' public JavaScript and checked to exist, and the client is tested against a simulated SSO and API, but response formats can differ or change; responses are passed through mostly as-is.
Related MCP server: jobfinder-mcp
Usage
uv run arbeitsagentur-mcp # stdio
claude mcp add arbeitsagentur -- uv --directory /path/to/arbeitsagentur-mcp run arbeitsagentur-mcpOptions: --db PATH (or ARBEITSAGENTUR_MCP_DB; default ~/.local/share/arbeitsagentur-mcp/akte.sqlite3),
--transport streamable-http --host 127.0.0.1 --port 8000.
Tests
uv run pytest # offline
uv run pytest -m live # against the real APIsThe public endpoints and client IDs are those used by the BA's own web apps (see bundesAPI on GitHub). License: MIT.
Nix packaging
nix build builds the arbeitsagentur-mcp executable and its Python runtime from
uv.lock using uv2nix. nix run . -- --help shows the CLI. No network access
is required when running the application build after its pinned inputs have
been fetched. nix flake check runs the offline test suite (56 tests at
introduction); live directory/API requests are excluded. Linux x86_64 and
aarch64 packages are defined; builds were verified on x86_64.
nix develop provides an editable Python environment plus uv. Run pytest or
arbeitsagentur-mcp directly there; changes under src/ take effect immediately.
Run uv lock when changing Python dependencies and commit uv.lock; update
Nix inputs with nix flake update and commit flake.lock.
This project is a per-user stdio tool by default. It has no NixOS service module; there is no public authenticated HTTP deployment. Private databases and user configuration stay outside the Nix store and repository at the paths documented above.
Available Tools
51 toolsadd_applicationB
Record an application (Bewerbung) or a received Vermittlungsvorschlag in the case file.
Inputs: notes, source, status, channel, +9 more. Returns: object
add_appointmentB
Record an appointment (Meldetermin, Beratung, ärztlicher Dienst, Maßnahme, Vorstellungsgespräch).
Missing an invitation from the agency without a good reason has consequences (rules topic 'termine').
Inputs: kind (required), starts_at (required), bring, notes, +4 more. Returns: object
add_taskB
Add a to-do / obligation (e.g. from the Eingliederungsvereinbarung / Kooperationsplan).
Inputs: title (required), due, notes, source. Returns: object
calculate_deadlineARead-onlyIdempotent
Generic period calculation under § 26 SGB X / § 64 SGG (end moves off weekends and holidays), e.g. a 2-week deadline in a letter from the agency.
Inputs: start (required), days, state, weeks, +1 more. Returns: object
complete_taskC
Mark a task as done (default today).
Inputs: task_id (required), notes, done_on. Returns: object
delete_entryBDestructive
Permanently delete one entry from the case file (e.g. a duplicate). Returns the deleted entry.
Inputs: kind (required), entry_id (required). Returns: object
draft_letterA
Draft a letter to the Agentur für Arbeit / Jobcenter using the profile (sender, Kundennummer, responsible office). The user must check, sign and send it; nothing is sent from here.
Inputs: kind (required), params (required), log. Returns: result
find_officesBRead-onlyIdempotent
Find the Agentur für Arbeit, Jobcenter or Familienkasse responsible for an address, with address and web page.
Inputs: query (required), kinds. Returns: object
get_courseBRead-onlyIdempotent
Details of one course date: content, requirements, certificate, cost, funding options, provider contact.
Inputs: date_id (required). Returns: object
get_jobBRead-onlyIdempotent
Full job ad from the Jobbörse: description, locations, employer, contract details, link.
Inputs: reference_number (required). Returns: object
get_professionARead-onlyIdempotent
BERUFENET occupation profile: tasks, access requirements, pay, training, alternatives.
Also returns salary_kldb_code for get_salaries.
Inputs: profession_id (required), sections. Returns: object
get_profileARead-onlyIdempotent
The customer's stored profile plus the list of fields that can be set.
Inputs: no named parameters. Returns: object
get_salariesARead-onlyIdempotent
Gross monthly salaries from the BA Entgeltatlas (median and quartiles of full-time employees).
Useful for judging whether a job offer is reasonable (Zumutbarkeit) and for salary expectations.
Inputs: kldb (required), age, level, gender, +2 more. Returns: object
list_applicationsCRead-onlyIdempotent
List recorded applications, newest first, optionally filtered.
Inputs: limit, since, until, source, +1 more. Returns: object
list_appointmentsARead-onlyIdempotent
List appointments (default: upcoming planned ones).
Inputs: upcoming_only. Returns: object
list_correspondenceCRead-onlyIdempotent
List recorded correspondence, newest first.
Inputs: kind, limit, query, since. Returns: object
list_tasksBRead-onlyIdempotent
List open tasks ordered by due date (optionally including completed ones).
Inputs: include_done. Returns: object
log_correspondenceA
Record a letter, decision, e-mail, call or meeting with the agency / Jobcenter.
For an incoming Bescheid the Widerspruch deadline is calculated and tracked automatically.
Inputs: date (required), kind (required), subject (required), notes, +9 more. Returns: object
meineba_antraegeBRead-onlyIdempotent
Status of the user's applications (Antragsübersicht), e.g. Arbeitslosengeld: what is pending and whether action is expected from the user.
Inputs: limit.
meineba_antragBRead-onlyIdempotent
Details of one application: status, required actions, documents.
Inputs: aue_version (required), vorgangs_id (required).
meineba_gespeicherte_suchenCRead-onlyIdempotent
Saved job searches (Suchaufträge) with e-mail alerts.
Inputs: no named parameters.
meineba_leistungenBRead-onlyIdempotent
Granted benefits and payments as shown in Meine BA.
Inputs: no named parameters.
meineba_login_finishA
Complete a login started with meineba_login_start by exchanging the one-time code.
Inputs: redirect_url (required). Returns: object
meineba_login_startA
Start a login to the user's Meine BA account for one service. Returns a link the USER opens in their own browser to sign in on sso.arbeitsagentur.de; never ask for or handle their password.
Inputs: service (required). Returns: object
meineba_logoutBDestructive
End Meine BA sessions and delete the stored tokens.
Inputs: service. Returns: object
meineba_merklisteBRead-onlyIdempotent
The user's job watch list in the BA Jobsuche, with notes and application status per job.
Inputs: no named parameters.
meineba_merkliste_entfernenADestructive
Remove a job from the Jobsuche watch list (its note and status are lost).
Inputs: reference_number (required).
meineba_merkliste_setzenB
Add a job to the Jobsuche watch list or update its note / application status (BEWORBEN, EINGELADEN, ZUSAGE, ABSAGE).
Inputs: reference_number (required), note, status.
meineba_postfachBRead-onlyIdempotent
List messages in the user's BA Postfach (erhalten = inbox, gesendet, entwurf, geloescht).
Inputs: folder.
meineba_postfach_attachmentB
Download an attachment of a Postfach message (e.g. a Bescheid as PDF) to a local file (mode 0600).
Inputs: save_to (required), message_id (required), attachment_id (required), folder. Returns: object
meineba_postfach_readCRead-onlyIdempotent
Read one Postfach message including its history and attachment list. Opening a message may mark it as read.
Inputs: message_id (required), folder.
meineba_postfach_recipientsARead-onlyIdempotent
Offices the user can write to via the Postfach (Agentur = AA, Jobcenter = JC, ...) and the topics ('bezug') each accepts. Needed before meineba_postfach_send.
Inputs: no named parameters. Returns: object
meineba_postfach_sendA
Send a message to the Agentur für Arbeit / Jobcenter through the user's Postfach.
Without confirm=true this only returns a preview. Sent messages are binding communication with the authority and are recorded in the local case file.
Inputs: text (required), topic (required), subject (required), recipient_id (required), +2 more. Returns: object
meineba_statusBRead-onlyIdempotent
Which Meine BA services are logged in, how long the sessions last, and what each one offers.
Inputs: no named parameters. Returns: object
meineba_termineCRead-onlyIdempotent
Appointments booked with the Agentur für Arbeit / Jobcenter (Termine in Meine BA).
Inputs: now.
meineba_verlaufBRead-onlyIdempotent
History of events in the user's account (applications filed, letters, decisions, documents).
Inputs: limit, before, search.
meineba_verlauf_eintragBRead-onlyIdempotent
One entry of the Verlauf with details and document links.
Inputs: entry_id (required).
objection_deadlineBRead-onlyIdempotent
Last day to file a Widerspruch against a Bescheid (§ 84 SGG, § 37 SGB X), with step-by-step reasoning.
Inputs: letter_date (required), state, delivery, received_on, +1 more. Returns: object
overviewARead-onlyIdempotent
Dashboard of the case file: alerts, upcoming appointments, open deadlines (Widerspruch, tasks, Vermittlungsvorschläge), application count against the monthly requirement.
Inputs: horizon_days. Returns: object
proof_of_applicationsA
Generate the 'Nachweis der Eigenbemühungen' (list of applications) for a period, to hand in or upload in the eServices. Returns the document; optionally also writes it to a file.
Inputs: since (required), until (required), format, output_path. Returns: result
public_holidaysCRead-onlyIdempotent
Public holidays relevant for deadline calculations.
Inputs: year (required), state. Returns: object
registration_deadlinesBRead-onlyIdempotent
Deadlines to register as job-seeking (§ 38 SGB III) and as unemployed (§ 141 SGB III).
Inputs: learned_on, employment_end. Returns: object
rulesBRead-onlyIdempotent
Plain-language summary of the customer's rights and duties on a topic, with legal references.
Inputs: topic (required). Returns: result
search_coursesARead-onlyIdempotent
Search further-training courses (Weiterbildungssuche of mein NOW / KURSNET).
Results list course offers with up to five dates each; pass a date id to get_course for details such as funding (Bildungsgutschein), costs, contacts and requirements.
Inputs: keyword (required), page, size, state, +3 more. Returns: object
search_jobsARead-onlyIdempotent
Search the Jobbörse of the Bundesagentur für Arbeit (jobs, apprenticeships, internships).
Returns condensed offers with reference_number; use get_job for the full ad and
add_application to record an application.
Inputs: page, size, what, where, +8 more. Returns: object
search_professionsARead-onlyIdempotent
Find occupations in BERUFENET; returns profession ids for get_profession.
Inputs: query (required), size. Returns: object
unemployment_benefit_durationBRead-onlyIdempotent
Estimate how long Arbeitslosengeld is paid (§ 147 SGB III).
Inputs: age (required), months_insured_last_5_years (required), months_insured_last_30_months. Returns: object
update_applicationB
Update an application: new status (Eingangsbestätigung, Vorstellungsgespräch, Zusage, Absage ...), dates, notes.
Inputs: application_id (required), notes, status, channel, +6 more. Returns: object
update_appointmentA
Update an appointment: mark as attended (wahrgenommen), cancelled, rescheduled or missed; add outcome notes.
Inputs: appointment_id (required), bring, notes, status, +4 more. Returns: object
update_correspondenceC
Update a correspondence entry, e.g. mark that a Widerspruch has been filed.
Inputs: entry_id (required), notes, subject, summary, +3 more. Returns: object
update_profileB
Set or change profile fields (name, address, Kundennummer, benefit type, Bundesland, dates, counselor ...).
Inputs: fields (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 51 tools
Most tools target distinct resources and actions, and descriptions help separate subtle pairs such as local case-file appointments vs. Meine BA Termine, or recorded correspondence vs. Postfach messages. However, several closely named tools (e.g., list_applications/meineba_antraege, log_correspondence/meineba_postfach_send) require careful reading to avoid misselection.
All tool names use snake_case, but the set mixes English verb_noun patterns (search_jobs, get_job, add_application) with German verb forms (meineba_merkliste_setzen), noun-only tools (overview, rules, public_holidays), and domain-specific prefixes. The result is readable but not fully predictable.
51 tools is excessive for a single MCP server, even given the broad BA/Jobcenter domain, and likely overwhelms tool selection. Each tool is individually meaningful, but the surface would benefit from being split into focused sub-servers.
The surface covers job/course/profession search, case-file CRUD, deadlines, rules, letters, and Meine BA/Postfach operations with few dead ends. Minor gaps remain: no delete/update for tasks or correspondence, no delete for appointments, and no direct Widerspruch filing tool.
Maintenance
Related MCP Connectors
Search jobs, prepare resumes and cover letters, retrieve PDFs, and track your applications.
Search jobs, tailor your resume, write cover letters, and file applications for you.
Analyze job listings against your resume, track applications, and generate cover letters.
OpeningsFirst reads 100,000+ company career sites in the US and India twice a day. Search jobs by role, city, skills or company; see what's new for your alerts; open a job in full; manage alerts and saved jobs; get help preparing an application. Requires an OpeningsFirst Pro plan.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables comprehensive search and browsing of Berlin city services. Also supports PDF form discovery, analysis, and filling with resilient caching.186MIT
- FlicenseAqualityDmaintenanceEnables searching job listings, tracking applications, managing resumes, and tailoring resumes to job posts, all locally via MCP.20-
- AlicenseAqualityBmaintenanceFree MCP and skills for remote and overseas job search across Himalayas, Jobicy, Arbeitnow and company ATS boards, with source links and eligibility checks. Optional local drafts, authorized email sending and reply tracking. Hosted MCP: https://mcp.worldrole.work/mcp — free anonymous access to 20 distinct jobs per network per UTC day, or 50 per free account; other request limits apply.914MIT
- AlicenseAqualityCmaintenanceEnables AI agents to retrieve the verbatim text of German federal and state statutes, search official case law from BGH, BAG and BVerfG, and compute procedurally exact deadlines under §§ 187–193 BGB with weekend and public-holiday adjustment. It also supplies structured statutory-element blueprints with burden-of-proof allocation and assembles citation-secured research dossiers for pleadings.6MIT