Build1 distinct publisher3 min readUpdated
A recruiter's date-bounded search lost its date between an Azure AI Foundry tool call and the API, and the agent reported a count anyway. Translation that changes meaning has to fail loudly.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A recruiter asked for candidates published since a given date, and the assistant came back with a confident, plausible-looking count [1]. The date constraint never survived the trip from the model's tool call to the database query, so the count described a different universe than the one requested, and nothing crashed on the way [2][3].
This is production code, not a prototype, according to the engineer who wrote it up on dev.to [4]. The path is short: Azure AI Foundry asks for a tool, an MCP bridge receives the call, parses the JSON, switches on the tool name, builds a request body, calls the application service over HTTP, and returns tool output through submitToolOutputs [5][6]. The failure is entirely inside the third step. The model did not emit a typed date parameter; it emitted an OData filter string, and the application endpoint does not speak OData [7].
So the bridge tries to rescue the date with a regular expression. In mcp-servers/azure-agent-mcp/src/services/azure-agent-client.ts, inside executeToolCall, it matches on `date_published\s+ge\s+(\d{4}-\d{2}-\d{2})` and, on a hit, assigns the captured value to dateFilter [8]. The author's own framing is the useful part: that regex is a parser for a query language the model was never constrained to emit correctly [15]. Around it, the bridge fills in defaults - query falls back to `*`, location falls back from one argument name to another, and limit resolves through Math.min(Number(args.top) || Number(args.limit) || 20, 50), which means a default of 20 and a hard ceiling of 50 [9][21]. The raw filter is passed through, and the extracted date goes out as a typed field only when parsing worked [9].
Here is the body that went over the wire, per the writeup: query "wealth advisor", limit 20, include_count true, filter "date_published gt 2026-01-14T00:00:00Z", date_from null, and a row of honest nulls for location, designations and the rest [10]. Eleven fields, two of which contradict each other [20]. The filter says a date bound was requested. date_from says none was applied [11]. The pattern accepts `ge` and the model wrote `gt`, so one comparison operator is the whole distance between a bounded search and an unbounded one [11]. Quoting the date, writing `date_published/gt`, or putting the clause second in a compound filter all land in the same place [12]. Nothing on either side of the boundary compares those two fields [13].
That is the shape of the class, not just this bug. The boundary accepts whatever the model emitted and translates it into the service contract, and the author's argument is that when translation changes meaning it should stop [16]. A dropped filter does not throw; it answers [14].
The same silence shows up one layer in. In app/agents/orchestrator.py, AgentOrchestrator.process routes the query, runs the primary agent, starts extra agents in parallel, combines what comes back, and carries a timing dictionary of router_ms, agent_ms and total_ms [17]. The parallel branch uses asyncio.gather with return_exceptions=True, and only successful AgentResponse objects reach secondary_results [18]. That flag buys a partial answer instead of no answer, and it costs silence, because nothing logs the exception [19].
Two things to watch in your own bridges. First, whether any component reconciles the raw filter against the typed fields derived from it, since in this case neither side did [13]. Second, what your timing dictionary does not contain: router_ms, agent_ms and total_ms tell you a run was fast, not that every agent in it returned [17][19].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
A recruiter asked for candidates published since a date; the assistant answered with confidence and the count it gave looked plausible.
The date constraint never survived the trip from the model's tool call to the database query, so the assistant counted the wrong universe and spoke as if it had done the exact request.
The search ran, results came back, and nothing crashed.
The anonymized request body sent over the wire contained: query "wealth advisor", location null, designations null, min_experience null, min_aum null, min_production null, remote_only null, limit 20, include_count true, filter "date_published gt 2026-01-14T00:00:00Z", date_from null.
filter says a date bound was requested while date_from says none was applied; the pattern accepts ge and the model wrote gt, so a single comparison operator is the entire distance between a bounded search and an unbounded one.
The two fields contradict each other inside one request body, and nothing on either side compares them.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Specific first-party artifacts, no external verification
The account is unusually concrete for a single-source item: it names the file and function holding the extraction regex, quotes the regex and the limit expression, and publishes the anonymized request body whose filter and date_from fields contradict each other. That specificity is checkable in principle but not in practice here — no repository, commit, trace, or reproduction is linked, and no second party corroborates any of it, which caps the score well below high confidence.
One disclosed production deployment
Adoption evidence is limited to a single first-party disclosure that this Azure AI Foundry plus MCP bridge stack runs in production for a recruiting search workflow. There are no user counts, request volumes, other deployments, or third-party usage data, so breadth cannot be established beyond one practitioner's system.
Slightly understated, though generalization outruns the sample
The framing is diagnostic rather than promotional: the author reports a failure in their own production system, publishes the offending body, and sells nothing, which puts stated claims at or slightly below what the evidence supports. The one direction of overreach is the leap from a single codebase to 'the normal shape of the bug' — a plausible but unmeasured generalization about MCP boundaries at large — which offsets most of the understatement.
Personal-visibility incentive, low commercial pressure
The author writes about their own production system on a personal developer-platform account, so there is a reputational and audience-building incentive in publishing a sharp technical postmortem. That incentive points against exaggeration of capability, since the piece documents the author's own defect, and no sponsor, vendor relationship, or product being sold is disclosed. The residual distortion risk is selective presentation: only the author can choose which code and which request body to show.
Single publisher, single first-party account
Confidence is bounded by structure rather than by internal quality. One publisher and one article supply every claim; the artifacts are detailed and internally consistent, but nothing is independently reproducible from the material given, and prevalence beyond this codebase is asserted rather than shown. The narrow, mechanism-level claims deserve more trust than the generalized design conclusion.
build
Before you spend quota on an agent skill, make it pass an eval harness1 distinct publisher
build
The third answer: a dead-code tool allowed to say "not traced yet"1 distinct publisher
build
MCP's caching hints will hand Alice's tool list to Bob unless identity is in the key1 distinct publisher
build
Return the admission record, not the log line: one memory service's case for receipts1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 15, 2026