Skip to main content
Glama

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, overview dashboard.

  • 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.

  • rules tool 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.

  1. meineba_login_start(service="postfach") returns a link to sso.arbeitsagentur.de.

  2. Open it in your own browser and sign in (password + second factor, passkey or BundID).

  3. 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 to meineba_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-mcp

Options: --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 APIs

The 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 tools
add_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_deadlineA
Read-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_entryB
Destructive

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_officesB
Read-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_courseB
Read-onlyIdempotent

Details of one course date: content, requirements, certificate, cost, funding options, provider contact.

Inputs: date_id (required). Returns: object

get_jobB
Read-onlyIdempotent

Full job ad from the Jobbörse: description, locations, employer, contract details, link.

Inputs: reference_number (required). Returns: object

get_professionA
Read-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_profileA
Read-onlyIdempotent

The customer's stored profile plus the list of fields that can be set.

Inputs: no named parameters. Returns: object

get_salariesA
Read-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_applicationsC
Read-onlyIdempotent

List recorded applications, newest first, optionally filtered.

Inputs: limit, since, until, source, +1 more. Returns: object

list_appointmentsA
Read-onlyIdempotent

List appointments (default: upcoming planned ones).

Inputs: upcoming_only. Returns: object

list_correspondenceC
Read-onlyIdempotent

List recorded correspondence, newest first.

Inputs: kind, limit, query, since. Returns: object

list_tasksB
Read-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_antraegeB
Read-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_antragB
Read-onlyIdempotent

Details of one application: status, required actions, documents.

Inputs: aue_version (required), vorgangs_id (required).

meineba_gespeicherte_suchenC
Read-onlyIdempotent

Saved job searches (Suchaufträge) with e-mail alerts.

Inputs: no named parameters.

meineba_leistungenB
Read-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_logoutB
Destructive

End Meine BA sessions and delete the stored tokens.

Inputs: service. Returns: object

meineba_merklisteB
Read-onlyIdempotent

The user's job watch list in the BA Jobsuche, with notes and application status per job.

Inputs: no named parameters.

meineba_merkliste_entfernenA
Destructive

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_postfachB
Read-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_readC
Read-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_recipientsA
Read-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_statusB
Read-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_termineC
Read-onlyIdempotent

Appointments booked with the Agentur für Arbeit / Jobcenter (Termine in Meine BA).

Inputs: now.

meineba_verlaufB
Read-onlyIdempotent

History of events in the user's account (applications filed, letters, decisions, documents).

Inputs: limit, before, search.

meineba_verlauf_eintragB
Read-onlyIdempotent

One entry of the Verlauf with details and document links.

Inputs: entry_id (required).

objection_deadlineB
Read-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

overviewA
Read-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_holidaysC
Read-onlyIdempotent

Public holidays relevant for deadline calculations.

Inputs: year (required), state. Returns: object

registration_deadlinesB
Read-onlyIdempotent

Deadlines to register as job-seeking (§ 38 SGB III) and as unemployed (§ 141 SGB III).

Inputs: learned_on, employment_end. Returns: object

rulesB
Read-onlyIdempotent

Plain-language summary of the customer's rights and duties on a topic, with legal references.

Inputs: topic (required). Returns: result

search_coursesA
Read-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_jobsA
Read-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_professionsA
Read-onlyIdempotent

Find occupations in BERUFENET; returns profession ids for get_profession.

Inputs: query (required), size. Returns: object

unemployment_benefit_durationB
Read-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

    B3.2/5.0

    Scored across 51 tools

    Disambiguation4/5

    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.

    Naming Consistency3/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityNo data
    ResponsivenessSyncing

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      A
      quality
      D
      maintenance
      Enables searching job listings, tracking applications, managing resumes, and tailoring resumes to job posts, all locally via MCP.
      20
      -
    • A
      license
      A
      quality
      B
      maintenance
      Free 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.
      9
      14
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables 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.
      6
      MIT