Posts

mcp-rwee: Four Tools, and arcpy Runs on Another Machine

Image
In my post arcpi: Not Everything Needs an MCP to Be Agentic , I let an agent call the ArcGIS REST API directly, with no MCP server in front of it. This time I have the opposite problem. My data and arcpy are on a Windows machine with ArcGIS Pro. Claude Code runs on my Mac. arcpy has no REST API, and it does not run on a Mac. So here, a small MCP server earns its keep. The server is mcp-rwee . The name is its tool list: r ead, w rite, e dit and e xecute. The client writes a Python script on the Windows machine, runs it there and answers from the printed output. In this post, I explain how it works, what one real question looked like, and what Windows taught me that macOS did not. Four tools and a prompt file The server has exactly four tools and one prompt. There is no buffer tool, no select_by_location tool and no list_layers tool. arcpy already has all of these. The client writes the script that calls them. read , write and edit work on text files on the Windows machin...

An Agent Loop That Runs in the Browser: Rust, WASM and One MCP Endpoint

Image
Can the whole agent run on the client? I mean the loop itself: the model calls, the tool calls and the context management. The server still runs the tools. But the part that decides what to do next lives in the browser tab. gen-ai-rs is my experiment to answer that question. It is a small agent harness in Rust, compiled to WebAssembly. It talks to an OpenAI-compatible model and runs tools through one same-origin MCP endpoint. A plain question uses one model call. A question about North Sea wells draws them on an ArcGIS map. Where this comes from This is my third pass at the same problem. The first was IDRIS, about two and a half years ago. It explored geospatial data with an LLM and SQL. Its text-to-SQL side came from what I learned from Vanna . There was little to copy then, so I learned the loop from the ground up, with help from OpenAI's building agents track and its practical guide to building agents . The second was the Generative AI Toolkit. It grew out of IDRIS and be...

Three Pads: Claude Writes the Weights, No Training

Image
In my earlier lander posts , every controller needed something first: training steps, a solver, or a fine-tuned model. This week I read Sparks of Weight-Space Programming from MIT CSAIL. It makes a claim I had to test: a frontier LLM can read and write the weights of a neural network directly, with no optimizer and no gradient descent. The authors call this Weight-Space Programming. Their LLM is GPT-6 Astra. I wanted to know what Claude does with the same inputs, and what the result looks like on a small problem of my own. So I built weight-space-programming with Claude Code, and I added a small landing game. In this post, I show how the test works, what the numbers say, and where the method fails. You can play the game here . A 484-weight network flies the craft. Claude wrote the weights in one reply. Nothing was trained. In the last flight, the target changes from pad 1 to pad 3. Shown at 2x speed. The claim The post has eight experiments, in three groups: Read....

Loci: a landscape for your notes

Image
A post on r/secondbrain, Maps organize information through landscapes — why? , stopped me for a minute. It brought back Moonwalking with Einstein , Joshua Foer's year with competitive memorizers, and the old trick at the center of it: put each thing you want to remember in a place, then walk the places. The Romans called the places loci . I have a few thousand notes, clippings and links. I can search them when I remember a word. I cannot walk them. So I built a landscape for them and called it Loci . Here is the idea in twenty notes. I imported twenty short Markdown files with tags and [[wikilinks]] . They became five hills. I clicked one note, and then I orbited the terrain. What a hill is Every note is a point. Notes that mean the same thing sit near each other. Groups of near notes become regions, and each region is a hill. The hill with the most notes is the tallest and the widest. Height is a count, not a judgment. A tall hill means you wrote a lot about that topic, no...

TrackAnything: Click an Object, and a DGX Spark Follows It

Image
I want to point my Mac camera at a scene, click an object, and see a mask stay on that object while it moves. I do not want to train a model for each object. I also want to run the model on my own hardware, not on a hosted API. Segment Anything models can do this. You select an object one time, with a point, a box or a name. The model then finds the same object in each new frame and marks its pixels. This marked area is the mask. The project is TrackAnything . It runs three trackers (EfficientTAM, SAM 2.1 and SAM 3) on an NVIDIA DGX Spark. The Mac only shows the camera and the result. In this post, I show how the pieces fit together, what the numbers say, and where the method is wrong. Vehicles on a motorway, tracked with EfficientTAM-S. The detector runs again every 15 frames, so new vehicles get a mask. Video: "Motorway A40 - on bridge above the traffic" by Kathinka Engels / Sounds of Changes, CC BY 3.0 , via Wikimedia Commons. Changes: audio removed, trimmed to 10 se...

Maps in the Claude Code Terminal

Image
I use Claude Code for GIS work. When I ask it for a map, I get a URL or a file path. I want to see the map. So I built a plugin that draws it in the terminal. The idea came from claude-inline-images by kbrianps. It draws PNG files that Claude reads. I wanted the same result for map services. The plugin is inline-maps . What it is Claude Code loads the plugin at session start. Claude Code calls this type of plugin a "mod". The mod API is early access. You need Claude Code 2.1.287 or later. The plugin adds two things: A tool, show_map . Claude calls it when you ask for a map. A command, /map . You type it at the prompt. Both use the same function. Only the way they return the result is different. Which map services it reads The plugin reads the URL and identifies the type of map service. Then it makes one request for a map image, or one request for each tile. It tests the patterns in the order of the table. Map service URL pattern Request ...

Clay Explorer: Point at One Tank, Find the Others

Image
In my last post, Where Is Jev? , I found storage tanks in an overhead image. I asked a vision-language model one fixed question about each tile, and SAM 3 found the tanks in the tiles that passed. This time, I want to try the opposite approach. I do not ask a question, and I do not write a prompt. I point at one tank, and the app finds the chips that look like it. The tool is Clay Embedding Explorer , a small web app that I built around the Clay v1.5 foundation model. It shows chip embeddings on a map, over the source image. In this post, I explain what an embedding is here, how the pipeline works, and what the tank numbers say. One of the numbers looked bad at first, and the reason was more interesting than the number. The image and the labels I use the same image as last time: one RGB GeoTIFF, 8,200 × 6,087 pixels at 0.5 m per pixel, in EPSG:3857. Web Mercator stretches distances, so the true ground size of one pixel at this latitude is 0.457 m. A FileGDB has 97 hand-drawn tan...