<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Routed Logic Blog</title>
        <link>https://routedlogic.net/E6P49T7hrnAOcWud</link>
        <description>Routed Logic Blog</description>
        <lastBuildDate>Wed, 13 Aug 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[MCP Server Tooling]]></title>
            <link>https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling</link>
            <guid>https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling</guid>
            <pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[I've recently decided to buy into the Model Context Protocol (MCP) server hype and started utilizing some MCP tools.]]></description>
            <content:encoded><![CDATA[<p>I've recently decided to buy into the Model Context Protocol (MCP) server hype and started utilizing some MCP tools.</p>
<p>Here's my take on the quickest way to get started with MCP tooling, as well as my thoughts on MCP more generally as I went through the process of setting things up and actually using them.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-is-mcp-and-why-should-you-care">What is MCP and why should you care?<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#what-is-mcp-and-why-should-you-care" class="hash-link" aria-label="Direct link to What is MCP and why should you care?" title="Direct link to What is MCP and why should you care?" translate="no">​</a></h2>
<p>The Model Context Protocol (MCP) is a standardized way for AI tools to interact with external services, databases, and APIs. Think of it as a universal translator that allows your AI assistant to work with your local development environment, databases, and tools in a secure, controlled manner (in theory).</p>
<p>The concept seems to be that you can provide the context necessary to do things without having to explain it every time as part of the prompt or in other ways that may produce highly variable results.</p>
<p>It was a little surprising to me to find that, under the hood and contrary to some of the hype, there's no Matrix-esque knowledge injection going on; at this point, it's mostly just pretty basic keyword-based cues, guidance on how to run commands, use templates, and talk to API endpoints.</p>
<p>That, however, does appear to be a good thing, as it means using tools in this way can be understood by us mere mortals and that they can be used to get consistently reliable results—something that LLMs are not great at and still struggle with.</p>
<p>MCP is documented at <a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer" class="">modelcontextprotocol.io</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="running-mcp-servers-with-docker-desktop">Running MCP Servers with Docker Desktop<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#running-mcp-servers-with-docker-desktop" class="hash-link" aria-label="Direct link to Running MCP Servers with Docker Desktop" title="Direct link to Running MCP Servers with Docker Desktop" translate="no">​</a></h2>
<p>The easiest way to get started with MCP, for most people, is most likely going to be via Docker Desktop's new AI-focused features, in particular via the <a href="https://docs.docker.com/ai/mcp-catalog-and-toolkit/toolkit/" target="_blank" rel="noopener noreferrer" class="">MCP Toolkit</a>.</p>
<p>Docker's own documentation sums it up nicely: "<em>The Docker MCP Toolkit is a gateway that lets you set up, manage, and run containerized MCP servers and connect them to AI agents. It removes friction from tool usage by offering secure defaults, one-click setup, and support for a growing ecosystem of LLM-based clients. It is the fastest way from MCP tool discovery to local execution.</em>"</p>
<p>Not surprisingly, Docker Desktop implements MCP Toolkit using containers, which seems to be a common way of providing and deploying MCP tooling. Depending on your choice of MCP tools, Docker Desktop will run a single container that handles multiple tool calls, or multiple containers proxied via a central MCP server container.</p>
<p>If you're not using Docker Desktop, you can find it <a href="https://www.docker.com/products/docker-desktop/" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>Once you've got Docker Desktop running, find your way into the Docker Desktop Settings and enable the following beta features, at a minimum:</p>
<p><img decoding="async" loading="lazy" alt="Docker Desktop Beta Features - Enable AI-focused beta features in Docker Desktop settings" src="https://routedlogic.net/assets/images/docker-desktop-beta-features-223065af5124430810192cc737f464c3.png" width="2878" height="2314" class="img_ev3q"></p>
<p>You should then get an "MCP Toolkit (BETA)" option in the menu to the left.</p>
<p>Clicking on that will show you that there are no MCP servers installed yet,</p>
<p><img decoding="async" loading="lazy" alt="Docker Desktop Empty MCP Toolkit - Initial empty state of the MCP Toolkit" src="https://routedlogic.net/assets/images/docker-desktop-mcp-toolkit-empty-9fdb8a36c507f7f46613b1aca7d233bb.png" width="2878" height="2430" class="img_ev3q"></p>
<p>Note that you now have links with bracketed numbers next to them, e.g., the "Servers," "Catalog," "Clients," and "OAuth" links.</p>
<p>Clicking on these will show you:</p>
<ul>
<li class=""><strong>Servers</strong> - a list of installed MCP servers.</li>
<li class=""><strong>Catalog</strong> - a list of available MCP servers from the Docker-managed catalog.</li>
<li class=""><strong>Clients</strong> - a list of local MCP clients that Docker can support, e.g., Cursor, Claude Code, Gemini CLI, etc.</li>
<li class=""><strong>OAuth</strong> - if configured, information about a grant that the MCP Toolkit will use to access your GitHub account.</li>
</ul>
<p>Before doing anything further, you should configure your clients by clicking on "Clients".</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="clients">Clients<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#clients" class="hash-link" aria-label="Direct link to Clients" title="Direct link to Clients" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="configuration">Configuration<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no">​</a></h3>
<p>If Docker Desktop detects that a supported client is already installed, you'll be offered an immediate "Connect" button.</p>
<p>For instance, I'm using Cursor and the Gemini CLI, hence I have "Connect" available, while the clients I don't have show "Download" buttons.</p>
<p>Most of the time, if the tool is installed, you just click "Connect" and then restart the client if it's already running. That should be all you have to do.</p>
<p>With Cursor or any other VS Code-based client, you can connect only to specific projects if desired; however, by default, the MCP server will be available to all projects.</p>
<p>For as-yet undetected or unsupported clients, you can still very quickly get them up and running using the Docker Desktop instructions that you'll find at the bottom of the Clients page,</p>
<p><img decoding="async" loading="lazy" alt="Docker Desktop MCP Toolkit Client Manual Configuration - Manual configuration options for unsupported clients" src="https://routedlogic.net/assets/images/docker-desktop-mcp-toolkit-client-manual-configuration-df5767c15a5a277f81606d1677bf7675.png" width="2878" height="2430" class="img_ev3q"></p>
<p>For example, to get Warp to use the Docker Desktop MCP server, I configured it as follows:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Docker Desktop"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"command"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"docker"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"args"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"mcp"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gateway"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"run"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"env"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"working_directory"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="verifying-connection">Verifying Connection<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#verifying-connection" class="hash-link" aria-label="Direct link to Verifying Connection" title="Direct link to Verifying Connection" translate="no">​</a></h3>
<p>You can view the logs within Warp to confirm it's all up and running, as well as see a list of MCP tools that are advertised by the MCP server. In this case, I've already added the Git reference server, and you can now see the list of tools available.</p>
<p><img decoding="async" loading="lazy" alt="Warp MCP Client Config with Logs - Warp showing successful MCP connection and available tools" src="https://routedlogic.net/assets/images/warp-mcp-client-running-4e24107e39b203cf8c9f6c232b7fdf8d.png" width="3172" height="1914" class="img_ev3q"></p>
<p>This was simply after clicking "Add MCP Server" in Docker Desktop.</p>
<p><img decoding="async" loading="lazy" alt="Docker Desktop add Git Reference MCP Server - Adding the Git Reference MCP server from the catalog" src="https://routedlogic.net/assets/images/docker-desktop-mcp-toolkit-catalog-reference-git-9299140969f177bc249ce38e8aba65cd.png" width="2872" height="3190" class="img_ev3q"></p>
<p>Gemini CLI can tell you that it is indeed connected to an MCP server but not much else with the mcp list command on the CLI.</p>
<p><img decoding="async" loading="lazy" alt="Gemini CLI MCP server list - Gemini CLI showing connected MCP server" src="https://routedlogic.net/assets/images/gemini-cli-mcp-server-list-91592db754099bb6213f62a9291f6fe6.png" width="2010" height="698" class="img_ev3q"></p>
<p>It will also tell you if it is connected to an MCP server with no tools when you first open the CLI (this was prior to installing the Git MCP tools). Note, though, that it considers many of its built-in tooling capabilities to be MCP server tools if asked about what it has.</p>
<p><img decoding="async" loading="lazy" alt="Gemini CLI no MCP server tools - Gemini CLI showing no available MCP tools" src="https://routedlogic.net/assets/images/gemini-cli-what-mcp-tools-do-you-have-builtin-only-cfe643e84b2be13d5c0fef722e39670c.png" width="2010" height="1854" class="img_ev3q"></p>
<p>But to really get any useful info you will want to actually run it and use the Ctrl+T hotkey combo, or <code>/mcp list</code> or <code>/mcp desc</code> commands, to get more info. E.g., after installing the Git MCP tools:</p>
<p><img decoding="async" loading="lazy" alt="Gemini CLI MCP info - Gemini CLI showing detailed MCP information" src="https://routedlogic.net/assets/images/gemini-cli-mcp-6f73e33a93d0a0b29f0859cbc1c6185d.png" width="2248" height="3350" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="discovering-available-tools">Discovering Available Tools<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#discovering-available-tools" class="hash-link" aria-label="Direct link to Discovering Available Tools" title="Direct link to Discovering Available Tools" translate="no">​</a></h3>
<p>For clients that don't have some kind of built-in MCP tool listing feature, you can also prompt your clients to tell you what they can currently see and can do. This is also really important so that you're aware of what built-in capabilities currently exist, as they may already have a number of tools available that significantly overlap with the capabilities you already have or are considering adding using MCP.</p>
<p>Once you've added some tools you'll get a better response:</p>
<p><img decoding="async" loading="lazy" alt="Gemini CLI MCP server tools - Gemini CLI showing available MCP server tools" src="https://routedlogic.net/assets/images/gemini-cli-what-mcp-tools-do-you-have-c4e722fca7cf01629c09d95a62936a65.png" width="2010" height="2398" class="img_ev3q"></p>
<p>Though it will be formatted differently each time, as LLMs tend to do.</p>
<p>Be aware that some of your clients' features may not be able to use MCP tools. For instance, with Cursor, in Ask mode, it will know nothing about MCP tools, only its built-in tools.</p>
<p><img decoding="async" loading="lazy" alt="Cursor - What MCP server tools are currently available to you? - Ask mode" src="https://routedlogic.net/assets/images/cursor-available-tools-ask-mode-with-mcp-git-6faee9523cd2287c4a6ae7c97638cdac.png" width="2566" height="922" class="img_ev3q"></p>
<p>But if you put Cursor back in Agent mode it does know about MCP server tools but won't bother to mention its built-in tools.</p>
<p><img decoding="async" loading="lazy" alt="Cursor - What MCP server tools are currently available to you? - Agent mode" src="https://routedlogic.net/assets/images/cursor-available-tools-agent-mode-with-mcp-git-0694258075842e6559f7f95255f881b5.png" width="2580" height="1128" class="img_ev3q"></p>
<p>While considering what MCP servers to install, you should probably ask the LLM more generically what tools are available to it, rather than asking specifically what MCP tools are available, as the LLM may consider some of its built-in tooling to be something other than an MCP tool.</p>
<p>Cursor, for instance, with only the Git Reference MCP server installed, will respond as below in Ask mode,</p>
<p><img decoding="async" loading="lazy" alt="Cursor showing available tools in Ask Mode" src="https://routedlogic.net/assets/images/cursor-what-tools-are-available-ask-mode-cdb86c9097fb7c3d8db0b42c9a54738f.png" width="2570" height="830" class="img_ev3q"></p>
<p>And like this in Agent mode,</p>
<p><img decoding="async" loading="lazy" alt="Cursor showing available tools in Ask Mode" src="https://routedlogic.net/assets/images/cursor-what-tools-are-available-agent-mode-b0aeb76c68b5ce7a81c9e77173da9338.png" width="2566" height="1596" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mcp-server-security-and-trust">MCP Server Security and Trust<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#mcp-server-security-and-trust" class="hash-link" aria-label="Direct link to MCP Server Security and Trust" title="Direct link to MCP Server Security and Trust" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-tools-should-you-actually-install">What tools should you actually install?<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#what-tools-should-you-actually-install" class="hash-link" aria-label="Direct link to What tools should you actually install?" title="Direct link to What tools should you actually install?" translate="no">​</a></h3>
<p>The most important thing to be aware of here is that a lot of what's in the catalog is going to, originally, be from some random developer on the internet/GitHub, much like myself.</p>
<p>And those tools will be mixed in with some official tooling from the MCP reference repository on GitHub and official servers from vendors such as MongoDB and Elastic.</p>
<p>Docker isn't letting Docker Desktop directly pull random GitHub repo content and build container images from it. They do have <a href="https://docs.docker.com/ai/mcp-catalog-and-toolkit/catalog/" target="_blank" rel="noopener noreferrer" class="">documentation</a> and some kind of review process, though I have yet to find a detailed description for what they do beyond the <a href="https://github.com/docker/mcp-registry/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">contribution guide</a>.</p>
<p>Be aware that, as stated in the specification (<a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts" target="_blank" rel="noopener noreferrer" class="">https://modelcontextprotocol.io/specification/2025-06-18/server/prompts</a>),</p>
<p><em>"The Model Context Protocol (MCP) provides a standardized way for servers to expose prompt templates to clients. Prompts allow servers to provide structured messages and instructions for interacting with language models. Clients can discover available prompts, retrieve their contents, and provide arguments to customize them."</em></p>
<p>and,</p>
<p><em>"Implementations MUST carefully validate all prompt inputs and outputs to prevent injection attacks or unauthorized access to resources."</em></p>
<p>So it should be clear to you that simply installing just any interesting-looking MCP toolkit from a random developer on the internet, even when proxied to you via Docker Hub, is not a good idea unless you have thoroughly vetted the developer(s) and the source code and you have a plan to monitor and continually track and vet that code for changes.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mcp-servers--tools">MCP Servers &amp; Tools<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#mcp-servers--tools" class="hash-link" aria-label="Direct link to MCP Servers &amp; Tools" title="Direct link to MCP Servers &amp; Tools" translate="no">​</a></h3>
<p>I still don't fully understand how MCP server code updates work with Docker Desktop's MCP Catalog, and how things like prompt templates really work, so in the meantime I'm only going to use MCP servers I'm comfortable trusting.</p>
<p>What does appear trustworthy to me are:</p>
<ol>
<li class="">MCP Reference tools, e.g., as from <a href="https://github.com/modelcontextprotocol/servers" target="_blank" rel="noopener noreferrer" class="">https://github.com/modelcontextprotocol/servers</a>, though I'm only seeing utility in the Git tool at present.</li>
<li class="">The official vendor MCP tools, e.g., Docker, Docker Hub, MongoDB, Elastic, Redis, etc.</li>
</ol>
<p>But that's it. I won't even consider installing anything else unless I've thoroughly vetted the developer and the code and I know it's not going to change because their GitHub account was compromised and someone pushed a new commit or release.</p>
<p>Right now the reference Git server appears to be a useful addition to help Cursor/Gemini/Warp interact with Git repos locally, as well as the GitHub and Docker Hub servers.</p>
<ul>
<li class=""><a href="https://hub.docker.com/mcp/server/git/overview" target="_blank" rel="noopener noreferrer" class="">https://hub.docker.com/mcp/server/git/overview</a></li>
<li class=""><a href="https://hub.docker.com/mcp/server/github-official/overview" target="_blank" rel="noopener noreferrer" class="">https://hub.docker.com/mcp/server/github-official/overview</a></li>
<li class=""><a href="https://hub.docker.com/mcp/server/dockerhub/overview" target="_blank" rel="noopener noreferrer" class="">https://hub.docker.com/mcp/server/dockerhub/overview</a></li>
</ul>
<p>I'm also interested in using the official MongoDB, Redis, and Elastic MCP servers in order to provide my MCP-based access to stored data with minimal prompt engineering.</p>
<ul>
<li class=""><a href="https://hub.docker.com/mcp/server/elasticsearch/overview" target="_blank" rel="noopener noreferrer" class="">https://hub.docker.com/mcp/server/elasticsearch/overview</a></li>
<li class=""><a href="https://hub.docker.com/mcp/server/mongodb/overview" target="_blank" rel="noopener noreferrer" class="">https://hub.docker.com/mcp/server/mongodb/overview</a></li>
<li class=""><a href="https://hub.docker.com/mcp/server/redis/overview" target="_blank" rel="noopener noreferrer" class="">https://hub.docker.com/mcp/server/redis/overview</a></li>
</ul>
<p>If you must use community-contributed MCP servers, here's what I'd look for:</p>
<ol>
<li class=""><strong>Developer reputation</strong> - Check their GitHub profile, contributions, and community standing</li>
<li class=""><strong>Code review</strong> - Examine the source code for security issues</li>
<li class=""><strong>Update frequency</strong> - Regular updates suggest active maintenance</li>
<li class=""><strong>Community feedback</strong> - Look for issues, discussions, and reviews</li>
<li class=""><strong>Scope limitation</strong> - Prefer servers with minimal required permissions, e.g., path restrictions for file system interactions, API read endpoint access with no write endpoint access.</li>
</ol>
<p>Also be aware that quite a few of the MCP tools listed in the catalog are still using the official MCP logo while not actually being reference tools from the MCP project.</p>
<p><img decoding="async" loading="lazy" alt="MCP API Gateway - Example of community MCP server using official MCP branding" src="https://routedlogic.net/assets/images/docker-desktop-mcp-toolkit-api-gateway-wot-40bcc3b9a42ad88a46960a8159b4fb60.png" width="2872" height="3294" class="img_ev3q"></p>
<p>While this may not be an intentional attempt to make their MCP server code seem more legitimate, it's from a fairly random GitHub account, and you will have little idea what the code is doing in the background. Or at least, even less than you already know about what the LLM is doing...</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="observed-issues">Observed Issues<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#observed-issues" class="hash-link" aria-label="Direct link to Observed Issues" title="Direct link to Observed Issues" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mcp-servertool-visibility">MCP Server/Tool Visibility<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#mcp-servertool-visibility" class="hash-link" aria-label="Direct link to MCP Server/Tool Visibility" title="Direct link to MCP Server/Tool Visibility" translate="no">​</a></h3>
<p>Most of the clients will be immediately aware of the Docker Desktop MCP gateway becoming unavailable, e.g., if you fully exit Docker Desktop.</p>
<p>However, none of them will be immediately aware if you add new tools or remove existing tools. You will need to restart the client, at a minimum.</p>
<p>With Cursor, I've also noticed that, at times, I've had to disable the Docker Desktop MCP server definition and then re-enable it for it to refresh the list of available tools. It appears to cache what's available and assumes that's still the case for extended periods, even across restarts.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="tool-confusion-and-overlap">Tool Confusion and Overlap<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#tool-confusion-and-overlap" class="hash-link" aria-label="Direct link to Tool Confusion and Overlap" title="Direct link to Tool Confusion and Overlap" translate="no">​</a></h3>
<p>As above, your clients probably already have a lot of built-in tools and capabilities that overlap significantly with the reference MCP servers, so you probably won't need to install all or possibly even any of them.</p>
<p>I've also experienced confusion from the LLM when multiple overlapping tool capabilities are available.</p>
<p>For instance, when some of the built-in, file-operation-related tools are skipped in favor of the reference MCP server tool definition, which I initially configured with a path-based restriction to <code>/opt/data</code>.</p>
<p>This resulted in Cursor sometimes being able to edit files without issue, but at other times deciding that it didn't have access to what I'd told it to do, so it started creating files under <code>/opt/data</code>. Yet at other times, to access paths it believed it couldn't reach, it tried SSHing into <code>localhost/127.0.0.1</code>.</p>
<p>My pubkey-based auth system prompted me to allow this, otherwise I may not have noticed what was happening.</p>
<p>The point is... don't install more than you need and be very aware of what your clients can already do. If you experience similar behavior, check your MCP server configurations for path restrictions and ensure they don't conflict with your intended workflow.</p>
<p>A quick-and-dirty summary I've created for myself is below. This includes me starting to ask each client what it knows how to do, which is something you should do too.</p>
<p>Most tools and models—except Ask Gordon—seem to understand that, even without a built-in capability, they can use a CLI command to achieve something similar.</p>
<p>For example:
<img decoding="async" loading="lazy" alt="Asking Gemini CLI if it knows how to patch a file" src="https://routedlogic.net/assets/images/gemini-cli-do-you-know-how-to-patch-a-file-93af8791a58b250b21041b4dd2e3792d.png" width="2360" height="2092" class="img_ev3q"></p>
<p>Tools like Warp will try to use the curl or wget CLI command to retrieve a URL and may also try to pipe the page through grep or something else in order to convert some of it to Markdown if instructed to provide Markdown output.</p>
<p>I consider being able to use curl or wget to be an equivalent fetch-URL capability, but not a fetch-and-convert-to-Markdown capability, even if it can output some of the titles or similar elements from a page as Markdown.</p>
<p>Please note that this is hardly comprehensive and probably partially inaccurate as I have not fully validated every capability that the clients claim to have.</p>
<table><thead><tr><th>Built-in Functionality</th><th style="text-align:center">Cursor (Ask Mode)</th><th style="text-align:center">Cursor (Agent Mode)</th><th style="text-align:center">Gemini CLI</th><th style="text-align:center">Warp</th><th style="text-align:center">Ask Gordon</th><th>MCP Server Option</th></tr></thead><tbody><tr><td>Sequential Thinking</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❌</td><td><a href="https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking" target="_blank" rel="noopener noreferrer" class="">https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking</a></td></tr><tr><td>Run Shell Commands</td><td style="text-align:center">❓</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td>No additional capability required?</td></tr><tr><td>Parallel Orchestration</td><td style="text-align:center">❓</td><td style="text-align:center">✅</td><td style="text-align:center">❓</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td>TBC</td></tr><tr><td>Basic File Operations</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td>No additional capability required?</td></tr><tr><td>File Patch</td><td style="text-align:center">🟡</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td>No additional capability required?</td></tr><tr><td>Memory - save/retrieve</td><td style="text-align:center">🟡</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td><a href="https://github.com/modelcontextprotocol/servers/tree/main/src/memory" target="_blank" rel="noopener noreferrer" class="">https://github.com/modelcontextprotocol/servers/tree/main/src/memory</a></td></tr><tr><td>Jupyter Notebooks</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❌</td><td>TBC</td></tr><tr><td>Image Analysis</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td>TBC</td></tr><tr><td>Fetch URL as Markdown</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td><a href="https://github.com/modelcontextprotocol/servers/tree/main/src/fetch" target="_blank" rel="noopener noreferrer" class="">https://github.com/modelcontextprotocol/servers/tree/main/src/fetch</a></td></tr><tr><td>Web Search</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td><a href="https://github.com/brave/brave-search-mcp-server" target="_blank" rel="noopener noreferrer" class="">https://github.com/brave/brave-search-mcp-server</a> ?</td></tr><tr><td>Diagrams (Mermaid)</td><td style="text-align:center">❓</td><td style="text-align:center">✅</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❌</td><td>TBC</td></tr><tr><td>Git (local)</td><td style="text-align:center">❓</td><td style="text-align:center">✅</td><td style="text-align:center">✅</td><td style="text-align:center">❓</td><td style="text-align:center">✅</td><td><a href="https://github.com/modelcontextprotocol/servers/tree/main/src/git" target="_blank" rel="noopener noreferrer" class="">https://github.com/modelcontextprotocol/servers/tree/main/src/git</a></td></tr><tr><td>GitHub</td><td style="text-align:center">❓</td><td style="text-align:center">🟡</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td><a href="https://github.com/github/github-mcp-server" target="_blank" rel="noopener noreferrer" class="">https://github.com/github/github-mcp-server</a></td></tr><tr><td>Docker CLI</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">❓</td><td style="text-align:center">✅</td><td>TBC</td></tr><tr><td>Docker Model Runner</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td>TBC</td></tr><tr><td>Kubernetes</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td>TBC</td></tr><tr><td>Docker Builds</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td>TBC</td></tr><tr><td>Docker Scout</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">✅</td><td>TBC</td></tr><tr><td>Docker Hub</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td><a href="https://github.com/docker/hub-mcp" target="_blank" rel="noopener noreferrer" class="">https://github.com/docker/hub-mcp</a></td></tr><tr><td>Redis</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td><a href="https://github.com/redis/mcp-redis" target="_blank" rel="noopener noreferrer" class="">https://github.com/redis/mcp-redis</a></td></tr><tr><td>MongoDB</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td><a href="https://github.com/mongodb-js/mongodb-mcp-server" target="_blank" rel="noopener noreferrer" class="">https://github.com/mongodb-js/mongodb-mcp-server</a></td></tr><tr><td>Elasticsearch</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td style="text-align:center">❌</td><td><a href="https://github.com/elastic/mcp-server-elasticsearch" target="_blank" rel="noopener noreferrer" class="">https://github.com/elastic/mcp-server-elasticsearch</a></td></tr></tbody></table>
<p>✅ Supported · ❌ Not supported · 🟡 Partial support · ❓ Unclear capability</p>
<p>Reference sources:</p>
<ul>
<li class=""><a href="https://docs.cursor.com/en/agent/tools" target="_blank" rel="noopener noreferrer" class="">https://docs.cursor.com/en/agent/tools</a></li>
<li class=""><a href="https://github.com/google-gemini/gemini-cli" target="_blank" rel="noopener noreferrer" class="">https://github.com/google-gemini/gemini-cli</a></li>
<li class=""><a href="https://docs.warp.dev/" target="_blank" rel="noopener noreferrer" class="">https://docs.warp.dev/</a></li>
<li class=""><a href="https://docs.docker.com/ai/gordon/" target="_blank" rel="noopener noreferrer" class="">https://docs.docker.com/ai/gordon/</a></li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="summary">Summary<a href="https://routedlogic.net/E6P49T7hrnAOcWud/2025-08-13-easy-mcp-server-tooling#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>MCP reminds me a little of REST API documentation and specification formats like OpenAPI, Swagger, etc. It extends to other "things" that software tools can interact with, such as CLI commands and code snippets.</p>
<p>Overall it feels like kludgy glue that has to be put in place to help LLMs work out how to do things that you're asking them to do, even though, in theory, they should really be able to leverage their existing "knowledge" (as derived from their training data) and just... be able to work stuff out.</p>
<p>But then again, humans are supposed to be able to just work stuff out, and a hell of a lot of us can't do so; and so we simply resort to getting another human to tell us what to do...</p>]]></content:encoded>
            <category>mcp</category>
            <category>mcp-server</category>
            <category>ai</category>
            <category>llm</category>
            <category>tooling</category>
            <category>docker</category>
            <category>docker-desktop</category>
        </item>
        <item>
            <title><![CDATA[creating-custom-mmdb-files]]></title>
            <link>https://routedlogic.net/E6P49T7hrnAOcWud/2025/02/15/creating-custom-mmdb-files</link>
            <guid>https://routedlogic.net/E6P49T7hrnAOcWud/2025/02/15/creating-custom-mmdb-files</guid>
            <pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Prompt:/0 that will cover all possible IP lookups?]]></description>
            <content:encoded><![CDATA[<p>Prompt: How can I create dummy MaxMind GeoLite2 .mmdb files that will respond to ALL IP lookups with the same information? For example these these would be .mmdb files that will have entries for 0.0.0.0/0 and ::/0 that will cover all possible IP lookups?</p>
<p>Gemini 2.0 Flash will actually provide a moderately useful response, albeit one based on the legacy MaxMind perl based code available from <a href="https://github.com/maxmind/MaxMind-DB-Writer-perl" target="_blank" rel="noopener noreferrer" class="">MaxMind-DB-Writer-perl</a>. It also correctly recommends using the <code>mmdbinspect</code> tool to test the .mmdb files that have been produced.</p>
<p>ChatGPT (free not Plus) also provides a fairly useful response, albeit one based on python code. It doesn't seem to know about <code>mmdbinspect</code> and does produced .mmdb file testing using python code instead.</p>
<p>Claude.ai provides something similar to ChatGPT's solution.</p>
<h1>The Better Solution</h1>
<p>However, unsurprisingly, while all of these solutions <em>appear</em> valid, they're based on outdated information and are incomplete if you want detailed GeoIP lookup data to be returned. To really get the solution you want, even if you were to stick with their perl/python code (assuming it actually works out of the paste...), will require a deep dive on what fields can/should exist.</p>
<p>MaxMind also replaced their Perl code with Go quite a few years ago, completely deprecating the Perl code at least 2 years ago. The replacement is <a href="https://github.com/maxmind/mmdbwriter" target="_blank" rel="noopener noreferrer" class="">mmdbwriter</a>.</p>
<p>However this new Go package is simply something that can work with .mmdb files, and while there are some example commands included they're not immediately usable.</p>
<p>A more useful repo exists in the form of <a href="https://github.com/maxmind/MaxMind-DB" target="_blank" rel="noopener noreferrer" class="">MaxMind-DB</a>. This repo includes a heap of raw test data and test cases so it has everything we need to work out how to create some raw GeoLite2 source data as .json files, and a tool to convert those .json files to .mmdb files.</p>
<p>The included <code>write-test-data</code> command can, with some minor modifications, be used to accept <code>0.0.0.0/0</code> and <code>::/0</code> to cover all possible IPv4 and IPv6 lookups.</p>
<h1>Modifications</h1>
<p>Having cloned MaxMind-DB I've only had to make one modification to the current content.</p>
<p>I've modified <code>pkg/writer/geoip2.go</code> and inserted <code>IncludeReservedNetworks: true</code> as an argument within <code>mmdbwriter.Options</code> as that's provided to the mmdbwriter constructor <code>mmdbwriter.New()</code>.</p>
<p>I found this was necessary to allow acceptance of <code>0.0.0.0/0</code> and <code>::/0</code>.</p>
<p>Without this additional option the produced files would contain no entries and the fact that these entries were dropped will not be reported at all. You'll just have .mmdb files that won't provide anything for any IP.</p>
<p>This appears to be because the code in <code>mmdbwriter</code> will filter any IP or IP network that is in or overlaps within various reserved blocks, e.g. refer to <a href="https://github.com/maxmind/mmdbwriter/blob/main/reserved.go" target="_blank" rel="noopener noreferrer" class="">mmdbwriter/blob/main/reserved.go</a> for what this includes.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % git diff pkg/writer/geoip2.go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">diff --git a/pkg/writer/geoip2.go b/pkg/writer/geoip2.go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">index a95c0af..e8e1b8d 100644</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- a/pkg/writer/geoip2.go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+++ b/pkg/writer/geoip2.go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">@@ -50,6 +50,7 @@ func (w *Writer) WriteGeoIP2TestDB() error {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                DatabaseType:        dbType,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                Description:         description,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                DisableIPv4Aliasing: false,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                               IncludeReservedNetworks: true,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                IPVersion:           6,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                Languages:           languages,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                RecordSize:          28,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box %</span><br></div></code></pre></div></div>
<p>You'll need to build the <code>write-test-data</code> command similar to the below, and understand how to use the arguments it accepts.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % cd cmd/write-test-data</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box write-test-data % ls -alF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">total 8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">drwxr-xr-x  3 user  staff    96 15 Feb 11:48 ./</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">drwxr-xr-x  3 user  staff    96 15 Feb 09:17 ../</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff  1569 15 Feb 11:46 main.go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box write-test-data % go build</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box write-test-data % ls -alF</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">total 7568</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">drwxr-xr-x  4 user  staff      128 15 Feb 11:48 ./</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">drwxr-xr-x  3 user  staff       96 15 Feb 09:17 ../</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff     1569 15 Feb 11:46 main.go</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rwxr-xr-x  1 user  staff  3870210 15 Feb 11:48 write-test-data*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box write-test-data % ./write-test-data -h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Usage of ./write-test-data:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -source string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Source data directory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -target string</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Destination directory for the generated mmdb files</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box write-test-data %</span><br></div></code></pre></div></div>
<p>You can now clone the default source-data files in order to modify them. You could of course also modify these in place if you'd prefer.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % cp -Rpv source-data source-data-test</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data -&gt; source-data-test</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-Precision-Enterprise-Test.json -&gt; source-data-test/GeoIP2-Precision-Enterprise-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-Enterprise-Test.json -&gt; source-data-test/GeoIP2-Enterprise-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-Precision-Enterprise-Sandbox-Test.json -&gt; source-data-test/GeoIP2-Precision-Enterprise-Sandbox-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-Country-Test.json -&gt; source-data-test/GeoIP2-Country-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-Domain-Test.json -&gt; source-data-test/GeoIP2-Domain-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoLite2-City-Test.json -&gt; source-data-test/GeoLite2-City-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-Anonymous-IP-Test.json -&gt; source-data-test/GeoIP2-Anonymous-IP-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-Static-IP-Score-Test.json -&gt; source-data-test/GeoIP2-Static-IP-Score-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-Connection-Type-Test.json -&gt; source-data-test/GeoIP2-Connection-Type-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-IP-Risk-Test.json -&gt; source-data-test/GeoIP2-IP-Risk-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoLite2-Country-Test.json -&gt; source-data-test/GeoLite2-Country-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-City-Test.json -&gt; source-data-test/GeoIP2-City-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-ISP-Test.json -&gt; source-data-test/GeoIP2-ISP-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-DensityIncome-Test.json -&gt; source-data-test/GeoIP2-DensityIncome-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoLite2-ASN-Test.json -&gt; source-data-test/GeoLite2-ASN-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">source-data/GeoIP2-User-Count-Test.json -&gt; source-data-test/GeoIP2-User-Count-Test.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB %</span><br></div></code></pre></div></div>
<p>If you don't also copy the <code>GeoIP2-*-Test.json</code> files you'll get errors when running the command, you can make further code modifications to <code>pkg/writer/geoip2.go</code> if you don't want to have these generated at all.</p>
<p>Now modify the files as needed.</p>
<p>In my case I just want to modify the GeoLite2 .json files, and I'm going to ensure all ASN's returned are 64496 which is a documentation specific ASN defined by <a href="https://www.rfc-editor.org/rfc/rfc5398.html" target="_blank" rel="noopener noreferrer" class="">RFC-5398</a> and that all location data is for Greenwich UK and more specifically the location coordinates are for the <a href="https://www.geonames.org/6295636/royal-greenwich-observatory.html" target="_blank" rel="noopener noreferrer" class="">Royal Greenwich Observatory</a>. I've picked Greenwich as I couldn't think of a more appropriate real world location. You can, almost certainly, inject your own descriptions and even using 0/0 for lat/long though that would place the IP as in the ocean off the coast of Ghana.</p>
<p><code>GeoLite2-ASN-Test.json</code></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "0.0.0.0/0" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "autonomous_system_number" : 64496,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "autonomous_system_organization" : "Documentation ASN"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "0000:0000:0000:0000:0000:0000:0000:0000/0" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "autonomous_system_number" : 64496,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "autonomous_system_organization" : "Documentation ASN"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div></code></pre></div></div>
<p><code>GeoLite2-City-Test.json</code></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "0.0.0.0/0" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "city" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2647937,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "Greenwich"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "continent" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "code" : "EU",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 6255148,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "Europe"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "country" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "iso_code" : "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "location" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "accuracy_radius" : 0,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "latitude" : 51.47687,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "longitude" : -0.00041,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "time_zone" : "Europe/London"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "registered_country" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "iso_code" : "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "subdivisions" : [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "geoname_id" : 6269131,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "iso_code" : "ENG",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  "en" : "England"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "0000:0000:0000:0000:0000:0000:0000:0000/0" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "city" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2647937,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "Greenwich"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "continent" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "code" : "EU",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 6255148,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "Europe"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "country" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "iso_code" : "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "location" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "accuracy_radius" : 0,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "latitude" : 51.47687,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "longitude" : -0.00041,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "time_zone" : "Europe/London"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "registered_country" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "iso_code" : "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "subdivisions" : [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "geoname_id" : 6269131,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "iso_code" : "ENG",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  "en" : "England"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div></code></pre></div></div>
<p><code>GeoLite2-Country-Test.json</code></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "0.0.0.0/0" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "continent" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "code" : "EU",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 6255148,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "Europe"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "country" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "iso_code" : "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "registered_country" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "iso_code" : "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      "0000:0000:0000:0000:0000:0000:0000:0000/0" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "continent" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "code" : "EU",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 6255148,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "Europe"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "country" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "iso_code" : "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         "registered_country" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "geoname_id" : 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "iso_code" : "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            "names" : {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               "en" : "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div></code></pre></div></div>
<p>Now run <code>write-test-data</code> to build the .mmdb files. Note that the target directory does not need to exist already, <code>write-test-data</code> will create it if it doesn't exist.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % ./cmd/write-test-data/write-test-data -source source-data-test -target test-data-test</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % ls -ld test-data-test/*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   3289 15 Feb 12:07 test-data-test/GeoIP2-Anonymous-IP-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff  21096 15 Feb 12:07 test-data-test/GeoIP2-City-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   3228 15 Feb 12:07 test-data-test/GeoIP2-Connection-Type-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff  18176 15 Feb 12:07 test-data-test/GeoIP2-Country-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1649 15 Feb 12:07 test-data-test/GeoIP2-DensityIncome-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   5077 15 Feb 12:07 test-data-test/GeoIP2-Domain-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   8571 15 Feb 12:07 test-data-test/GeoIP2-Enterprise-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1651 15 Feb 12:07 test-data-test/GeoIP2-IP-Risk-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff  74019 15 Feb 12:07 test-data-test/GeoIP2-ISP-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff  18675 15 Feb 12:07 test-data-test/GeoIP2-Precision-Enterprise-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   9938 15 Feb 12:07 test-data-test/GeoIP2-Static-IP-Score-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   5006 15 Feb 12:07 test-data-test/GeoIP2-User-Count-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1352 15 Feb 12:07 test-data-test/GeoLite2-ASN-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1551 15 Feb 12:07 test-data-test/GeoLite2-City-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1401 15 Feb 12:07 test-data-test/GeoLite2-Country-Test.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff    616 15 Feb 12:07 test-data-test/MaxMind-DB-no-ipv4-search-tree.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1334 15 Feb 12:07 test-data-test/MaxMind-DB-string-value-entries.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   3188 15 Feb 12:07 test-data-test/MaxMind-DB-test-decoder.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1285 15 Feb 12:07 test-data-test/MaxMind-DB-test-ipv4-24.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1448 15 Feb 12:07 test-data-test/MaxMind-DB-test-ipv4-28.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   1611 15 Feb 12:07 test-data-test/MaxMind-DB-test-ipv4-32.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   2794 15 Feb 12:07 test-data-test/MaxMind-DB-test-ipv6-24.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   3209 15 Feb 12:07 test-data-test/MaxMind-DB-test-ipv6-28.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   3624 15 Feb 12:07 test-data-test/MaxMind-DB-test-ipv6-32.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   2249 15 Feb 12:07 test-data-test/MaxMind-DB-test-metadata-pointers.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   3048 15 Feb 12:07 test-data-test/MaxMind-DB-test-mixed-24.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   3492 15 Feb 12:07 test-data-test/MaxMind-DB-test-mixed-28.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   3936 15 Feb 12:07 test-data-test/MaxMind-DB-test-mixed-32.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">-rw-r--r--  1 user  staff   2589 15 Feb 12:07 test-data-test/MaxMind-DB-test-nested.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB %</span><br></div></code></pre></div></div>
<p>Test the produced .mmdb files,</p>
<p><code>GeoLite2-ASN.mmdb</code></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % mmdbinspect -db ./test-data-test/GeoLite2-ASN-Test.mmdb 203.0.113.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Database": "./test-data-test/GeoLite2-ASN-Test.mmdb",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Records": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Network": "203.0.113.0/1",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Record": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "autonomous_system_number": 64496,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "autonomous_system_organization": "Documentation ASN"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ],</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Lookup": "203.0.113.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB %</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % mmdbinspect -db ./test-data-test/GeoLite2-ASN-Test.mmdb 8.8.8.8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Database": "./test-data-test/GeoLite2-ASN-Test.mmdb",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Records": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Network": "8.8.8.8/1",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Record": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "autonomous_system_number": 64496,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "autonomous_system_organization": "Documentation ASN"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ],</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Lookup": "8.8.8.8"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB %</span><br></div></code></pre></div></div>
<p><code>GeoLite2-City.mmdb</code></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % mmdbinspect -db ./test-data-test/GeoLite2-City-Test.mmdb 203.0.113.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Database": "./test-data-test/GeoLite2-City-Test.mmdb",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Records": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Network": "203.0.113.0/1",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Record": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "city": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2647937,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "Greenwich"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "continent": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "code": "EU",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 6255148,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "Europe"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "country": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "location": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "accuracy_radius": 0,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "latitude": 51.47687,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "longitude": -0.00041,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "time_zone": "Europe/London"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "registered_country": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "subdivisions": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "geoname_id": 6269131,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "iso_code": "ENG",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                "en": "England"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ],</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Lookup": "203.0.113.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % mmdbinspect -db ./test-data-test/GeoLite2-City-Test.mmdb 8.8.8.8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Database": "./test-data-test/GeoLite2-City-Test.mmdb",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Records": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Network": "8.8.8.8/1",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Record": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "city": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2647937,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "Greenwich"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "continent": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "code": "EU",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 6255148,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "Europe"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "country": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "location": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "accuracy_radius": 0,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "latitude": 51.47687,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "longitude": -0.00041,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "time_zone": "Europe/London"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "registered_country": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "subdivisions": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "geoname_id": 6269131,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "iso_code": "ENG",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                                "en": "England"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ],</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Lookup": "8.8.8.8"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB %</span><br></div></code></pre></div></div>
<p><code>GeoLite2-Country.mmdb</code></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % mmdbinspect -db ./test-data-test/GeoLite2-Country-Test.mmdb 203.0.113.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Database": "./test-data-test/GeoLite2-Country-Test.mmdb",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Records": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Network": "203.0.113.0/1",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Record": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "continent": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "code": "EU",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 6255148,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "Europe"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "country": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "registered_country": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ],</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Lookup": "203.0.113.0"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % mmdbinspect -db ./test-data-test/GeoLite2-Country-Test.mmdb 8.8.8.8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Database": "./test-data-test/GeoLite2-Country-Test.mmdb",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Records": [</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Network": "8.8.8.8/1",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                "Record": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "continent": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "code": "EU",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 6255148,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "Europe"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "country": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    "registered_country": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "geoname_id": 2635167,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        "names": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                            "en": "United Kingdom"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        ],</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        "Lookup": "8.8.8.8"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB %</span><br></div></code></pre></div></div>
<p>Congratulations you now have GeoLite2 database files that will respond to any query against them.</p>
<p>To use these within your <code>elastic-package</code> managed Elastic stack, simply overwrite the files in the appropriate profile under <code>~/.elastic-package</code>.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % find ~/.elastic-package -name \*.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/Users/user/.elastic-package/profiles/default/stack/ingest-geoip/GeoLite2-City.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/Users/user/.elastic-package/profiles/default/stack/ingest-geoip/GeoLite2-Country.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/Users/user/.elastic-package/profiles/default/stack/ingest-geoip/GeoLite2-ASN.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB %</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB % for i in ASN City Country ; do cp -v test-data-test/GeoLite2-${i}-Test.mmdb ~/.elastic-package/profiles/default/stack/ingest-geoip/GeoLite2-${i}.mmdb ; done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test-data-test/GeoLite2-ASN-Test.mmdb -&gt; /Users/user/.elastic-package/profiles/default/stack/ingest-geoip/GeoLite2-ASN.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test-data-test/GeoLite2-City-Test.mmdb -&gt; /Users/user/.elastic-package/profiles/default/stack/ingest-geoip/GeoLite2-City.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test-data-test/GeoLite2-Country-Test.mmdb -&gt; /Users/user/.elastic-package/profiles/default/stack/ingest-geoip/GeoLite2-Country.mmdb</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box MaxMind-DB %</span><br></div></code></pre></div></div>
<p>After doing this, and a restart of the <code>elastic-package</code> managed stack isn't really necessary, you should see your dummy GeoIP data appearing on test events, e.g.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box beelzebub % elastic-package test pipeline</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">2025/02/15 11:02:30  INFO New version is available - v0.109.1. Download from: https://github.com/elastic/elastic-package/releases/tag/v0.109.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Run pipeline tests for the package</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- Test results for package: beelzebub - START ---</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">FAILURE DETAILS:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">beelzebub/logs test-beelzebub-logs-ndjson.log:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- want</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+++ got</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">@@ -206,6 +206,24 @@</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                 ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             "source": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                "as": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "number": 64496,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "organization": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                        "name": "Documentation ASN"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                "geo": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "city_name": "Greenwich",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "continent_name": "Europe",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "country_iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "country_name": "United Kingdom",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "location": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                        "lat": 51.47687,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                        "lon": -4.1E-4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "region_iso_code": "GB-ENG",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "region_name": "England"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                 "ip": "203.0.113.133",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                 "port": 60748</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">@@ -257,6 +275,24 @@</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">%{BREVITY}%</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">@@ -54798,6 +66498,24 @@</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                 ]</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             "source": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                "as": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "number": 64496,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "organization": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                        "name": "Documentation ASN"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    }</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                "geo": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "city_name": "Greenwich",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "continent_name": "Europe",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "country_iso_code": "GB",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "country_name": "United Kingdom",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "location": {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                        "lat": 51.47687,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                        "lon": -4.1E-4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "region_iso_code": "GB-ENG",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                    "region_name": "England"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+                },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                 "ip": "203.0.113.53",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                 "port": 40742</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             },</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">╭───────────┬─────────────┬───────────┬───────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────┬──────────────╮</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ PACKAGE   │ DATA STREAM │ TEST TYPE │ TEST NAME                                                 │ RESULT                                                                  │ TIME ELAPSED │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├───────────┼─────────────┼───────────┼───────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────┼──────────────┤</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ beelzebub │ logs        │ pipeline  │ (ingest pipeline warnings test-beelzebub-logs-ndjson.log) │ PASS                                                                    │ 359.849459ms │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ beelzebub │ logs        │ pipeline  │ test-beelzebub-logs-ndjson.log                            │ FAIL: test case failed: Expected results are different from actual ones │  42.7460275s │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">╰───────────┴─────────────┴───────────┴───────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────┴──────────────╯</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- Test results for package: beelzebub - END   ---</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Error: one or more test cases failed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box beelzebub %</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>elastic</category>
            <category>random</category>
        </item>
        <item>
            <title><![CDATA[elastic-package-replaceips-sh]]></title>
            <link>https://routedlogic.net/E6P49T7hrnAOcWud/2025/02/14/elastic-package-replaceips-sh</link>
            <guid>https://routedlogic.net/E6P49T7hrnAOcWud/2025/02/14/elastic-package-replaceips-sh</guid>
            <pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[When you're building packages for Elastic Fleet/Agent, if you're providing sample logs to test pipeline and system processes with it's not uncommon to have elastic-package whinge about non-approved IP's being there similar to the below.]]></description>
            <content:encoded><![CDATA[<p>When you're building packages for Elastic Fleet/Agent, if you're providing sample logs to test pipeline and system processes with it's not uncommon to have <code>elastic-package</code> whinge about non-approved IP's being there similar to the below.</p>
<p>Elastic's rationale is, presumably, that sensitive IP information may be leaked if it's not replaced with IP's from an approved set. To a lesser extent I believe they're trying to force the use of real IP's that will have actual GeoIP information associated with them so that if a geoip processor is used in an ingest pipeline it will actually return geoip data that will be inserted into documents.</p>
<p>Frustratingly this also means that <code>elastic-package</code> will not accept RFC defined documentation network IP's, e.g. 192.0.2.0/24, 203.0.113.0/24, 2001:db8::/something etc.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box beelzebub % elastic-package test pipeline --generate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Run pipeline tests for the package</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- Test results for package: beelzebub - START ---</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">FAILURE DETAILS:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">beelzebub/logs test-beelzebub-logs-ndjson.log:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[0] parsing field value failed: the IP "103.100.225.133" is not one of the allowed test IPs (see: https://github.com/elastic/elastic-package/blob/main/internal/fields/_static/allowed_geo_ips.txt)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">%{BREVITY}%</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[44] parsing field value failed: the IP "92.255.57.58" is not one of the allowed test IPs (see: https://github.com/elastic/elastic-package/blob/main/internal/fields/_static/allowed_geo_ips.txt)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">╭───────────┬─────────────┬───────────┬───────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────┬──────────────╮</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ PACKAGE   │ DATA STREAM │ TEST TYPE │ TEST NAME                                                 │ RESULT                                                                      │ TIME ELAPSED │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├───────────┼─────────────┼───────────┼───────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┼──────────────┤</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ beelzebub │ logs        │ pipeline  │ (ingest pipeline warnings test-beelzebub-logs-ndjson.log) │ PASS                                                                        │ 321.152166ms │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ beelzebub │ logs        │ pipeline  │ test-beelzebub-logs-ndjson.log                            │ FAIL: test case failed: one or more problems with fields found in documents │ 1.868443625s │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">╰───────────┴─────────────┴───────────┴───────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────┴──────────────╯</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- Test results for package: beelzebub - END   ---</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Error: one or more test cases failed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box beelzebub % cd ../..</span><br></div></code></pre></div></div>
<p>I wound up creating the following script, which I keep in the top of my <code>integrations</code> fork, which makes quick work of replacing IP's with those that will be accepted. I've now published this on GitHub as a <a href="https://gist.github.com/colin-stubbs/25a0b432b7514a994f0363c203aa0a78" target="_blank" rel="noopener noreferrer" class="">gist</a> for future modification tracking.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">function usage() {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  echo "Usage: ${0} package_name"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  exit 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PACKAGE=${1}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">IPv4_LEAD="1.128.0."</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">IPv6_LEAD="2a02:cf40:"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">#IPv4_LEAD="203.0.113." # RFC 5737 - TEST-NET-3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">#IPv6_LEAD="2001:db8:" # RFC 3849</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test -z "${1}" &amp;&amp; echo "ERROR: package name not provided" &amp;&amp; usage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test ! -d "./packages/${PACKAGE}" &amp;&amp; echo "ERROR: folder does not exist at ./packages/${PACKAGE}" &amp;&amp; usage</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">for FILE in ./packages/${PACKAGE}/data_stream/*/_dev/test/pipeline/test-*.log ./packages/${PACKAGE}/data_stream/*/_dev/test/pipeline/test-*.json ; do</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  echo "### Fixing IP's in ${FILE}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sed -r -i.backup "s/\"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.([0-9]{1,3})/\"${IPv4_LEAD}\1/g" "${FILE}" &amp;&amp; rm -f "${FILE}.backup"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sed -r -i.backup "s/\"(([A-F0-9]{1,4}:){2,2})((:|:[A-F0-9]{1,4}){1,5}|([A-F0-9]{1,4}:){1,5}:|([A-F0-9]{1,4}:){1,4}:([A-F0-9]{1,4})|([A-F0-9]{1,4}:){5,6}([A-F0-9]{1,4}))/\"${IPv6_LEAD}\3/gi" "${FILE}" &amp;&amp; rm -f "${FILE}.backup"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  sleep 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># EOF</span><br></div></code></pre></div></div>
<p>Example,</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@box integrations % ./replaceips.sh beelzebub</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">### Fixing IP's in ./packages/beelzebub/data_stream/logs/_dev/test/pipeline/test-beelzebub-logs-ndjson.log</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">### Fixing IP's in ./packages/beelzebub/data_stream/logs/_dev/test/pipeline/test-beelzebub-logs-ndjson.log-expected.json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box integrations % cd packages/beelzebub</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box beelzebub % ls</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">_dev            changelog.yml   data_stream     docs            img             manifest.yml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box beelzebub % elastic-package test pipeline --generate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Run pipeline tests for the package</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- Test results for package: beelzebub - START ---</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">╭───────────┬─────────────┬───────────┬───────────────────────────────────────────────────────────┬────────┬──────────────╮</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ PACKAGE   │ DATA STREAM │ TEST TYPE │ TEST NAME                                                 │ RESULT │ TIME ELAPSED │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├───────────┼─────────────┼───────────┼───────────────────────────────────────────────────────────┼────────┼──────────────┤</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ beelzebub │ logs        │ pipeline  │ (ingest pipeline warnings test-beelzebub-logs-ndjson.log) │ PASS   │ 341.923375ms │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│ beelzebub │ logs        │ pipeline  │ test-beelzebub-logs-ndjson.log                            │ PASS   │ 2.992818916s │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">╰───────────┴─────────────┴───────────┴───────────────────────────────────────────────────────────┴────────┴──────────────╯</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- Test results for package: beelzebub - END   ---</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Done</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@box beelzebub %</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>elastic</category>
            <category>random</category>
        </item>
        <item>
            <title><![CDATA[xquartz-window-resize]]></title>
            <link>https://routedlogic.net/E6P49T7hrnAOcWud/2024/07/04/xquartz-window-resize</link>
            <guid>https://routedlogic.net/E6P49T7hrnAOcWud/2024/07/04/xquartz-window-resize</guid>
            <pubDate>Thu, 04 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[If you're running MacOS and using XQuartz in order to transport app GUI display over SSH from a remote system you may run into an issue with XQuartz displayed window sizes not being adjustable beyond maximising it to the fill the screen or returning it to the initial size.]]></description>
            <content:encoded><![CDATA[<p>If you're running MacOS and using XQuartz in order to transport app GUI display over SSH from a remote system you may run into an issue with XQuartz displayed window sizes not being adjustable beyond maximising it to the fill the screen or returning it to the initial size.</p>
<p>Normally each window is resized via the very bottom right corner however the initial display of the app may result in that corner being outside the size of your actually display.</p>
<p>After a little bit of time on Google I came across a script that uses xwininfo to identify the window to resize and then xdotool to actually resize it.</p>
<p>Unfortunately that script didn't work straight out of the box.</p>
<p>Some slight modifications led me to creating a working version as below.</p>
<p>Here it is in action,</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">user@mbp ~ % x11_resize 1920 1080</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Click on the target window</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">info_id='xwininfo: Window id: 0x600003 "New Tab - Chromium"'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">id=0x600003</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">title=New Tab - Chromium</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Resize "New Tab - Chromium" (1905 x 2114) to 1920 x 1080? [y / n] y</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Warning: XTEST extension unavailable on '(null)'. Some functionality may be disabled; See 'man xdotool' for more info.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">user@mbp ~ %</span><br></div></code></pre></div></div>
<p>Once adjusted to the size you want maximising it to your full display size will still work, and unmaximising it will return it to your custom adjusted size.</p>
<p>Post adjustment each XQuartz displayed app appears to retain the custom sizing.</p>
<p>The script itself,</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#!/bin/bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Use xwininfo to get the id (and name) of a window (click to select)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Use xdotool to resize the window to a specific size</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if [[ $# -ne 2 ]]; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    echo "Usage $0 width height"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    exit 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">w=$1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">h=$2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "Click on the target window"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">info=$(xwininfo)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">info_id=`echo "$info" | grep 'Window id:'`</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">info_w=`echo "$info" | grep 'Width:'`</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">info_h=`echo "$info" | grep 'Height:'`</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "info_id='${info_id}'"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if [[ "$info_id" =~ ^.+Window\ id:\ (.+)\ \"(.+)\"$ ]]; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    id="${BASH_REMATCH[1]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    title="${BASH_REMATCH[2]}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "id=${id}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">echo "title=${title}"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if [[ "$info_w" =~ "Width: "(.+) ]]; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    window_w=${BASH_REMATCH[1]}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if [[ "$info_h" =~ "Height: "(.+) ]]; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    window_h=${BASH_REMATCH[1]}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">read -p "Resize \"$title\" ($window_w x $window_h) to $w x $h? [y / n] " answer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">if ! [[ "$answer" == "" || "${answer}" == "y" ]]; then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    exit 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">fi</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">xdotool windowsize $id $w $h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># EOF</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>random</category>
        </item>
        <item>
            <title><![CDATA[Welcome]]></title>
            <link>https://routedlogic.net/E6P49T7hrnAOcWud/welcome</link>
            <guid>https://routedlogic.net/E6P49T7hrnAOcWud/welcome</guid>
            <pubDate>Sat, 23 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[This is a new site and a new attempt to invigorate what was once a passion for blogging and sharing solutions to technology problems.]]></description>
            <content:encoded><![CDATA[<p>This is a new site and a new attempt to invigorate what was once a passion for blogging and sharing solutions to technology problems.</p>]]></content:encoded>
            <category>welcome</category>
            <category>itbegins</category>
            <category>again</category>
        </item>
    </channel>
</rss>