<?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: Toine</title>
    <description>The latest articles on DEV Community by Toine (@tonietonie).</description>
    <link>https://dev.to/tonietonie</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%2F4012031%2F06ef0a60-9503-428c-8786-c330f74c4692.jpeg</url>
      <title>DEV Community: Toine</title>
      <link>https://dev.to/tonietonie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tonietonie"/>
    <language>en</language>
    <item>
      <title>I gave 360 browser tools an MCP server. Here is what broke.</title>
      <dc:creator>Toine</dc:creator>
      <pubDate>Mon, 05 Oct 2026 14:34:27 +0000</pubDate>
      <link>https://dev.to/tonietonie/i-gave-360-browser-tools-an-mcp-server-here-is-what-broke-39g6</link>
      <guid>https://dev.to/tonietonie/i-gave-360-browser-tools-an-mcp-server-here-is-what-broke-39g6</guid>
      <description>&lt;p&gt;I run ToolForte. It is a site with 360 small tools: merge a PDF, validate an IBAN, parse a cron line, diff two texts. Most of them run in the browser, so the file never leaves your machine. I built it for people who do not want an account for a five second job.&lt;/p&gt;

&lt;p&gt;Then I started using Claude and Cursor for real work and noticed I was copying results out of my own site into a chat. That is silly. The tools are deterministic. An agent should be able to call them.&lt;/p&gt;

&lt;p&gt;So I gave the site an MCP server. This is what I learned, including the parts that went wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first version was too big to be useful
&lt;/h2&gt;

&lt;p&gt;The obvious move is to expose everything. I did. The server listed 111 tools, later 180. It worked, technically. In practice a list that size eats a large slice of the context window before the agent has done anything. And the agent picks the wrong tool more often, because twelve of them sound alike.&lt;/p&gt;

&lt;p&gt;The fix was progressive disclosure. The server now shows 14 tools by default. Those cover most jobs. A search tool finds the other 166 by name or by what you need. A registry or a power user can ask for the full list with &lt;code&gt;?tools=all&lt;/code&gt; on the endpoint. Same server, two views.&lt;/p&gt;

&lt;h2&gt;
  
  
  Registries score you on metadata, not on what the tools do
&lt;/h2&gt;

&lt;p&gt;I listed the server on Smithery and got a quality score of 43 out of 100. The tools worked. The score was about what the listing said about them. No titles. Thin parameter descriptions. No output schema. No annotations saying which tools are read only.&lt;/p&gt;

&lt;p&gt;I went through all of them. Every tool got a title, a description per parameter, an output schema with structured content, and annotations. The score went to 96. Nothing about the tools changed. If you publish an MCP server, do this first. It is what an agent reads to decide whether to call you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version numbers drift when nothing ties them together
&lt;/h2&gt;

&lt;p&gt;My registry manifest said 1.10.0. The server told every client it was 1.8.0. The number was typed by hand in the handler and nothing checked it against the manifest that gets published. Two releases went out like that.&lt;/p&gt;

&lt;p&gt;Now the handler reads its version from the manifest file. The publish script asks the live server for its version and refuses to publish while the two differ. Boring, but it is the kind of thing a registry scan flags and you do not notice yourself.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;150 deterministic utilities. IBAN and VAT validation, cron parsing, regex testing, date maths, unit conversion, hashing, JSON and text tools.&lt;/li&gt;
&lt;li&gt;14 render tools. HTML or a URL in, a hosted PDF or screenshot out, as a signed link that lives for 24 hours.&lt;/li&gt;
&lt;li&gt;Workflows. Chain tools into one job, save it, and let an agent run it by id.&lt;/li&gt;
&lt;li&gt;Memory that survives between sessions.&lt;/li&gt;
&lt;li&gt;6 AI tools for the jobs that are not deterministic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Free to try without a key: 3 renders a day. Pro is 19 euro a month. That buys a monthly balance of credits, and the API, the MCP server and the AI tools all draw from the same one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding it takes about thirty seconds
&lt;/h2&gt;

&lt;p&gt;Remote server, streamable HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://toolforte.com/api/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Desktop, Cursor, ChatGPT and the others each have a config screen for this; the exact steps per client are on &lt;a href="https://toolforte.com/mcp" rel="noopener noreferrer"&gt;toolforte.com/mcp&lt;/a&gt;. If you prefer stdio, &lt;code&gt;npx toolforte-mcp&lt;/code&gt; wraps the same endpoint. The server is in the official registry as &lt;code&gt;io.github.Toinedotcom/toolforte&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The same 150 tools are also a plain REST API, documented at &lt;a href="https://toolforte.com/developers" rel="noopener noreferrer"&gt;toolforte.com/developers&lt;/a&gt;. Everything is searchable in one box at &lt;a href="https://toolforte.com/everything" rel="noopener noreferrer"&gt;toolforte.com/everything&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I want to know from you
&lt;/h2&gt;

&lt;p&gt;Which tool is missing? I add deterministic ones quickly. If your agent calls the server and something comes back wrong, tell me the tool and the input. I will look at it the same day.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>api</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Dutch test data that passes validation: BSN, IBAN, UPA</title>
      <dc:creator>Toine</dc:creator>
      <pubDate>Mon, 05 Oct 2026 14:31:05 +0000</pubDate>
      <link>https://dev.to/tonietonie/dutch-test-data-that-passes-validation-bsn-iban-upa-5ajc</link>
      <guid>https://dev.to/tonietonie/dutch-test-data-that-passes-validation-bsn-iban-upa-5ajc</guid>
      <description>&lt;p&gt;I work as a test manager on pension projects in the Netherlands. Each one of them needs test data that looks Dutch and passes the checks the system runs, without being a real person. Each of them started with someone typing numbers by hand until the validator stopped complaining.&lt;/p&gt;

&lt;p&gt;I got tired of that and built the generators I kept needing. They are free, they run in the browser, and this is what is in them and what I learned making them.&lt;/p&gt;

&lt;h2&gt;
  
  
  BSN: the check is the elfproef
&lt;/h2&gt;

&lt;p&gt;A BSN is nine digits. The check is the elfproef. Multiply the digits by 9, 8, 7, 6, 5, 4, 3, 2, and the last one by minus 1. Add them up. The total has to divide by 11. Most made up numbers fail. A generator that only knows "nine digits" produces test data that gets rejected at the first form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://toolforte.com/tools/test-bsn-generator" rel="noopener noreferrer"&gt;Test BSN generator&lt;/a&gt; gives you numbers that pass the elfproef. They are valid by checksum, not registered to anyone I know of, and meant for test environments only. Do not put them in production and do not use them to impersonate anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  IBAN: do not run the elfproef on it
&lt;/h2&gt;

&lt;p&gt;This one cost me time. The old Dutch bank account numbers had an elfproef of their own. The IBAN does not. NL IBANs use the standard mod 97 check and nothing else. Since 1 July 2020 banks issue account numbers that do not pass the old elfproef, and some validators still reject them. If your test IBAN validator fails on a real ING account, this is why.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://toolforte.com/tools/test-iban-generator" rel="noopener noreferrer"&gt;Test IBAN generator&lt;/a&gt; makes IBANs that pass mod 97 for NL and other countries, with a real bank code in the right position. The &lt;a href="https://toolforte.com/tools/iban-validator" rel="noopener noreferrer"&gt;IBAN validator&lt;/a&gt; is the one I use to check what a supplier sends me. It knows that the bank code sits at a different position per country: Italy starts at position 5, Germany has eight digits. The naive &lt;code&gt;substring(4, 8)&lt;/code&gt; everyone writes first is wrong for a third of Europe.&lt;/p&gt;

&lt;h2&gt;
  
  
  UPA and BRP: whole files, not single values
&lt;/h2&gt;

&lt;p&gt;Pension administration in the Netherlands runs on UPA deliveries from employers. Testing that chain means you need an UPA file with a plausible mix of employments, salaries and dates. And you need twenty of them, not one. Typing those in XML by hand is how a week disappears.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://toolforte.com/tools/upa-file-generator" rel="noopener noreferrer"&gt;UPA file generator&lt;/a&gt; builds a complete file from a few settings. The &lt;a href="https://toolforte.com/tools/brp-test-data-generator" rel="noopener noreferrer"&gt;BRP test data generator&lt;/a&gt; does the same for person records: names, birth dates, addresses that fit together, BSNs that pass. Both run locally in the browser. Nothing you generate is sent anywhere, which matters when the test environment is under an NDA.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the Dutch set
&lt;/h2&gt;

&lt;p&gt;Everything Dutch is grouped on &lt;a href="https://toolforte.com/netherlands" rel="noopener noreferrer"&gt;toolforte.com/netherlands&lt;/a&gt;. A &lt;a href="https://toolforte.com/tools/vat-number-checker" rel="noopener noreferrer"&gt;VAT number checker&lt;/a&gt;. &lt;a href="https://toolforte.com/tools/dutch-working-days-calculator" rel="noopener noreferrer"&gt;Working days between two dates&lt;/a&gt; with Dutch public holidays. Holiday allowance, notice periods, severance. The test data tools by themselves are on &lt;a href="https://toolforte.com/test-data" rel="noopener noreferrer"&gt;toolforte.com/test-data&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you write test automation, the same generators are callable from an API and from an MCP server. A test can ask for a fresh valid BSN instead of reading one from a fixture file. Fixture files are what someone eventually copies into production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I still want
&lt;/h2&gt;

&lt;p&gt;I keep a list of checks that Dutch systems run on incoming data and I add generators when I hit a new one. If your project validates something I do not cover yet, tell me which field and which rule.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>testdata</category>
      <category>netherlands</category>
    </item>
  </channel>
</rss>
