# IMTI > I lead a talented team of software development and creative engineers, covering many industries looking to collect, analyze, move, buffer, queue, process and present data in significant ways. My expertise and that of my team revolve around microservices, artificial intelligence, algorithms, and machine learning. Craig Johnston has been writing here continuously since 2008. Each post is a long-form, short-form, or working-draft note grounded in real production work. ## Recent notes - [The Agent Gateway to Your Platform: mcp-data-platform](https://imti.co/mcp-data-platform/): An Apache-2.0 MCP server that gives frontier models access and grounded context to everything you built - [A Data Catalog Your Agents Can Read: DataHub](https://imti.co/datahub-metadata-catalog/): Metadata, lineage, and a business glossary over the whole platform - [Self-Hosted BI with Apache Superset](https://imti.co/apache-superset-bi/): Dashboards and SQL exploration over the lakehouse and Postgres, a Tableau replacement on the platform's SSO - [Self-Hosted Integration with Apache NiFi](https://imti.co/apache-nifi-integration/): Visual dataflow and ETL on your own cluster, instead of Workato and the iPaaS vendors - [Self-Hosted SSO with Keycloak](https://imti.co/keycloak-sso/): One login for every user-facing tool on the platform, instead of renting Okta or Auth0 - [Your Own Snowflake: A Trino and Iceberg Lakehouse](https://imti.co/trino-iceberg-lakehouse/): SQL analytics over open table formats on the object storage you own - [Self-Hosted S3 with SeaweedFS](https://imti.co/seaweedfs-object-storage/): S3-compatible object storage for the data lake, backups, and the lakehouse - [A Search Layer You Own: OpenSearch on Kubernetes](https://imti.co/opensearch-kubernetes/): The index for the platform, on the Apache-licensed fork of Elasticsearch - [Kafka Without ZooKeeper: KRaft on Kubernetes with Strimzi](https://imti.co/kafka-kraft-strimzi/): A real-time event backbone, without the separate ZooKeeper ensemble to operate - [When Your Tools Lie to the Agent](https://imti.co/when-mcp-tools-lie/): 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. - [A Database You Own: Postgres with CloudNativePG](https://imti.co/postgres-cloudnativepg/): High-availability PostgreSQL on your own storage, without the managed bill - [Where Tribal Knowledge Goes](https://imti.co/mcp-knowledge-loop/): An insight an analyst shares mid-session becomes a reviewed, signed-off change to the catalog rather than vanishing when the conversation ends. - [Ingress-Nginx Retired. Meet the Gateway API.](https://imti.co/kubernetes-gateway-api/): Exposing services and automating TLS in 2026, with Cilium and cert-manager - [Steering Agents Without Caging Them](https://imti.co/mcp-steering-agents/): Steering agents from the server middleware instead of the tool descriptions. - [Storage the Cluster Owns: Rook and Ceph](https://imti.co/rook-ceph-storage/): Portable block and shared-filesystem persistence for stateful services, no managed disks required - [One Process, Many MCP Servers](https://imti.co/mcp-server-composition-go/): 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. - [Build a Kubernetes Cluster You Own](https://imti.co/own-your-kubernetes-cluster/): The vendor-neutral substrate for a self-hosted platform: kubeadm, containerd, and Cilium on generic VMs - [Why I Build MCP Servers in Go, Not Python](https://imti.co/mcp-by-design-go/): 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. - [Build a Better Platform Than You're Renting](https://imti.co/platform-development-age-of-agents/): Cloud-grade data platforms from FOSS on Kubernetes, now that agents run the hard part - [A Complete MCP Server and Client in Go](https://imti.co/mcp-capstone-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 - [Running Ollama and pgvector on Kubernetes](https://imti.co/ollama-pgvector-kubernetes/): Vector Search Without the Vector Database, Part 3 - [Tasks: Durable, Async Tool Calls](https://imti.co/mcp-tasks-async/): 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 - [Security: Tool Poisoning, Prompt Injection, and the Trust Boundary](https://imti.co/mcp-security-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 - [Authorization: OAuth 2.1 for HTTP MCP Servers](https://imti.co/mcp-authorization-oauth/): 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 - [Logging and the Notification Family](https://imti.co/mcp-logging-notifications/): Structured server logs filtered by severity, and the list_changed notifications that keep a client's view of a server from going stale ## Series - [advanced platform development](https://imti.co/series/advanced-platform-development/) (14 notes) - [ai](https://imti.co/series/ai/) (3 notes) - [ai on a leash](https://imti.co/series/ai-on-a-leash/) (4 notes) - [apache nifi](https://imti.co/series/apache-nifi/) (5 notes) - [blockchain](https://imti.co/series/blockchain/) (3 notes) - [cassandra](https://imti.co/series/cassandra/) (1 notes) - [data](https://imti.co/series/data/) (1 notes) - [data science](https://imti.co/series/data-science/) (3 notes) - [elasticsearch](https://imti.co/series/elasticsearch/) (1 notes) - [golang](https://imti.co/series/golang/) (1 notes) - [ingress](https://imti.co/series/ingress/) (1 notes) - [kafka](https://imti.co/series/kafka/) (1 notes) - [kubectl](https://imti.co/series/kubectl/) (1 notes) - [kubernetes](https://imti.co/series/kubernetes/) (27 notes) - [linear algebra crash course](https://imti.co/series/linear-algebra-crash-course/) (12 notes) - [linear algebra in go](https://imti.co/series/linear-algebra-in-go/) (10 notes) - [mcp by design](https://imti.co/series/mcp-by-design/) (5 notes) - [mcp on the wire](https://imti.co/series/mcp-on-the-wire/) (20 notes) - [python](https://imti.co/series/python/) (1 notes) - [raspberry pi](https://imti.co/series/raspberry-pi/) (2 notes) - [vector search without the vector database](https://imti.co/series/vector-search-without-the-vector-database/) (3 notes) ## Tags - [kubernetes](https://imti.co/tags/kubernetes/) (47 notes) - [ai](https://imti.co/tags/ai/) (37 notes) - [mcp](https://imti.co/tags/mcp/) (36 notes) - [go](https://imti.co/tags/go/) (28 notes) - [data](https://imti.co/tags/data/) (27 notes) - [data science](https://imti.co/tags/data-science/) (24 notes) - [linear algebra](https://imti.co/tags/linear-algebra/) (22 notes) - [protocol](https://imti.co/tags/protocol/) (20 notes) - [golang](https://imti.co/tags/golang/) (17 notes) - [math](https://imti.co/tags/math/) (17 notes) - [python](https://imti.co/tags/python/) (17 notes) - [foss](https://imti.co/tags/foss/) (14 notes) - [platform](https://imti.co/tags/platform/) (14 notes) - [security](https://imti.co/tags/security/) (13 notes) - [devops](https://imti.co/tags/devops/) (12 notes) - [linear algebra: python](https://imti.co/tags/linear-algebra-python/) (12 notes) - [matrices](https://imti.co/tags/matrices/) (11 notes) - [linear algebra: golang](https://imti.co/tags/linear-algebra-golang/) (10 notes) - [machine learning](https://imti.co/tags/machine-learning/) (8 notes) - [agents](https://imti.co/tags/agents/) (6 notes) - [development](https://imti.co/tags/development/) (6 notes) - [docker](https://imti.co/tags/docker/) (6 notes) - [elasticsearch](https://imti.co/tags/elasticsearch/) (6 notes) - [ingress](https://imti.co/tags/ingress/) (6 notes) - [apache nifi](https://imti.co/tags/apache-nifi/) (5 notes) - [json-rpc](https://imti.co/tags/json-rpc/) (5 notes) - [testing](https://imti.co/tags/testing/) (5 notes) - [blockchain](https://imti.co/tags/blockchain/) (4 notes) - [claude](https://imti.co/tags/claude/) (4 notes) - [kubectl](https://imti.co/tags/kubectl/) (4 notes) - [microservices](https://imti.co/tags/microservices/) (4 notes) - [sdlc](https://imti.co/tags/sdlc/) (4 notes) - [data engineering](https://imti.co/tags/data-engineering/) (3 notes) - [iot](https://imti.co/tags/iot/) (3 notes) - [json](https://imti.co/tags/json/) (3 notes) - [kubefwd](https://imti.co/tags/kubefwd/) (3 notes) - [opensearch](https://imti.co/tags/opensearch/) (3 notes) - [postgres](https://imti.co/tags/postgres/) (3 notes) - [postgresql](https://imti.co/tags/postgresql/) (3 notes) - [raspberry pi](https://imti.co/tags/raspberry-pi/) (3 notes) - [utils](https://imti.co/tags/utils/) (3 notes) ## Elsewhere - [Deasil Works](https://deasil.works) - [txn2](https://txn2.com) - [Plexara](https://plexara.io) - [GitHub](https://github.com/cjimti) - [X](https://x.com/cjimti) - [LinkedIn](https://linkedin.com/in/cjimti) ## Full archive - [/sitemap.xml](https://imti.co/sitemap.xml) - complete URL index - [/index.xml](https://imti.co/index.xml) - RSS feed of all notes