Practical insights
on software and AI
Architecture decisions, integration lessons, and practical guidance for putting technology to work.
Your MCP Server Authenticates the User, Not the Tool Call
Microsoft states it in an Important callout: MCP server authorization defines access to the server and does not reach individual tools. The protocol makes authorization optional, any connected caller can list every tool and read every description, and the token you issue must not be forwarded to the systems behind. What holds the line is the tool calling the same service method your screens call, so that one rule change covers both and neither drifts.
Read articleWhat Your Search Index Still Answers After You Revoke Access
Azure AI Search offers four ways to do document-level access control, and only security filters are generally available today. Whichever one you pick, the index stores its own copy of the permissions, captured the last time an indexer looked. Changes at the source do not reach it on their own: a parent-scope change in SharePoint and any permission change in ADLS Gen2 both need an explicit resync, and until one runs the index keeps answering from what it captured.
Read articleSQL Server 2025 as an AI Platform, Not Just a Vector Store
CREATE EXTERNAL MODEL and AI_GENERATE_EMBEDDINGS turn the embedding step into a statement over a table. What decides whether it survives contact with production sits around the edges: a database scoped credential whose name has to be the endpoint URL, a retry_count between 0 and 10 that a query can override, an extended event that is the only place the REST status code shows up, and a chunking function whose one chunk type counts characters.
Read articleAdding AI to the .NET Application You Already Run
AddChatClient goes into the same startup file as the repository and the mail sender, resolved by the same dependency injection everything else uses. The part worth deciding deliberately is the order: a cache hit returns without forwarding the request along the pipeline, so nothing registered after the cache runs, and the lookup matches on the whole submitted chat history rather than on the last thing a user typed.
Read articleWhy a Task-Specific Agent Beats a Chatbot Bolted Onto Your App
The scope of an agent is its tool list, not the sentence in its prompt. Its failure path is a retry loop with published defaults, and those defaults decide whether the support desk sees the account number or a generic error three times over. Done is a row that changed, not a satisfied user.
Read articleWhen Custom Software Beats Another SaaS Subscription in 2026
A build-versus-buy decision starts with the workflow a customer would notice, then runs two diagnostics against the incumbent product: how its configured logic is developed and released, and whether one complete slice of records, associations, history, and files can be reconstructed somewhere else.
Read articleBefore You Add AI, Fix the Data Retrieval Layer
Most disappointing AI assistants are not model problems. They are retrieval problems: the wrong copy of the record, no delete path into the index, a service account that reads more than the user can, and no log of what was actually retrieved. Fix those four before adding the model.
Read articleSQL Server Can Now Power Semantic Search Without a Separate Vector Database
SQL Server 2025 stores embeddings natively and searches them with VECTOR_DISTANCE, both generally available. The approximate DiskANN index is preview and carries a deployment constraint that catches teams with a DacPac pipeline. For most business workloads the exact-search path is the answer.
Read articleReady to Build?
Let's engineer your solution.
Every project starts with a conversation. Tell us what you're trying to solve.