Hello! I'm Dan. I am a developer advocate at Databricks working on all things AI. This is my personal site. Expect a mix of Emacs, Databricks, and AI writing, published at irregular intervals.

Before Databricks, I worked at bit.io, a fast, developer-friendly hosted Postgres. I used it to manage data for research and writing projects, covering topics like methane emissions, Bayesian statistics, labor turnover, and U.S. House representation.

Read more…

Recent posts

Allow, ask, deny: contextual policies in Omnigent

July 15, 2026

After working with Omnigent for a few weeks, I found myself wanting a better understanding of Policies, so I implemented a few to understand how they work. First off: what is a policy? If you've worked with coding agents before, you've seen them pause and ask before editing files or reading the contents of certain directories. In Omnigent, these events are governed by policies. A policy is a rule that runs at specified points in a session, such as when the user sends a request to the agent, when the agent replies, or when the agent attempts to use a tool, and returns one of three decisions.

Harness Engineering

February 28, 2026

In the first couple of years of LLMs, we talked a lot about "prompt engineering": how to craft a prompt just so in order to induce the LLM to do what we want. Since then, we've moved on to the more expansive "context engineering": how multiple available sources of context (chat history, file reads, web search results, etc.) should be combined to induce an agent to do what we want. Here, I'm writing about the even-more-expansive notion of "harness engineering": how do we orchestrate the whole loop of LLM invocations, tool calls, background process management, context retrieval, permission asks, etc., to get the agent to do what we want?

Saving and Restoring Window Configurations in Emacs

November 22, 2025

When working in emacs, I often switch between different combinations of windows with different splits. For example, I might have one configuration with an org mode buffer with some notes alongside org-agenda, and another with a Python source file and a Python REPL. Before, I was switching between them by changing buffers and splits each time, which was cumbersome. Registers make it much simpler, and desktop-save-mode lets you persist window configurations across sessions.

Using MLflow's MCP Server for Conversational Trace Analysis

October 1, 2025

MLflow 3.4 introduced an official MCP server that lets AI assistants like Claude interact directly with your MLflow traces. This post explores how to set it up when MLflow is installed in a virtual environment, and demonstrates practical usage with both Claude Desktop and Claude Code for debugging and analyzing GenAI application traces.

Getting Started with Model Context Protocol Part 2: Prompts and Resources

September 21, 2025

In the first part of this series on Anthropic's Model Context Protocol, I showed how to define a very simple MCP server with one tool and install it to Claude Desktop. In this post, we will look at two more MCP concepts and learn how to use them: resources, which expose data and other content to models, and prompts, which are intended to allow users to select reusable prompt templates suited for certain tasks or workflows.

Getting Started with Model Context Protocol Part 1: Add a Simple MCP Server to Claude Desktop

April 12, 2025

This post provides a simple, minimal example of setting up and using an MCP (model context protocol) server for use with Claude Desktop.

There are many MCP guides and tutorials and docs out there. In this one, I attempt to start with very simple implementations with as little complexity as possible in order to get started as quickly as possible.

Future posts will add more complexity, showing how to use additional MCP abstractions like prompts and resources, how to write an MCP client in Python, and how to use LLMs from other providers with MCPs.

All posts →