MCP by Design

SERIES · 11 NOTES · 2026

Where MCP Without the SDK took the protocol apart message by message, this series is about the engineering around it. An MCP server is written by an agent, called by an agent, and often evaluated by an agent, and every one of them can confabulate. The work is putting things into that loop that cannot.

Eleven notes: why I write these servers in Go rather than Python, how to compose several servers into one process instead of running three that cannot see each other, how to steer an agent from server middleware rather than from tool descriptions, where knowledge from a session goes so it does not vanish when the conversation ends, what happens when a tool’s description does not match what the tool does, how Starlark is embedded so an agent can write the code that updates a dashboard after the conversation ends, how Hive maps a CSV in object storage to a table without ingesting it, how a session handle lives in a tool argument after the protocol stopped carrying one, how an OpenAPI document is indexed so a search for list customers hits every catalog, how the process brokers OAuth so Claude gets a token without the server becoming an identity provider, and how a service account on a connection carries the credential so Trino never has to impersonate the caller.

All of it comes out of txn2/mcp-data-platform, an Apache-2.0 Go platform that fronts Trino, DataHub, and S3 behind one MCP endpoint, also available hosted as Plexara. Design and SDLC are different work and a server needs both. A well-designed server can still be unverified, and a heavily tested one can still be badly designed.

MCP by Design
1

Why I Build MCP Servers in Go, Not Python

An MCP server faces an agent on both sides. Go lets me leash the agent that writes it and harden the contract the agent reads.
MCPGOAIAGENTS
2026-06-19
2

One Process, Many MCP Servers

Compose mcp-trino, mcp-datahub, and mcp-s3 as Go libraries behind one endpoint, instead of running three servers that can't see each other.
MCPGOAGENTSDATA
2026-06-22
3

Steering Agents Without Caging Them

Steering agents from the server middleware instead of the tool descriptions.
MCPGOAGENTSAI
2026-06-24
4

Where Tribal Knowledge Goes

An insight an analyst shares mid-session becomes a reviewed, signed-off change to the catalog rather than vanishing when the conversation ends.
MCPAGENTSDATAAI
2026-06-26
5

When Your Tools Lie to the Agent

I drove my own platform as a real client and told it to find every place a tool said one thing and did another. A case study in MCP SDLC.
MCPGOAGENTSTESTING
2026-06-28
6

Don't Sandbox Python. Embed Starlark.

starlark-go in a Go server: FileOptions, host bindings, and a cancel watchdog
MCPGOAGENTSSTARLARK
2026-08-24
7

Don't Ingest the CSV. Point Hive at It.

Hive still maps a table name to a directory of files
MCPGOAGENTSHIVE
2026-08-26
8

Sessions Left the Protocol. Put the Handle in the Argument.

platform_info mints dps_…; the model threads it. Go SDK v1.7.0, MCP 2026-07-28.
MCPGOAGENTSPROTOCOL
2026-08-28
9

REST APIs for Agents

Index the OpenAPI document. Search across catalogs. Then call one operation.
MCPGOAGENTSOPENAPI
2026-08-30
10

OAuth in Front of Keycloak

Pre-registered clients and PKCE. Login stays in the IdP.
MCPGOOAUTHSECURITY
2026-09-01
11

Don't Impersonate the Caller. Put the Credential on the Connection.

Trino, S3, DataHub, and vendor APIs do not share an identity model. They all have a credential.
MCPGOSECURITYAUTHORIZATION
2026-09-03