
Der Sachbearbeiter bei der Arbeit.
amt is a personal job-search toolkit: a CLI plus an MCP server (amt-mcp) that puts a
clerk — der Sachbearbeiter — inside your AI coding agent. It crawls job APIs
(6 ATS platforms, the Arbeitnow board, and the Bundesagentur für Arbeit), keeps one markdown note per posting that matches your
stack, and files everything else in a seen-ledger so it never resurfaces. You judge,
it stamps, and prepare renders CV + cover letter (PDF/txt/md) into an upload-ready folder.
The easiest way to set up amt is to not set it up yourself. Install the binaries, wire up your agent, and then just talk:
pnpm add -g @fabkho/amt # installs the amt + amt-mcp binaries
claude mcp add --scope user amt -- amt-mcp # or the plugin, see belowThen tell your agent who you are — your stack, salary floor, cities or remote,
what your CV should say (pointing it at an existing CV, PDF or LinkedIn export,
works great as a starting point), how your cover letters should sound. It writes your
profile.yaml and cv-data.<lang>.yaml into AMT_HOME (default ~/.config/amt/),
which is exactly what the MCP server reads. No forms, no typing YAML by hand.
Where things land is yours to choose, via paths in profile.yaml:
notesDir is where the job notes go — any folder works, and an Obsidian vault works
great (the frontmatter shows up as properties, and the self-updating _index.md links
every note). outputBase is where prepare drops the upload-ready application folders.
"Set up amt for me: I'm a senior React/Go dev in Hamburg, remote-only, floor 80k. Here's my CV: …"
Prefer doing it by hand? amt doctor checks the office is open (and installs Chromium
for PDFs), amt init walks you through it interactively.
The full experience is one word to your agent: "update" — it crawls every
source including the agent channels (LinkedIn & Co.), ranks everything new
against your profile, and files the day's arrivals in inbox/<date>.md next
to your notes (the index links every day that still has unranked mail).
The same loop by hand:
amt sources add shopware # track a company — its ATS is discovered automatically
amt crawl # fetch APIs + tool-crawled channels (LinkedIn, VueJobs)
amt list --status new # today's stack of files
amt show <slug> # one posting, full description
amt status <slug> shortlist --score 85 # der Stempel
amt prepare <slug> --lang en # CV + letter → upload-ready folder
amt status <slug> applied # case closed. next window, pleaseStatuses: new → shortlist → applied → interview (or rejected / cut — with
--reason, because an Amt files even its rejections properly). Also on duty:
amt import <url> for pasted ATS links (--company/--title for LinkedIn & co.).
The _index.md overview in your notes directory keeps itself current.
amt doesn't just find jobs — it produces the application. amt prepare <slug>
builds an upload-ready folder: your CV rendered from cv-data.<lang>.yaml
(one file per language, de/en) and a cover letter drafted the civilized way:
the first run scaffolds cover-letter.<lang>.md, you write it with your agent
in chat — carrying your tone rules from profile.yaml (the write-application
prompt does exactly this) — and the second run renders everything to PDF, html,
and txt. Templates are plain Nunjucks + CSS (templates/), PDFs come out of
real Chromium, so what you preview is what HR gets.
amt crawls official job APIs directly: boards like Arbeitnow, the
Bundesagentur für Arbeit Jobsuche (Germany's largest job database — queried along
your stack keywords and cities), and the career pages of companies you track — amt sources add <company> auto-discovers
which ATS they use (Recruitee, Ashby, Greenhouse, Lever, Personio, SmartRecruiters).
Sites without an API go into sources.yaml as a channel: a recipe in the
same file. A channel with a crawl: block (URL template + a parse spec — CSS
selectors, regex, or JSON paths) is fetched by the tool itself, right alongside
the boards; amt init seeds tool-crawled recipes for LinkedIn and VueJobs. A
channel with only a free-form recipe: and no crawl: block stays
agent-executed — the tool stores it and your agent runs it during a round (good
for detail pages behind a bot wall, like StepStone). Add render: true to a
crawl: block and amt fetches the page through the bundled Chromium for
JS-rendered sites.
So amt crawl genuinely fetches everything with a machine spec — the only step
that still needs the agent is judgment (ranking). Recipes are just data: tweak a
selector or keyword and the very next crawl uses it, no release required.
The MCP server is the recommended way to use amt — the CLI is the paper
form, the agent is the clerk who fills it in. amt-mcp exposes the tools
(crawl, import, status, prepare, channels), job:// resources, and two
workflow prompts (daily-update, write-application) carrying your profile
and tone rules. The agent drafts with you in chat; the logic stays in code.
One verb, four levels of formality — they all reach the same loop:
| You say | Surface | What runs |
|---|---|---|
| "update" | skill trigger phrase | the daily-update workflow |
/amt:daily-update |
MCP prompt | crawl_jobs → channels → rank → inbox delta |
| — | crawl_jobs tool |
fetches APIs + tool-crawled channels, returns the rest to do |
amt crawl |
CLI | the deterministic sub-step only (ranking still needs the agent) |
amt crawl deliberately isn't called update: the bare binary can't run
channels or judge fit, so it fetches what it can and says what's left.
- Claude Code:
/plugin marketplace add fabkho/amt→/plugin install amt@amt(bundles the MCP server + workflow skills, with auto-updates) - Codex CLI:
codex mcp add amt -- amt-mcp+ copyskills/to~/.agents/skills/ - Cursor / Zed: point a stdio MCP server at
amt-mcp - pi: copy
pi-extension/to~/.pi/agent/extensions/amt/
- Node ≥ 22 and pnpm (
corepack enable; if a global install complains about a missing global bin dir, runpnpm setupand restart your shell). amtbehaves strangely / prints nonsense: macOS ships a deprecated/usr/sbin/amt. If it shadows the real one, add to the END of your~/.zshrc:export PATH="$PNPM_HOME:$PATH"—which amtshould point into your pnpm dir.
pnpm install && pnpm lint && pnpm build && pnpm typecheck && pnpm test —
rules and architecture in CONTRIBUTING.md.