Also at Deasil Works · txn2 · Plexara
Profiles GitHub · X · LinkedIn
Theme Light · Auto · Dark
Professional notes by Craig Johnston
long-form, short-form, working drafts · since 2008
VOL. XIX · MMXXVI
106 NOTES IN PRINT

Recent Notes

DESCENDING · JUNE 2026 · 106 IN TOTAL
CV

A Complete MCP Server and Client in Go

One server that uses every primitive, runs over both transports, sits behind auth, and is tested end to end, with one annotated trace through all of it
MCPGOPROTOCOLAI
2026-06-08
CIV

Running Ollama and pgvector on Kubernetes

Vector Search Without the Vector Database, Part 3
KUBERNETESOLLAMAPOSTGRESPGVECTOR
2026-06-07
CIII

Tasks: Durable, Async Tool Calls

The experimental 2025-11-25 primitive that turns a request into call-now-fetch-later, hand-rolled on the wire because the SDK has not caught up
MCPGOPROTOCOLTASKS
2026-06-06
CII

Security: Tool Poisoning, Prompt Injection, and the Trust Boundary

A server's words flow straight into the model's context. The anatomy of how that becomes an attack, and where the host has to stand to stop it
MCPGOPROTOCOLSECURITY
2026-06-04
CI

Authorization: OAuth 2.1 for HTTP MCP Servers

How a remote server proves who is calling: the discovery chain, resource indicators that bind a token to one server, and the passthrough ban that stops a confused deputy
MCPGOPROTOCOLOAUTH
2026-06-02
C

Logging and the Notification Family

Structured server logs filtered by severity, and the list_changed notifications that keep a client's view of a server from going stale
MCPGOPROTOCOLLOGGING
2026-05-31
XCIX

Progress, Cancellation, Ping, Pagination, and _meta

The plumbing every MCP primitive shares: how a long call reports progress, how either side cancels one, how a connection is checked, how a list is paged
MCPGOPROTOCOLAI
2026-05-29
XCVIII

Elicitation: When the Server Needs to Ask the User

The server asks a person for input mid-task, with a flat form for ordinary data and a URL handoff for the secrets a form must never touch
MCPGOPROTOCOLELICITATION
2026-05-27
XCVII

Roots: Telling the Server Where It May Look

The client hands the server a list of directories it is allowed to use, a boundary the server asks for and the client defines and enforces
MCPGOPROTOCOLROOTS
2026-05-25
XCV

Sampling: When the Server Calls Your Model Back

The protocol inverts. A server asks the client to run the host's model, with no API key of its own and a human able to deny every request
MCPGOPROTOCOLSAMPLING
2026-05-23
XCVI

The Embedding Pipeline on Postgres and Ollama

Vector Search Without the Vector Database, Part 2
GOPOSTGRESOLLAMAMCP
2026-05-23
XCIV

Completion: Argument Autocomplete for Prompts and Resources

One method that suggests values as a user fills in an argument, and the context field that scopes those suggestions to what is already filled
MCPGOPROTOCOLCOMPLETION
2026-05-21
XCIII

Prompts: Server-Authored Conversation Starters

The third server primitive and the one people misread: templates the user selects, rendered into messages that can embed a server's own resources
MCPGOPROTOCOLPROMPTS
2026-05-19
XCII

Resources: list, read, templates, and subscriptions

The primitive for data the model reads, the counterpart to tools, with URI templates for whole families and live notifications when something changes
MCPGOPROTOCOLRESOURCES
2026-05-17
XCI

Tools, Part 2: Calling, Content Types, and Structured Output

Every shape a tool result can take: the five content types, structured output validated against a schema, and the difference between a failed tool and a failed protocol
MCPGOPROTOCOLTOOLS
2026-05-15
XC

Tools, Part 1: Discovery and the inputSchema Contract

What the model actually receives when it lists a server's tools, how the schema is built from a Go type, and why a tool's annotations cannot be trusted
MCPGOPROTOCOLTOOLS
2026-05-13
LXXXIX

Transport II, Streamable HTTP: One Endpoint, Two Directions

A single HTTP path carries the whole protocol, a session id threads state across requests, and a dropped stream resumes where it left off
MCPGOPROTOCOLHTTP
2026-05-11
LXXXVIII

Transport I, stdio: Two Pipes and a Subprocess

The simplest MCP transport, built by hand on both sides with no SDK, plus the stderr rule that silently breaks servers
MCPGOPROTOCOLSTDIO
2026-05-09
LXXXVII

Why Data MCPs Need Vector Search

Vector Search Without the Vector Database, Part 1
AIMCPPOSTGRESPGVECTOR
2026-05-08
LXXXVI

The Handshake: initialize, Capabilities, and Version Negotiation

The one exchange that must happen before any other MCP method is legal, hand-rolled in Go against a real server
MCPGOPROTOCOLJSON-RPC
2026-05-07
LXXXV

JSON-RPC 2.0: The Grammar Underneath MCP

Three message shapes, one error object, and a hundred and fifty lines of Go that every MCP transport is built on
MCPGOPROTOCOLJSON-RPC
2026-05-05
LXXXIV

Why a Protocol, Not an API

Build the same tool as a REST endpoint and as an MCP server, then watch what discovery, schemas, and the callback direction cost to hand-roll
MCPGOAIPROTOCOL
2026-05-03
LXXXIII

Why Read the Wire When the SDK Hides It

Drive a real Go MCP server with four lines of JSON and watch the protocol the SDK keeps out of sight
MCPGOAIPROTOCOL
2026-05-01
LXXXII

The Pre-Commit Review Gate

AI on a Leash: Mechanical Self-Review for Claude Code
AICLAUDEDEVOPSTESTING
2026-04-22
LXXXI

The Two Failure Modes That Break Your AI Data Agent

A Case Study in Agent Psychology
MCPLLMAIOPENSEARCH
2026-02-26
LXXX

PostgreSQL to OpenSearch with PySpark on Kubernetes

Date-windowed ETL, idempotent upserts, and CronJob scheduling
KUBERNETESPOSTGRESQLOPENSEARCHPYSPARK
2026-02-25
LXXIX

GoReleaser with Cosign Signing and Syft SBOM

Signed Builds and Supply Chain Security for Go Projects
GOLANGDEVOPSSECURITY
2026-02-11
LXXVIII

AI on a Leash: Complete Go Project Configuration

AI on a Leash for Go
AIGOLANGTESTINGDEVOPS
2026-02-09
LXXVII

Ralph's Uncle

AI on a Leash
AITESTINGDEVOPSCLAUDE
2026-02-06
LXXVI

Go's Constraints and Idioms Make AI Coding Better

From Vibe Coding to Vibe Engineering
AIGOLANGCLAUDEDEVOPS
2026-02-04