<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nick Schäfer</title>
    <description>The latest articles on DEV Community by Nick Schäfer (@lintelly).</description>
    <link>https://dev.to/lintelly</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4223955%2F2687ecc2-295f-47c4-8fef-a5cf2509edf4.png</url>
      <title>DEV Community: Nick Schäfer</title>
      <link>https://dev.to/lintelly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lintelly"/>
    <language>en</language>
    <item>
      <title>I built an open MCP server for German employment law, every number with its source</title>
      <dc:creator>Nick Schäfer</dc:creator>
      <pubDate>Tue, 03 Nov 2026 09:48:45 +0000</pubDate>
      <link>https://dev.to/lintelly/i-built-an-open-mcp-server-for-german-employment-law-every-number-with-its-source-5c9j</link>
      <guid>https://dev.to/lintelly/i-built-an-open-mcp-server-for-german-employment-law-every-number-with-its-source-5c9j</guid>
      <description>&lt;p&gt;I have worked in HR in Germany for more than seven years. I have run over 1,000 interviews and made more than 100 hires. In small companies, the same questions come up every week, usually from a founder who does HR next to everything else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When does a notice have to arrive so the contract ends this month?&lt;/li&gt;
&lt;li&gt;Someone has been sick for three weeks. How long do I keep paying?&lt;/li&gt;
&lt;li&gt;What does a minijob cost me compared to a part-time hire?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;People now ask these questions in Claude or ChatGPT. The text is usually fine. The numbers are the problem: a date or an amount that comes from model memory, with no way to check it. So I built Lintelly Open MCP (in the Claude directory: Lintelly HR Deutschland), an open MCP server for German employment and social insurance law.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;An MCP server is a set of tools an assistant can call instead of answering from memory. This one covers Germany only, and it is meant for founders and small companies.&lt;/p&gt;

&lt;p&gt;It has 38 tools in a few groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workflows:&lt;/strong&gt; &lt;code&gt;ablauf&lt;/code&gt; returns a dated workflow for a situation, such as the first hire, onboarding, offboarding, sickness, maternity protection, parental leave, preparing a dismissal, end of probation, end of a fixed term and month-end payroll.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadlines:&lt;/strong&gt; notice periods, the deadline for a dismissal claim, probation, fixed-term contracts, parental leave, maternity protection, retention periods, breaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Money:&lt;/strong&gt; employer costs, minijobs, minimum wage check, continued pay during sickness, payment in lieu of holiday, a rule-of-thumb severance formula, the levy for unfilled disability quota.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holiday, duties, letters, contracts:&lt;/strong&gt; holiday entitlement, size thresholds, special dismissal protection, BEM duty, letters such as notices, warnings and references, a library of 126 contract clauses, and a register of 200+ legal values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every answer has the same shape: &lt;code&gt;ergebnis&lt;/code&gt; (result), &lt;code&gt;rechenweg&lt;/code&gt; (calculation steps), &lt;code&gt;quellen&lt;/code&gt; (norm, official link, check date, status), &lt;code&gt;fallen&lt;/code&gt; (common mistakes), &lt;code&gt;naechster_schritt&lt;/code&gt; (next step) and &lt;code&gt;hinweis&lt;/code&gt; (the disclaimer). Here is a shortened real response from &lt;code&gt;kuendigungsfrist_rechnen&lt;/code&gt; for someone who started on 1 September 2023 and receives notice on 20 November 2026:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ergebnis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ende"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-12-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"spaetester_zugang"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-11-30"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"regel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1 Monat zum Monatsende"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"norm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"§ 622 Abs. 2 BGB"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rechenweg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Betriebszugehörigkeit am Zugangstag: 3 volle Jahre."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Gesetzliche Frist: 1 Monat zum Monatsende (§ 622 Abs. 2 BGB)."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"quellen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"norm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"§ 622 Abs. 2 BGB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.gesetze-im-internet.de/bgb/__622.html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"geprueft_am"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bestätigt"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hinweis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allgemeine Auskunft, keine Rechtsberatung im Einzelfall."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The field names are German because the law is German. The assistant answers in the language of your question.&lt;/p&gt;

&lt;p&gt;A few design choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The server only calculates. It never calls a model. Your assistant writes the text, the numbers come from the tool.&lt;/li&gt;
&lt;li&gt;Each legal value has a norm, an official source and a check date. Values are checked against the official text every month. If a check is overdue, the answer says so, and values that are not yet confirmed carry the status "noch nicht bestätigt".&lt;/li&gt;
&lt;li&gt;The tools have no fields for names. They take dates, hours, amounts and choices. Inputs are not stored or logged. Only calls per tool and day are counted, with coarse bands such as company size and federal state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to connect it
&lt;/h2&gt;

&lt;p&gt;The remote server is &lt;code&gt;https://hr.lintelly.com/mcp&lt;/code&gt; (Streamable HTTP). There is no account, no key and no sign-in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http lintelly-hr-deutschland https://hr.lintelly.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Claude (web, desktop, mobile):&lt;/strong&gt; Settings, Connectors, add a custom connector with the address &lt;code&gt;https://hr.lintelly.com/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT:&lt;/strong&gt; Settings, Apps and Connectors, developer mode, create a connector with the address &lt;code&gt;https://hr.lintelly.com/mcp&lt;/code&gt;, authentication: none.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini CLI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini extensions &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/Lintelly/lintelly-hr-deutschland
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Local over stdio, for example Claude Desktop or Cursor:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lintelly-hr-deutschland"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@lintelly/hr-deutschland"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Docker:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; ghcr.io/lintelly/lintelly-hr-deutschland
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Questions you can ask
&lt;/h2&gt;

&lt;p&gt;Ask the way you would ask an HR lead. If something is missing, the assistant should ask back instead of guessing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I'm hiring my first employee, 20 hours a week, starting 1 December. What do I need to do?"&lt;/li&gt;
&lt;li&gt;"What does a minijob cost me, and what does a part-time employee on 1,800 gross cost?"&lt;/li&gt;
&lt;li&gt;"Someone has been sick for three weeks. How long do I pay, and do I get anything back?"&lt;/li&gt;
&lt;li&gt;"My employee is pregnant. What applies now?"&lt;/li&gt;
&lt;li&gt;"How much holiday does someone with 3 days a week get, and does last year's leave expire?"&lt;/li&gt;
&lt;li&gt;"From what size do I need a data protection officer or a works council?"&lt;/li&gt;
&lt;li&gt;"What changes for me on 1 January?"&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The limits
&lt;/h2&gt;

&lt;p&gt;This is the part I care about most, as someone who does HR for a living.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It gives information, not legal advice.&lt;/strong&gt; Every answer is general information, not advice for an individual case. For a dismissal, a warning or a dispute, a person should check whether it fits your case before anything is sent. The tools say this themselves in those answers. For a legal dispute you need an employment lawyer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Germany only.&lt;/strong&gt; It does not answer for Austria, Switzerland or anywhere else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is only as good as its values.&lt;/strong&gt; That is why every value shows its source and check date, so you can verify it yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code and feedback
&lt;/h2&gt;

&lt;p&gt;The code is MIT, the content is CC BY 4.0, and the repo is here: &lt;a href="https://github.com/Lintelly/lintelly-hr-deutschland" rel="noopener noreferrer"&gt;https://github.com/Lintelly/lintelly-hr-deutschland&lt;/a&gt;. Setup for every client is on &lt;a href="https://lintelly.com/hr" rel="noopener noreferrer"&gt;https://lintelly.com/hr&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you find a wrong number, a missing case or a bug, please open an issue or write to &lt;a href="mailto:nick@lintelly.com"&gt;nick@lintelly.com&lt;/a&gt;. Reports of wrong values are the most useful thing you can send me.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>opensource</category>
      <category>hr</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
