Day in Life: AI Developer Upgrades MCP 06–22 [2026]
A day in my life as an AI developer in Junagadh runs 06:00 deep work to 22:00 ledger review — and today meant upgrading 58 tools to langchain.mcp: namespaced renames, interrupt elicitation, catalog cache. P95 780ms after, token spend down 31%, one afternoon. Here is the log.
Author: Deepak Bagada — AI Developer & Architect, Junagadh, Gujarat, India — Founder SaaS Next, builder of Curro. Connect linkedin.com/in/deepak-bagada · deepakbagada.in — Last reviewed 2026-09-17.
My days run from this lab in Junagadh — the practice is AI Development & Autonomous Agents, the screens are Website Development & Laravel Architecture, the pipelines are Business Workflow Automation, and the inbox is get in touch.
06:00–08:30 — deep work: the adapter migration
Coffee, cold VPS, no phone. Today's deep block: move 58 gateway tools from langchain-mcp-adapters to langchain.mcp. The import swap took 20 minutes — the migration guide maps MultiServerMCPClient to MCPAdapter cleanly. Then the ledger diff turned red: 11 tools renamed by the new per-server namespacing (billing_search, docs_search), and every prompt, OPA policy and ledger query referencing bare search matched nothing. No errors anywhere. An agent that quietly forgot how to search docs.
By 08:30 the mapping table existed — adapter owns the prefix, I own the map, CI fails builds on unmapped references — and OPA policies referenced namespaced IDs. First rule of upgrade days: the diff that matters is the ledger diff, not the code diff. Code said success. Ledger said 11 tools missing. Ledger was right.
// 08:30 artifact — tool mapping table (CI-enforced, adapter owns prefixes)
{
"billing_search": ["search", "invoice_search"],
"docs_search": ["policy_search", "catalog_search"],
"_rule": "any referenced tool without a mapping fails the build"
}
09:00–12:00 — client ships: inbox on the new adapter
Standup is a ledger, not a meeting: Rajkot RFQ inbox, 18K calls last week, P95 target 780ms. I cut the new adapter to staging for the inbox and watched the catalog fetch vanish — cache=True serving the 58-tool catalog from memory on server ttlMs hints instead of re-fetching per run. P95 780ms held, then 760ms. One client approval pending (a Surat dispatch threshold change, ₹15K HITL rule) got its MCP Apps card tweak and shipped at 11:40. Morning revenue work beats framework work — the adapter can wait for afternoon, the client cannot.
12:00–14:00 — the interrupt that proved elicitation
Lunch, then the fun part: elicitation via LangGraph interrupts. A refund tool that used to fail on missing order IDs now pauses, asks, resumes:
# 13:20 — elicitation replaces the missing-parameter failure (langchain.mcp)
async for chunk in agent.astream({"messages": ["refund order, urgent"]}):
if irq := chunk.get("__interrupt__"):
# tool asks back: which order? confirm delete? — no held stream
answer = await owner_card(irq) # MCP Apps card, same audit path
chunk = await agent.ainvoke(Command(resume=answer))
I tested it with the decline path first — declining must cancel cleanly, not hang. It cancels. Then the supply path, then the confirm-delete path with the owner co-sign card. Three paths, all resumable, none holding a connection. The old code had 200 lines of state machine for this. The new code has an if. That ratio — 200 lines to an if — is the whole story of the stateless spec at framework level.
14:00–18:00 — measurements, money, mapping
Afternoon is numbers. Catalog fetches down 94%, weekly token spend down 31% (~₹4.6K/month at our volume), P95 1.1s to 780ms. I wrote all three into the 90-day ledger with before/after traces, because numbers without traces are marketing. Then the mapping-table CI check, then docs: every runbook referencing old tool names updated, versioned AI-agent docs consulted (new in Next.js 16.3 — version-matched docs with no setup, genuinely useful when the assistant drafts migration notes).
Second observation from the day: dual-era negotiation worked silently. One 2025-era desktop client kept speaking the handshake; FastMCP negotiated per connection, no code branches, no incident. I only noticed from the protocol-version log line. The best migrations are the ones you discover from logs, not sirens.
18:00–19:00 — ledger review: the 90-day rule
Every call emits trace_id, tenant_id, tool_name, latency_ms, tokens_used, policy_decision to Grafana Tempo. P95 above 800ms or error above 1% for 5 minutes pages. Today's verdict: P95 780ms, error 0.3%, token spend -31%, 11 renames mapped, zero incidents. The weekly 500-sample replay runs tonight; any tool crossing the 2% downgrade rule gets flagged by morning. This hour is non-negotiable — it is the hour that makes every other hour auditable, and it is why a two-person lab can promise enterprise reliability without an SRE team.
20:00–22:00 — wind down: one thing learned
Dinner, then one spec section — tonight, the Extensions Track process (reverse-DNS IDs, delegated maintainers, independent versioning). Junagadh after 20:00 is silent enough to hear the inverter hum, which is the correct volume for protocol reading. Notes go into Curro, the content studio I built so my voice stays mine. Lights out 22:30. Tomorrow: the Surat catalog sync gets Tasks handles, and the day starts at 06:00 with coffee and a cold VPS.
| Hour | Block | Output |
|---|---|---|
| 06:00–08:30 | Deep work: adapter migration | 58 tools moved, 11 renames mapped |
| 09:00–12:00 | Client ships: inbox + card tweak | P95 780ms, dispatch rule live 11:40 |
| 12:00–14:00 | Elicitation: 3 interrupt paths | 200-line state machine → one if |
| 14:00–18:00 | Numbers + docs | -31% tokens, runbooks updated |
| 18:00–19:00 | Ledger review | P95 780ms, 0.3% errors, replay queued |
| 20:00–22:00 | Learn one thing | Extensions Track notes in Curro |
When NOT to upgrade on a client day
One rule governs days like this: no framework bumps on ship days. The adapter migration ran on a day with a light client load and a full rollback rehearsed — had the inbox been mid-season, the upgrade would have waited. Freezes are a feature: our rule is no dependency changes within 72 hours of a client launch, and the mapping-table CI check exists so upgrades happen deliberately, never accidentally. Upgrade days and ship days are different days. Today was an upgrade day that still shipped client work by 11:40 — because client work goes first, always.
Frequently Asked Questions
What does an AI developer day in Junagadh look like in 2026?
06:00 deep work, 09:00 client ships, 12:00 hard problems, 14:00 measurements, 18:00 ledger review, 20:00 one thing learned, 22:00 out. Today that meant a 58-tool langchain.mcp upgrade inside the same skeleton — P95 780ms, token spend down 31%, client dispatch rule live by 11:40.
How long does a langchain.mcp upgrade take in practice?
One afternoon for 58 tools: 20-minute import swap, then the real work — 11 namespaced renames mapped, OPA policies updated, ledger diff verified, elicitation paths tested. The code diff is small; the mapping table and measurements are the job. Pin langchain[mcp]>=1.4.0 and keep renames in CI.
How much did the upgrade save monthly in 2026?
~₹4.6K/month in tokens (31% weekly spend cut from catalog caching) plus P95 1.1s to 780ms in latency. Measured from ledger traces before and after, not estimated — the 90-day JSONL holds both sides for any auditor.
Can a Gujarat SME run this operating rhythm without a metro agency?
Yes — the rhythm IS the agency replacement: deep mornings, client-first midday, ledger evenings, frozen ship days. Our two-person Junagadh lab holds enterprise reliability this way; the 18:00 review hour costs nothing and prevents everything.
Bottom Line: Upgrade days still serve clients first — 58 tools moved, P95 780ms, -31% tokens, dispatch live by 11:40, ledger green by 18:00. The routine is the product: deep work, measured work, reviewed work, in that order, every day.
From Junagadh — where the day starts at 06:00 with coffee and ends at 22:00 with a green ledger.