1. How we got here
The five dates that took us from chatbots to coworkers, with the real citations.
- 2017. The transformer architecture is published ("Attention Is All You Need", Vaswani et al.). Every modern LLM descends from it.
- June 2022. A Google engineer, Blake Lemoine, goes public claiming the LaMDA chatbot is sentient. The world meets the idea of a machine that talks like a person. It was a brain in a jar: brilliant at text, unable to act.
- November 2022. ChatGPT launches. Everyone experiences an LLM first-hand, including its hallucinations, and most people's mental model of AI freezes right here. That frozen model is why your techs and your customers underestimate what is now possible.
- 2022-2025. Two upgrades around the model, while the model itself stays text in, text out. Reasoning: the model spends tokens thinking and checking before answering (the ReAct pattern was published by Yao et al. in October 2022, DeepSeek's R1 made reasoning a mainstream moment in January 2025). Tool use: the model can request actions, and a harness executes them. Anthropic published the Model Context Protocol (MCP) as an open standard in November 2024, which is why any client can now talk to any toolbox.
- Now. Reasoning plus tool use in a loop is an agent. On a schedule with a memory, it is a coworker.
2. The agentic loop, properly defined
If you can onboard a level-1 technician, you already understand agents.
An agent is three things plus a loop:
- A system prompt. Who you are, how we work here, what you must never do. The employee handbook.
- A tool registry. The systems it may touch, each with a clear description. The portal logins.
- A task. The ticket.
The loop: read the task, think, pick a tool, run it, look at the result, and go again until done or until a turn cap stops it. One round trip (model requests a tool, the harness executes it and returns the result) is one turn. Real production loops run anywhere from 1 to 30 turns. The model never executes anything itself. The harness does, which is exactly where your controls live.
The worked example
A mailbox permission request arrives. The loop: read the ticket and its notes, search past tickets for how this customer has done it before, check the requester is an authorised approver, run the Exchange change, write the time entry, note the ticket. Every step is loop-shaped, which is why a well-tooled agent can carry it, and why the interesting question for your team is which parts of each role belong inside the loop and what people do with the time that comes back.
3. Script, API call, or agent: choosing the rung
Agentic by default is overkill. The judgement about which rung to use is the product.
| Rung | Use when | Runtime cost | Examples |
|---|---|---|---|
| Deterministic script | The steps never change. A to B, on a schedule. | Effectively zero. No inference bill, never drifts. | Data syncs, licence reconciliation, report generation, user onboarding with fixed steps |
| One-shot API call (small model) | One judgement inside an otherwise fixed pipeline. | Fractions of a cent per item on a Haiku-class model. | Classify a ticket, summarise a document, extract fields, screen for prompt injection |
| Agent loop | Genuine multi-step reasoning across tools, unpredictable branching. | Cents to tens of cents per task on current pricing. | Investigate a ticket, plan a change, research and draft |
Decision test: write the steps down. If you can write them all, it is a script. If you can write all but one judgement, it is a script with one API call inside it. Only when you cannot enumerate the steps does the task earn an agent. And note the pattern we apply constantly: when an agent does the same task the same way three times, we convert that path into a deterministic tool and take the model out of the runtime.
The patterns you will actually use
The working vocabulary, straight from Anthropic's own training material. Every automation you build will be one of these or a combination.
- Augmented LLM. One bounded model call plus tools and retrieval, wired by your code.
- Workflow / chaining. Steps your code orchestrates, each step's output feeding the next. Loggable and testable.
- Routing. A classifier picks the right downstream path per input type.
- Orchestrator and subagents. A parent splits the work, delegates, then synthesises and verifies coverage.
- Evaluator-optimizer. A second model grades the draft against a rubric and loops until it passes.
- RAG / retrieval. Chunk and index stable knowledge, retrieve at query time. Never for live state, live state gets a tool call.
- Guardrails. Input screens, output filters, tool-call authorisation, and human-review routing by stakes.
- Skills. Versioned, packaged procedures the whole organisation and every agent reuses.
The levers that cut cost every month
- Prompt caching. Stable prefix first, dynamic content last. Cached reads bill at roughly a tenth of the input rate.
- Batch API. Around half price for async-tolerant work, up to 100,000 requests a batch.
- Model tiering. Haiku, Sonnet and Opus each earn their slot on eval evidence. One published case cut cost 71% by routing the classifier to Haiku and keeping the top model only where it earned its keep.
- Advisor. A stronger model second-opinions the plan before it ships. We run this in production: our coworker's plans get an Opus-class review before a human ever sees them.
- Extended thinking. Billed as output tokens, so enable it only where an eval proves the accuracy gap.
- Evals before code. Golden datasets (representative plus adversarial) gate every prompt and model change. Grade with code checks first, a calibrated judge model second, humans last.
4. Get your house in order
Build for yourself before you build for customers. Every mistake you make on your own tenant is a lesson, on a customer's it is an incident.
Start quietly, start personally
- Get a personal Claude subscription and build a proof of concept for one painful internal process. Keep it local. Use Git from day one. Work solo or with one other builder until it is worth showing.
- On the "Claude owns everything you build" claim you may hear: Anthropic's consumer terms assign ownership of outputs to the user. For company work, review the commercial terms yourself and involve whoever owns your contracts. The ownership scare is not what it is made out to be, but read the terms that actually apply to your account type.
- Adopt the vendor gate now: every tool you buy must expose a public API with a published schema. A closed platform is a black spot your AI cannot see. Ask for the OpenAPI or Swagger document in the sales call and watch what happens.
- Hand Claude the CLIs. With the Azure CLI (az), AWS CLI or Google Cloud CLI, plus the GitHub CLI (gh), Claude can drive the entire lifecycle: size and deploy the server, configure the resources, read the logs when something breaks, and raise and review the pull request. Be lazy on purpose: if Claude can deploy it, Claude can troubleshoot it, because it knows exactly how it was built.
Security posture from the first day
- Secrets live in a vault (Azure Key Vault or equivalent) from the first script. Apps authenticate with managed identities wherever the platform allows.
- Have the AI security-review everything it builds, and then have a human security partner review what goes to production. There are MSP-focused security firms in this community's orbit (Siege Cyber is one we hear good things about). Budget the review into every build.
- Keep anything internet-facing behind allow-lists while you are learning. Our MCP server accepts traffic from the Anthropic IP range and our office network. That single control removes most of the internet from your attack surface.
ultrathink so Claude reasons the approach through before it writes anything; after every AI-written change, run /code-review and /security-review. The full set of controls is in section 17.5. The end state: what a finished build looks like
Before the how, the where. Every engagement, ours or a client's, converges on the same shape.
The build
- Data mapped. Every system reconciled into one source of truth (section 7).
- Ops and reporting portal. The business on one screen, Entra sign-in, live data (section 8).
- MCP server. Your tools plus AI search over the data, behind RBAC (sections 9 and 10).
- AI agent. The work automated on a schedule, human-approved for anything irreversible (section 11).
All of it deployed on infrastructure Claude stands up: Entra sign-in, secrets in Key Vault, no manual wiring (section 12).
Every month after
A build is not a one-off. Three lines recur, and together they are the moat that makes you very hard to displace:
- Hosting and infrastructure. The app service, database and vault the build runs on.
- Portal and MCP maintenance. Keeping the tools, syncs and reports current as systems change.
- Claude Teams seats. A brand new seat count you resell, deal-registered through the partner program.
6. Build components: architecture, prompt, and what we learned
The quick-reference version of the build. For each major component: the best-practice shape and its elements, a prompt to start it, the tips we earned building ours, and where it maps to Anthropic's own patterns. Treat the architecture as the shape to aim for, not a stack you must copy. The sections that follow go deeper on the load-bearing ones.
Every prompt below assumes Claude Code with your CLIs (az, aws, gh) and your secrets already in a vault. Adapt the bracketed bits to your stack.
The company graph (data mapping)
One object per customer, mapping every system's ID into a single queryable API.
Architecture
The pattern is one consolidated record per customer, keyed on a single primary identifier chosen deliberately. Your PSA company id is usually the strongest candidate, since most tools were provisioned against it, but not every system carries it, so plan a normalisation and matching step for the ones that do not. A scheduled pipeline pulls from each system you run (PSA, identity/M365, RMM, remote access, EDR, mail filtering, security training, network, distributors) and writes each system's native id onto that record, so one lookup resolves which services a customer has and returns every id needed for follow-up calls. Expose it as a small, strictly read-only API: field filtering, a universal search, reverse-lookup from any service id back to its customer or device, grouped stats, and a self-describing metadata endpoint so an agent can discover the schema in a single call. A reconciliation endpoint that compares active agreements against the integrations actually present surfaces revenue leakage. Storage can be as simple as a single-file database, kept read-only behind a separate authenticated sync path; the value is the mapping, not the engine.
Tips from our builds
- Choose your primary identifier deliberately: your PSA company id is usually the best join key because most systems were provisioned against it, but some will not carry it, so add a normalisation-and-matching step for the stragglers rather than assuming one universal column.
- Store the native ID from every system in the customer row (RMM, EDR, remote access, mail filter, training, network, distributor), so one lookup tells an agent which services a customer has and hands back every ID for follow-up tool calls.
- Ship a self-describing meta endpoint generated from the same structures the API validates against, so it never goes stale and an agent can bootstrap the whole schema in one call.
- Add reverse-lookup from any service ID back to the parent customer or device: alerts arrive carrying a vendor's own ID, and this turns a raw alert into full context in one hop.
- Return errors that teach: an unknown filter column should 400 with the list of valid columns, and a missing entity should include closest-match suggestions, so agents self-correct in one retry.
- Give big records a summary view and selective includes so a detail call returns a few KB of IDs instead of hundreds of inlined rows.
- Expose freshness per entity (row count, last sync, age, a stale flag) so consumers know when not to trust the data for time-sensitive work.
- Keep the API strictly read-only with a separate keyed sync endpoint for pipeline pushes, so a read-only SQL route can never mutate data.
Where we tripped
- A custom deploy command replaced the platform's default build, so the native SQLite module's dependencies never landed and the container crash-looped on boot. Delete the custom command and let the platform build run; verify with a health check that returns row counts.
- Silently dropping unrecognized filter clauses returned unfiltered data and gave false confidence in results. Switch to strict 400s that list valid columns, and make lenient dropping an explicit opt-in flag.
- An all-null response is ambiguous: it can mean 'nothing needed' or 'nobody wrote it down yet.' Add an explicit no-content status so agents do not treat missing data as a clean bill of health.
- Company identifiers drift and get truncated between systems (PSA caps identifier length), so naive exact-name matching leaves records orphaned. Normalise and match on the truncated PSA identifier, and treat unmatched service IDs as a reconciliation finding, not a silent drop.
- Default detail responses inlined hundreds of rows and blew the token budget on large customers. Add summary and selective-include modes before agents start walking the whole tenant.
The Anthropic pattern: This is retrieval grounding for tool use: instead of letting the model guess which service a customer uses, one graph lookup returns authoritative cross-service IDs that ground every subsequent MCP tool call, and the self-describing meta plus teaching errors let the agent discover schema and self-correct, mirroring Anthropic's guidance to give tools clear, discoverable contracts and ground actions in verified data rather than model memory.
The ops + reporting portal (business-on-one-screen)
Live-data portal: Entra sign-in, read-only sync, reporting and ops on one screen
Architecture
The shape is one deployable per portal: a single-page app plus a thin backend-for-frontend (BFF) that owns authentication. The BFF holds OAuth tokens server-side and hands the browser only a session cookie; the UI calls your own API, never a vendor's directly, which shrinks the trust surface. Guard every route behind auth, and persist sessions in a shared store rather than in memory so logins survive restarts and scale-out. Data reaches the portal through a one-way, read-only sync that mirrors each source system into local tables keyed by the source record id, giving a safe rollback point and a clean path to cut over to source-of-truth later. Reuse a shared component kit and a design-token theme so each new portal is a brand-swap, not a rewrite, and one upgrade lifts them all. Let the coding agent provision the whole stack from an infrastructure template (compute, database, secret vault, workload identity, DNS, TLS) so there is no portal wiring left to do by hand.
Tips from our builds
- Package the shell once: a private component kit plus a design-tokens theme means every new client portal is brand-swap-only, no copy-pasted CSS, and one upgrade lifts every portal.
- Keep OAuth tokens server-side in the BFF and hand the browser only a session cookie; the frontend calls your own /api, never the vendor API, which shrinks the client's trust surface.
- Persist sessions in Postgres (connect-pg-simple), not the default in-memory store, or logins silently drop on cold starts, restarts and scale-out and users see mid-login OAuth-state errors.
- Make sync strictly one-way and read-only into a local mirror keyed by the source record id; you get a safe rollback point and can flip to source-of-truth later by toggling one flag.
- Let sync degrade gracefully: log a missing or renamed endpoint into the run's error counts and skip it, never fail the whole job, so one broken source doesn't blank the portal.
- Pick source vendors API-first: if a system has no usable public or private API it is a black spot you cannot mirror, so treat API access as a selection criterion, not an afterthought.
- Give Claude the whole stack as Bicep (resource group, Postgres, Key Vault, managed identity) plus a deploy workflow, so provisioning is one command and there is no manual portal-wiring to forget.
- Ship an unattended read-only view (a wall display or exec screen) behind a static token outside the SSO gate, kept separate from the signed-in app so a locked-down screen never needs a Microsoft login.
Where we tripped
- Same-site cookie trips the SSO redirect: the session cookie must be SameSite=None and Secure in production to survive the cross-site return from Microsoft, but that combo is dropped over plain localhost, so relax to Lax/insecure only in dev.
- Reporting sources name the same client differently across tables (full legal name vs short name), so joins silently return zero rows; centralise a first-two-words fuzzy-match helper instead of duplicating the fallback in every query.
- Recharts 3.x has an animation regression on React 18 that renders line charts as disjoint segments on sparse data; standardise portals on React 19 to avoid chasing phantom chart bugs.
- Endpoint-drift on reverse-engineered private APIs breaks sync quietly; verify each endpoint live and store the confirmed request shapes, because a section rendering zero looks like no data rather than a broken pull.
The Anthropic pattern: This mirrors Anthropic's guidance to put a deterministic, auditable layer between the model and the business: the BFF is a thin trusted boundary that owns auth and RBAC, secrets live in a vault behind a managed identity, and data reaches the portal through a scheduled read-only pipeline rather than live model-driven writes, echoing the deterministic-first, least-privilege, tools-behind-a-gateway pattern GCIT uses across its MCP and agent estate.
The MCP server (tools, AI search, RBAC)
One remote MCP server exposing your whole toolstack to AI, safely.
Architecture
A single server wraps each of your systems as a small set of tools, registers them into one catalogue, and exposes them to any AI client over the open MCP protocol. Start it local: run over stdio in Claude Code or the desktop app on your own machine while you build the first few tools, then promote it to a remote host with authentication and network controls once it proves useful, do not stand up an internet-facing server on day one. Authenticate through your identity provider and validate tokens properly. Drive read/write/destructive classification from one central place so the tool annotations, the read-only gate for low-privilege roles, and the audit action type can never drift apart, and fail closed: an unrecognised tool is treated as write-capable. Enforce RBAC with a few roles plus per-user deny lists, put destructive actions behind a two-phase confirm, and require a written reason on the highest-risk ones so intent lands in the audit log. Manage all of this from a small admin portal rather than config files: a lightweight single-page app over an admin API where you add each technician, assign a role, tick the services they can use, set per-user tool deny-lists, toggle access on or off, register their own or delegated (GDAP) credentials, and browse the audit log, so RBAC is a screen your team manages, not a file someone hand-edits. As the catalogue grows past a browser client's tool-list limit, serve a curated, usage-ranked surface plus a search-and-invoke gateway that re-runs the same RBAC, validation and audit, so every tool stays reachable without flooding the model's context. AI search over your knowledge base is just another tool on this server.
Tips from our builds
- Make one classifier the single source of truth for annotations, the RBAC read-only gate, and the audit action type, so labels can never drift apart across those three consumers.
- Fail closed: if a tool name does not match a known read verb, treat it as write-capable so a new tool is never accidentally exposed to your viewer role.
- Match verbs on exact underscore-separated tokens, not substrings, or get_settings gets misread as a set and list_application_denies as a deny.
- Keep an explicit override table for tools the verb rules misjudge: arbitrary-code runners (remote PowerShell, cmdlet, script runners), financial orders, and machine isolation all deserve a hand-written classification.
- Curate your chat surface from real audit-log usage counts, not opinion; ranking by call volume let a small first-class set cover the vast majority of actual calls.
- Reach the long tail with three meta-tools (find, schema, invoke) that re-run the exact same RBAC, validation and audit as native calls, so nothing is lost by not listing a tool.
- Use a stateless HMAC confirm token bound to session, tool and a hash of the exact params for two-phase destructive confirm, so you store nothing server-side and params cannot be swapped between propose and execute.
- Require a mandatory reason parameter on your highest-risk tools and write it straight into the audit log, turning intent into a searchable record.
Where we tripped
- An early auth path decoded JWTs without verifying the signature and handed back a fully-privileged session; always verify signatures and test by sending a forged token expecting a 401, not just a valid one expecting 200.
- The browser connector silently caps tool lists at 256 and ignores pagination, so a raw 350-tool registry appears truncated; solve it with a curated surface plus search-and-invoke meta-tools rather than assuming pagination works.
The Anthropic pattern: This is Anthropic's tool-use guidance at MSP scale: progressive disclosure (a curated surface plus search-and-invoke keeps the model's context small while ~350 tools stay reachable), and layered guardrails (least-privilege RBAC, a fail-closed read/write classifier, human-in-the-loop two-phase confirm on destructive actions, and full auditing) so the agent gets breadth without unchecked authority.
Ticket-history search (for investigations and reporting)
Index solved tickets so AI investigations and account reporting can search them.
Architecture
Your ticket system holds years of resolved work behind search that cannot find it, so make the corpus retrievable. A scheduled sync pulls resolved tickets that carry real logged hours (filtering out auto-closed alert noise), summarises each with a cheap model into a fixed schema (cause, resolution, tags, product, customer), and writes the summaries to a searchable index keyed back to the source ticket. Expose search as one tool with two audiences in mind: a technician's AI investigation asking how a problem was fixed for this customer before, and an account manager running customer-history, recurring-issue and deep-research queries across time for reports. Keep it cheap with a per-ticket content hash and watermark so re-runs only process new tickets, batch the summarise calls for the async discount, and cache the fixed instruction prefix. Treat the index as a snapshot: live-state questions (open queues, current counts) go to a tool call, not the corpus, and treat retrieved ticket text as untrusted input, not instructions.
Tips from our builds
- Index only tickets with real logged hours: that filter alone strips monitoring and auto-close noise so the index is solved-problem knowledge, not alert spam.
- Delegate only the mechanical per-ticket summarise-to-schema step to the cheapest model; that is where cost lives at fleet scale.
- Force a strict output schema (cause, resolution, tags, product, customer) so every summary is a valid, diffable record you can index.
- Return a token-efficient summary card by default and full detail only on request, so an investigation pays for bodies only when it drills in.
- Serve two audiences from one index: technicians investigating a live ticket, and account managers running history, recurring-issue and deep-research queries for customer reports.
- Track a per-ticket content hash and watermark so a re-run only processes new tickets, not the whole corpus.
- Batch the summarise calls for the async discount and cache the fixed schema-and-instruction prefix.
- Keep it a snapshot: route open-queue and current-count questions to a live tool call, never to the index.
Where we tripped
- Treating retrieved ticket text as trusted. Ticket notes and emails are external content that can carry prompt-injection; wrap retrieved material in trust-boundary tags and never let it silently redirect the agent.
- Re-scanning the whole PSA every run and paying to re-summarise unchanged tickets. Without per-ticket hashes and watermarks the pipeline cost scales with the corpus instead of with the delta.
The Anthropic pattern: Textbook RAG-done-right: index a stable corpus (solved tickets) and retrieve relevant chunks as context for investigations and reports, while routing live-state queries to a tool call because the index is only a snapshot. It also applies the training's warning to distrust retrieved content as an injection vector, and uses model tiering, prompt caching and the Batch API as the prescribed cost levers.
Self-maintaining customer knowledge base
Mine the same tickets into living per-customer profiles and gotchas.
Architecture
The same ticket corpus is raw material for a knowledge base that maintains itself. A pipeline groups the evidence per customer and generates a living profile: their environment, recurring issues, how the account likes things handled, and a gotchas section detailing the quirks, fragile integrations and always-do-this-first rules a new technician would otherwise trip over. Freshness is two-tier: recompute volatile facts (device counts, deployment tables) deterministically with no model call, and only re-summarise a customer whose underlying evidence changed, tracked with a per-customer content hash so an unchanged customer costs nothing. New tickets, devices and notes feed back in, so the profile rewrites itself rather than drifting stale. Publish the profiles where technicians and agents can read them, as KB pages or behind a search tool, and snapshot the curated result, because once a human edits a profile it is no longer reproducible from the pipeline alone.
Tips from our builds
- A dedicated gotchas section, the quirks and always-do-this-first rules, is the highest-value output; it is the tribal knowledge that usually lives only in a senior tech's head.
- Split freshness into two tiers: recompute counts and tables deterministically with no model call, and only re-summarise a customer whose evidence changed.
- Track a per-customer content hash so an unchanged customer triggers zero model calls and near-zero writes; skipping is the whole cost story.
- Hold volatile facts as values rendered at read time, never a number written into prose, or the profile goes stale the moment a device count changes.
- Let new tickets, devices and notes feed back in on a schedule so the profile maintains itself instead of becoming another doc nobody updates.
- Have a human review the gotchas before they are trusted, since a wrong always-do-this-first rule is worse than none.
- Snapshot the curated KB regularly; once humans edit the profiles they are no longer reproducible from the pipeline alone.
Where we tripped
- Hardcoding a volatile count into a profile: the moment the model writes a device or seat number it goes stale. Hold volatile facts as values recomputed at read time and fail visibly on a missing one rather than blanking it.
- Trusting an auto-generated profile as authoritative without review. The gotchas especially need a human pass, because a confidently wrong quirk will mislead every tech and agent that reads it.
The Anthropic pattern: This pairs generative summarisation with retrieval and disciplined cost control: the cheap model does the mechanical per-customer summarise, prompt caching and the Batch API keep it affordable, and a content-hash freshness gate means work scales with change, not corpus size, exactly the tiering, caching and batching levers the training modules prescribe.
The AI agent / coworker
A ReAct agent that lives in Teams and works your service desk.
Architecture
An agent is a loop: a trigger spawns an isolated run that reasons, calls a tool, observes the result, and repeats until it delivers or hits a hard cap on turns, wall-clock time and dollars. Split the work by trust level rather than building one all-powerful loop: a cheap, near-deterministic pass on the untrusted front door (never a tool-calling model reading inbound content directly), read-only loops for investigation and planning, and a human-approved mode for anything irreversible. Give each trust level its own tool registry so a read-only stage literally has no write tool to reach for. Tier models by stage, cheap for classification, mid for reasoning, top only as an on-demand second-opinion advisor, and measure quality per stage rather than optimising the whole system for cost. Enforce authorisation in code, not the prompt, with identity assurance (a verified channel), not just role, setting the privilege ceiling. Wrap all external content in trust boundaries and screen for injection before the model sees it, and instrument cost on every reply.
Tips from our builds
- Start with one read-only loop and a send tool that stops it; deterministic stop-on-delivery beats letting the loop run to the turn cap every time.
- Tier models by stage, not globally: cheap models for triage and structured extraction, a mid model for reasoning and customer chat, and a top model only as an on-demand second-opinion advisor.
- We moved the customer-facing default up a tier after the cheap model under-served real conversations; measure quality per stage rather than optimising the whole system for cost.
- Enforce authorisation in tool-handler code, not in the prompt: the model cannot be trusted to police its own permissions, so check the verified sender and role before the tool runs.
- Make identity assurance, not just role, set the privilege ceiling; spoofable channels like inbound email or SMS must never be a path to write actions even if the message claims to be from an admin.
- Give each trust level its own tool registry: a read-only planner literally has no write tools to call, so a jailbreak has nothing to reach for.
- Instrument cost from day one: a per-thread dollar cap, cache-aware accounting, and a cost footer on every reply stop a runaway loop from becoming a five-figure surprise.
- Wrap all external content in trust-boundary tags and run a fast regex injection screen before the model call; treat ticket notes and email bodies as hostile input, not instructions.
Where we tripped
- The send-and-ask bug: an agent that both performs an action and asks permission for it. We fixed it by making the draft/approve path the only code route to the customer, so compose turns are parked as review-only drafts.
- Letting the privileged-tool gate fail open. If the authorisation computation errors mid-deploy, denying everything is safe; silently permitting the full write set is a disaster, so we hard-coded a fail-closed floor.
- Routing every decision to a human floods the approval queue until reviewers rubber-stamp. Gate only high-stakes, low-reversibility actions and sample the rest, per Anthropic's stakes-not-volume rule.
- Trusting the model's role claims in-prompt. Roles must resolve from the verified tenant identity and be checked in code, or a crafted message talks its way into write access.
The Anthropic pattern: This maps directly to Anthropic's agent patterns: routing and model tiering per stage, an orchestrator spawning isolated read-only sub-loops for investigation and planning, an evaluator-optimizer feedback loop where human rejections become triage rules, and layered guardrails placed as checkpoint gates before irreversible actions with a fail-closed posture, exactly the stakes-and-reversibility review routing the training modules prescribe.
Secure development + infrastructure hosting
Let Claude deploy the infra, then prove it's safe every build.
Architecture
Let the coding agent stand up and run the infrastructure through your cloud CLIs, then hold it to a guardrail stack. Secrets live in a managed vault read through a workload identity, so nothing but the vault reference sits on disk and disabling a person revokes access quickly. Deploy blue-green (two slots behind a switch) for instant rollback, and gate every merge on lint and tests in CI so no agent-authored change ships unreviewed. Restrict inbound to known networks. Make authorisation code-level and fail closed everywhere: an unknown tool is write-capable, and a broken permission check denies the privileged set rather than silently allowing it. Log every action with the human who triggered it, but never let an audit failure block work. For anything internet-facing, add prompt-injection evaluation to the test suite, and route regulated inference through an in-region provider to respect data residency. The posture in one line: anything an agent can do for you it can do to you, so verify the running code is the new code, not just that the process is up.
Tips from our builds
- Verify the deploy loaded new code, not just that the process is up: a healthy endpoint can still be running the old bundle, so call a cheap tool and confirm your change is present before declaring success.
- Read secrets from a managed vault via a system-assigned managed identity so no keys live in config; ship only the vault URL and tenant ID and cache secrets briefly so disabling a person revokes access within minutes.
- Blue-green with two runtime slots and a proxy switch gives instant rollback and lets old customer conversations drain while only the active slot runs background jobs.
- Gate every merge on a linter and test suite in CI so no agent-authored change reaches production unreviewed, even when agents wrote the change.
- Make authorization code-level, not prompt-level: the model must not be able to talk its way past a role check, and identity assurance (a verified channel) not just role should set the privilege ceiling.
- Fail closed everywhere: an unknown tool is treated as write-capable, and a broken permission computation denies the known-privileged set rather than silently allowing everything.
- Log every tool call fire-and-forget with the human who triggered it, source, sanitised params and result, but never let an audit failure block execution.
- Keep destructive actions behind a two-phase confirm and require a written reason on the highest-risk tools so the justification lands in the audit trail.
Where we tripped
- An auth fallback that decoded JWTs without signature verification minted fully-privileged sessions from forged tokens; they closed it and proved the fix by sending a forged token and getting a 401. Stage security changes log-only first to confirm the fallback never fires for real traffic, then enforce.
- Leaked credentials in git history (a storage key, a function key) had to be rotated: keep secrets out of the repo from day one, not just out of the running config.
The Anthropic pattern: This is Anthropic's governance triad made concrete: guardrails (code-level RBAC, fail-closed classification, allow-listing, vault-backed least privilege), human-in-the-loop (destructive actions and privileged writes require a named human on a verified channel to approve), and evals as a stage gate (lint/pytest block every merge, and prompt-injection eval cases guard internet-facing surfaces before they ship). It also mirrors the multi-platform data-residency pattern: routing regulated inference through Bedrock in-region so an agent's convenience default can't quietly breach a residency rule.
Skills (the way we do things)
Do a task right once, have Claude turn it into a reusable SKILL.md every tech and agent follows.
Architecture
A skill is a single file: frontmatter that states precisely when to use it, then a body written as an operating procedure rather than documentation. The body captures the correct order of operations, which tools to prefer and which to avoid and why, the guardrails, one worked example, and a running list of gotchas. Anchor any write-path skill to a read, propose, human-approve, apply, verify spine so an agent never touches a customer environment without a person in the loop. Keep skills next to the code so they version and roll back with the repository, and note that the same file can serve both your engineers in the coding tool and your production agents as shared long-term memory. Do not hand-write them: do a task correctly once and have the model turn it into the skill, then improve it after every failure. Choose a distribution rail by audience, org-wide for firm standards, a versioned group plugin for scoped rollout with rollback, project-scoped for one repo, or programmatic for agents.
Tips from our builds
- Write the frontmatter description as a trigger, not a summary: name the ticket types, systems, and situations that should pull the skill in, so Claude loads it at the right moment.
- Anchor every write-path skill to read to propose to human-approve to apply to verify, so an agent never touches customer machines or mailboxes without a person in the loop.
- Bake the correct tool choice into the skill: our RMM skill explicitly says do NOT use the list MCP tool because it truncates and ignores the tenant filter, and points to the REST route instead.
- Keep skills next to the code in .claude/skills/ so they version with the repository and roll back with a git revert, not as pasted prompts that silently drift per tech.
- Include a Landmines or Gotchas section and treat post-failure updates as the main way the skill improves, so pain is only paid once across the whole team.
- Reference the long playbook by path and keep the SKILL.md itself lean, so it loads cheaply and stays a pointer to detail rather than a wall of text.
- Choose the distribution rail by audience: org-provisioned for firm-wide standards, a plugin assigned to a group for scoped rollout with versioned updates, project skills for one repo, API/container.skills for programmatic agents.
- The same SKILL.md file can serve both Claude Code techs and your production agent as long-term memory, so one authored procedure keeps humans and bots consistent.
Where we tripped
- Treating a skill as documentation instead of an operating procedure: if it does not say which tool to use, in what order, and what to avoid, agents improvise and you get the non-determinism you were trying to remove.
- Vague frontmatter descriptions mean the skill never gets invoked when it should; be concrete about the trigger conditions or the knowledge sits unused.
- Copy-pasting the same prompt into each tech's setup instead of one versioned skill: the copies fork into slightly different behaviours with no central rollback when one misbehaves.
- Letting skills grow into giant files inflates cost and hides the key steps; keep the SKILL.md as a lean pointer and push heavy detail into referenced playbook docs.
The Anthropic pattern: Anthropic frames Skills as packaged, versioned, reusable procedures and an integration mechanism: reach for a Skill when the same procedure runs repeatedly, must be distributed across a team, and needs versioning, governance, and rollback (org-provisioned, plugin, project, or API/container.skills). This turns conventions that lived in people's heads into artifacts Claude applies consistently.
7. The company graph
The single highest-leverage build in this entire guide, and it contains no AI at all.
Your customers exist in ten systems under ten different IDs. Your AI cannot traverse that, and honestly neither can your team. The company graph is one object per customer that maps every representation they have:
{
"company": "Example Pty Ltd",
"psa_id": 1042,
"m365_tenant_id": "f1a2...",
"rmm_org_id": 88,
"mail_filter_id": "example-pty",
"sat_platform_id": 3311,
"unifi_sites": ["site_a1b2"],
"distributor_accounts": { "pax8": "c-4451" },
"agreement_ids": [204, 219]
}
- Build it as a nightly pipeline on a server you already own. Scheduled tasks or cron, secrets from the vault, one sync module per tool. Ask your coding harness to build each sync from the vendor's API docs.
- Expose it as a small internal API. It now powers three things at once: reporting across your whole stack, reconciliation, and the context layer for every MCP tool and agent you build next.
- Run the reconciliation early: agreements versus deployments versus billing. Every MSP we have done this with, ourselves included, found revenue leakage. The data project is a revenue project, it funds itself.
get_actionable_tickets. Your boards, your forward-movable statuses, compact output. It turns "what should I work on" into a one-line question from your phone.8. The MCP server playbook
How ours grew from 36 tools on a laptop to roughly 350 tools across 23 services in production, and the controls that made that safe.
The growth path
- Local first. A stdio MCP server on your machine, used through Claude Code or Claude Desktop. Start with 10 to 15 tools off your PSA, built from real tickets: what would have helped close the last twenty?
- Team second. Move it to a small app service behind your identity provider (Entra OAuth). Per-technician sessions with scoped credentials. Add the admin panel early: technicians, roles, allowed services, denied tools. Ask the harness to build the panel, it is a solved problem.
- Scale third. More services, more tools, driven by demand. One server can serve many clients at once: the coding harness, the browser, your agents, even Copilot Studio.
The six controls that matter all running in our production server
- Read/write demarcation in code. A single classifier decides whether every tool is read-only or write-capable, and it fails closed: unknown shapes are treated as write-capable. Viewer-role users get reads only. Investigation registries are read-only by construction.
- RBAC with three roles. Viewer (read), operator (read, create, update), admin (adds delete), plus per-technician denied tools and allowed services. Enforcement is in the tool handler, so the model cannot talk its way past it.
- Two-phase confirm on destructive tools. First call returns a proposal. Executing requires a second call carrying a short-lived signed token bound to the exact parameters. High-risk tools also demand a written reason that lands in the audit log.
- Audit everything. Every call logged with technician, tool, action type, sanitised parameters, source IP and geolocation, duration and result. Admin actions on the portal are audited the same way. The audit log is also your adoption dataset.
- Secrets stay in the vault. Config holds a vault URL and a tenant ID, never a credential. Per-technician secrets use a naming convention so access is legible. Disabling a technician cuts new requests immediately.
- Allow-listing. Anthropic IP range plus office network while you grow. Widen deliberately, never by default.
Token efficiency (this is your cost and accuracy control)
- Compact projections on every list tool. One of ours went from 1.35MB of raw vendor response to 1.6KB of useful fields. Return what the model needs, with a hasMore flag, never the raw dump.
- Progressive disclosure beats a giant tool list. Browser connectors cap tool lists (256 in our testing) and huge lists waste context anyway. We serve a curated surface of our most-used tools, ranked from real audit data (our top 92 tools cover 92% of 68,768 logged calls), plus a search-and-invoke gateway that keeps every tail tool reachable with identical RBAC and audit.
- Prompt caching: cached reads cost around a tenth of fresh input tokens. Keep the system prompt and tool definitions stable, keep timestamps and dynamic content out of the cached blocks, and re-evaluate your caching strategy whenever you touch the prompt.
- Descriptions are load-bearing. The model chooses tools by their descriptions, so write them for the use case, and iterate them when you watch it pick wrong.
9. Customer tenants: the GDAP architecture
The part most MSPs get wrong first. The goal: every AI-driven action in a customer tenant is bounded by the same GDAP permissions Microsoft already enforces on your humans, and attributed to a named human.
- Your MCP admin panel gets a "connect your account" flow. Each technician signs in with their own partner credentials and consents (Partner Center delegated scopes with offline access).
- The technician's refresh token is written to your Key Vault under a per-technician secret name. Nobody ever sees or handles the token.
- The MCP server reads the vault with its managed identity at call time, refreshes, and acts as that technician against the customer tenant. Rotated refresh tokens are written back automatically.
- Every tool takes a tenant ID explicitly (
get_mailboxfor THIS tenant), and every call is authorised twice: your MCP's RBAC for that user, then Microsoft's GDAP role restrictions. Two fences, independently owned. - Attribution is dual: the Microsoft side logs the delegated admin identity, your audit log records which human asked, from where, for what.
- Open-ended tools (run an Exchange cmdlet, run a Graph request) are classified destructive-capable and sit behind your strictest gates: operator role or above, two-phase confirm, mandatory reason.
- The on-behalf-of token flow is a valid alternative if your technicians authenticate to the MCP as their admin identity. Talk it through with your compliance people and pick one model deliberately.
- For app-only patterns, provision your multi-tenant app into customer tenants through the Partner Center API and scope its permissions tightly.
10. Give the agent your memory
Your PSA holds years of solved problems. The built-in search cannot find them.
- Pull the last 12 months of tickets that have real time entries on them. Exclude the auto-closed alert noise. You want tickets where a technician actually thought.
- One-shot each ticket through a small model: cause, resolution, tags, customer. A Haiku-class model does this well for fractions of a cent per ticket.
- Sync the summaries into something with an embedded index: SharePoint pages if you want browsable, or Azure AI Foundry (or equivalent) if you want a pure search index.
- Expose one MCP tool: search past tickets by customer or by issue. Wire it into the investigation stage of everything.
The payoff: investigations start from "here is how we fixed this for this customer in March" instead of from zero. It also encodes the way each customer likes things done, which no base model can know.
11. Skills: the way we do things
Base models decide how to work unless you tell them. Skills are your operations manual, written by doing.
- Pick one process: how a ticket should be investigated, how customer comms are formatted, how time entries are written.
- Do one ticket the correct way with the harness, correcting it as you go. This is the teaching pass.
- Then: "Turn what we just did into a skill file." The harness writes the skill (a markdown file with structured guidance). You edit it once for taste.
- Share it to the team's environment. Now that is the way everybody does tickets, and the way every agent does them too. Update the skill whenever the process changes, especially after failures.
Measure adoption. The audit log tells you who is working through the tooling and who is working around it. Put it on a leaderboard, pair the laggards with the leaders, and be honest with yourself: the productivity gap between the two groups widens every month, and it is now a real business cost.
12. Endpoint execution guardrails
Running AI-written PowerShell on customer endpoints through your RMM is the sharpest tool in this guide. Handle accordingly.
- Vet before run. AI-generated scripts get reviewed (by a second model pass and by a human for anything write-capable) before they touch an endpoint. No exceptions while you are building trust in the pipeline.
- Prefer diagnostics first. Read-only diagnostic scripts (disk usage, reliability history, versions, uptime) are low risk and high value: they turn every ticket into a pre-investigated ticket. Start there and stay there for a while.
- Constrain the language. Consider PowerShell constrained language mode on endpoints, limit which tools can execute scripts, and scope which device groups an agent may target.
- Log it like production code. Every script run: who asked, what ran, where, and the output. Your RMM (ImmyBot and friends) already gives you the execution layer, your job is the approval layer in front of it.
13. Agent security architecture
The architecture that lets you move fast: deterministic guardrails around a non-deterministic core.
Rule one: the front door is hostile
Your ticket inbox is an external, unfiltered, insecure entry point, and anything that reads it is exposed to prompt injection. So never put a reasoning agent with tool access on the front door. Our triage stage is deliberately cheap and boring: deterministic rules plus a no-tools small-model call that classifies the ticket and screens it for injection attempts (instructions addressed to an agent, impersonation, requests for system information). Suspicious content gets flagged and wrapped, and a human sees it.
Two side benefits. Injection screening at the door also protects everything downstream. And a cheap front door means nobody can spam your inbox to run up your inference bill.
Rule two: trust boundaries on all external content
Every piece of external content entering a prompt (ticket text, email bodies, API responses, knowledge base retrievals) is wrapped in labelled boundary tags with a trust level. The system prompt tells the agent that content inside those tags is data, never instructions. Retrieval is external input. Treat RAG like the inbox.
Rule three: privilege is a ladder, and identity sets the ceiling
- Deterministic rules handle what rules can handle.
- A cheap model classifies. No tools.
- Investigation runs on read-only registries, GET-only where the API allows. Useful work with no blast radius.
- Write actions require a proposed plan and a human approval, delivered as a card in Teams with approve, revise and reject buttons. Rejections carry free-text feedback, and that feedback is mined into rules. The learning corpus is your dispatchers disagreeing with the machine.
- The privileged write mode is restricted to a small set of named senior staff, and only on identity-verified channels. Email and SMS can never elevate because senders are spoofable. Identity assurance, not just role, sets the privilege ceiling.
- The privilege gate fails closed: if the permission computation breaks, the known-privileged tools are denied rather than silently allowed.
Rule four: the human finishes the job
Our coworker does the work, notes the ticket, and notifies the assigned technician. The technician does the final close and the customer conversation (user offboards are the scoped exception). This is a deliberate control and a team-trust decision, and we recommend starting the same way.
Rule five: measure everything
Every agent reply carries a cost footer (model, turns, tokens, dollars). Every tool call is audited. Dashboards show usage, ROI and adoption. If you cannot see what it costs and what it did, you do not have an agent, you have a liability.
/security-review after every AI build and /code-review on the diff, and ultrathink the threat model before anything goes internet-facing. Anything an agent can do for you it can do to you, so let a second pass, human or model, check the first.14. The forward deployed engineering playbook
Everything above is a process you ran on your own business. FDE is walking the same process into your customers' businesses, as a recurring engagement.
Why this model
- The fixed-scope project model assumed code was the slow part. It is not anymore. What is slow is understanding the business and getting permission to implement. Both are solved by being embedded, on-site, with the people who do the work.
- Lineage, as category proof: Palantir pioneered forward deployment in 2005, and OpenAI and Anthropic industrialised it inside their largest customers. industry reference The defining frame (Bob McGrew, formerly OpenAI): a traditional engineer builds one capability for many customers, a forward deployed engineer builds many capabilities for one customer.
- Your unfair advantage as the incumbent MSP: the hard part of FDE elsewhere is trust, access and data permissions. For your existing managed clients, you start from inside.
The funnel the shape we run and recommend, adapt the numbers to your market
- Watch the buying signals you already capture. AI keywords in tickets and call transcripts, a request to authorise an AI connector, someone installing Claude Code or ChatGPT in their tenant. Score them, and have the account manager open the conversation.
- AI discovery workshop, around $700. Structured conversation, recorded and transcribed (with consent). Never free: paid discovery filters for intent and pays for the next step. If they go ahead, credit it forward.
- Feasibility report. Feed the workshop transcript plus every relevant vendor's API documentation to your harness. Output: what they asked for, whether their systems can support it, what to build first, and the one metric per candidate that defines done. Deliver inside a week.
- Build day, around $5,000, two technicians on-site. Do the access pre-work beforehand (see the checklist below), then stand up their data foundation and something live the same day: their real records flowing into a live report they can click. The build day should feel like magic, and it always starts with the data.
- They choose the path. A fixed-price scoped project (price it near the cost of a quarter, lock the scope hard) for organisations that need budget certainty. Or the FDE engagement: $5k to $10k a month, first commitment one quarter, renewing to 6, 12 or 36 months as trust compounds.
Inside the engagement
- Visits, not days. 2 to 4 on-site visits a month. Frame it as visits for flexibility: when you are blocked on access, do a half day of interviews and return.
- Pair senior with junior. The senior speaks business and translates problems into architecture. The junior builds. The junior attends more days than the senior. This is also how you grow your next FDE.
- Interview the whole business. Ops, HR, finance, sales. Record and transcribe every conversation (consent first). The transcripts become the roadmap, generated rather than maintained, and surfaced to the client in their portal so the next quarter sells itself.
- Bill outcomes per quarter, not hours per month. "By the end of this quarter you have these outcomes" survives the awkward week where everything shipped early. Finish early, keep going deeper into the business. That is the point of the model.
- Define done before building. Every initiative gets an intent and a metric first ("the team spends 2 hours a day on this, the outcome is 10 minutes of verification"). No metric, no project.
After the engagement: the wrapper
No engagement may end in unsupported production code. Everything you build carries a small monthly run component: hosting for their portal and MCP tooling, break-fix support, a capped AI usage credit (explain that you tune their agents to be as deterministic and cached as possible because inefficiency eats your margin, which aligns incentives nicely), a continuous test suite on anything external-facing, injection evaluation where outside input reaches an agent, and periodic penetration testing. Add their Claude team subscriptions, deal-registered through the partner program, and the recurring stack compounds. A customer whose operations you built and run does not churn.
Lessons from our first year all real, all earned
- Secure API access before day one. One of our proof-of-concept builds ran entirely on synthetic data because vendor credentials never arrived during the engagement. The pre-flight checklist below is now a hard gate.
- Two delivery people minimum on every on-site day, and never let the client's team walk away without something tangible deployed, even on mock data.
- Silent failure is the dominant failure mode. Watchdogs and reconcile checks ship with the first write path, and health checks must prove outcomes.
- Time-box the after-care window. One early fixed-fee build absorbed ten times its budgeted hours because care never formally ended. Hypercare is two weeks, in the price, then the wrapper takes over.
- Anchor scoping on headaches and outcomes, never on "what should the portal look like".
- And the honest one: our technical model is proven in production, and the commercial funnel is young. We are sharing the shape while we pressure-test it, and we would rather this community builds it with us than buys it back from venture-funded competitors in three years. context US venture money is already flowing into AI-enabled MSP services, treat that as directional, unverified detail.
The pre-engagement access checklist (copy this)
- Written approval to access the named systems and data, signed by the owner.
- Confirmed list of the data you will touch on day one.
- API credentials issued, tested from your side, before the day. Vendor-gated APIs (integrator onboarding queues) requested weeks ahead: vendors are the number one schedule killer.
- A VM or workspace provisioned inside the client's environment where the data lives and stays.
- One fixed egress machine for the engagement, known to their IT policy.
- Recording consent for interviews, in writing.
15. Running the structured meetings
The engagement is a sequence of meetings with software in between. Run them with the same discipline as the code.
The universal rules
- Record and transcribe everything (with consent). The transcript is a deliverable: it becomes the feasibility input, the roadmap, and the next quarter's pitch. Do not trust memory, and do not maintain documents a pipeline can generate.
- Every meeting ends with three things: something tangible the client can see, one hard number, and a clear next step with its price. No meeting ends in a concept.
- A preference voiced in a meeting is a hypothesis, never a decision. Decisions get an owner, get verified, and get written down. This one rule prevents most scope drift.
The discovery workshop (60-90 minutes, one senior + one builder)
- 10 min: what prompted this conversation. Let them talk, capture verbatim.
- 25 min: walk their top three processes with the people who run them. For each: who does it, how often, how long, what systems, what breaks. You are hunting repetitive, rule-describable, high-volume work.
- 15 min: systems and data reality check. What has APIs, what is a spreadsheet, who owns access.
- 10 min: paint the end state in their language (their data in one place, drudgery handled, their team supervising instead of typing) and name what happens next: feasibility report inside a week, then the build day.
- Close on the metric: "If we fixed only one thing in ninety days, which number should move?"
The build day (two technicians, on-site)
- Before 9am: access checklist re-verified. If anything is broken, the senior starts interviews while the builder fixes access.
- Morning: stand up the data foundation. Their core systems syncing into one place, IDs mapped (their company graph, in miniature).
- Early afternoon: something visible on their real data. A live report, a working lookup, the first automation in dry-run mode.
- Late afternoon: demo to the sponsor and whoever they invite. Take the guesses and reactions down, they are your roadmap.
- Close: the three-things rule. The live artifact, one number (records synced, hours identified, leakage found), and the two paths forward with prices.
The stakeholder interviews (during the engagement, 30-45 minutes each)
One per function per sprint: ops, HR, finance, sales. Ask each the same five questions and transcribe:
- Walk me through yesterday. Where did the time go?
- What do you do every week that a well-trained new hire could do with a checklist?
- What information do you wait on, and who are you waiting for?
- What gets typed twice into two systems?
- If one report appeared on your desk every Monday, what would it show?
The quarterly review (45 minutes, senior + sponsor)
- Metrics against the intents set last quarter. Measured, not narrated.
- What shipped, what is in hypercare, what the wrapper now covers.
- The roadmap, regenerated from this quarter's transcripts, with the next quarter's outcomes and price.
- The renewal question asked plainly. If the metrics moved, this meeting is short.
Your internal weekly sitting (60-90 minutes, delivery + commercial)
Run your own practice with the same structure: a compiled agenda, 15 minutes of do-it-in-the-room unblocks (close the project, raise the invoice), then decisions ratified with named owners, then the backlog walked with assignments only (assign, never solve in the meeting). Every delivered project owes a lessons-learned entry to a shared register. This meeting is where the practice compounds.
16. The prompt library
Copy, paste, adjust names. These assume Claude Code (or any coding harness) with access to your terminal and the relevant credentials in a vault.
17. Getting more out of Claude Code: the controls
The same task can be a two-minute skim or a rigorous, verified build depending on how you drive the tool. These are the phrases and commands we reach for, and when each earns its keep.
ultrathink is a built-in Claude Code phrase. The others map to modes, slash commands and plugins your Claude Code version exposes, so check what yours supports. The capability matters more than the exact word.
| Control | What it does | Reach for it when |
|---|---|---|
ultrathink | Tells Claude to spend the maximum reasoning budget before it acts. One rung of a ladder: think → think hard → think harder → ultrathink, each allocating more thinking. | The problem is gnarly and a wrong first move is expensive: architecture, tricky debugging, security reasoning, the data-mapping strategy. |
| Plan mode | Read-only planning. Claude investigates and proposes a step-by-step plan without touching anything, then waits for your approval before it executes. | Any change big or risky enough that you want to see the approach before it lands. |
ultraplan | Plan mode with maximum thinking: deep reasoning applied to the plan itself before a single change is made. | The plan is the hard part: a migration, a multi-system integration, a from-scratch architecture. |
Effort levels (low / medium / high / max) | Dials how much work Claude puts in: how many angles it weighs, how hard it verifies, how many findings it surfaces. | Match depth to stakes. Low or medium for a quick, high-confidence pass; high or max for audits, reviews and anything you cannot afford to get wrong. |
ultracode | Turns on aggressive multi-agent orchestration: Claude fans the work out to a fleet of subagents (research, build, adversarial review) and synthesises, defaulting to the most thorough correct answer. | Big, high-stakes builds and audits where you want maximum rigour and parallel coverage, and token cost is not the constraint. |
| Subagents | Independent agents working in parallel: search many areas at once, or check a finding from several perspectives. | Broad work that splits cleanly, or when you want findings independently verified rather than taken on trust. |
| Skills | Reusable procedure files (section 11) Claude loads to do a task your way every time. | Any task your team does repeatedly and wants done consistently by both people and agents. |
/code-review, /security-review | A structured review of your current changes: correctness and bugs, or a dedicated security pass, at a chosen effort level. | After every meaningful change, and especially after an agent wrote the code. |
| CLAUDE.md and memory | A project file Claude reads every session for your conventions, plus persistent memory of your preferences. | Set once, so Claude starts every session already knowing how you work. |
/code-review and /security-review after. Cheap effort for small jobs, maximum effort for anything that touches production or customer data.18. References and claims
Our numbers GCIT measured
- Service desk: 80% faster first response (5.5 hours down to 1.1 hours) and 90% faster resolution (54.4 hours down to 5.2 hours), monthly, December 2025 to May 2026, our own desk. Published at gcit.com.au.
- Triage classification: roughly $0.006 per ticket at 84.5% type accuracy, our internal evaluation of the production pipeline.
- Roughly $0.20 for an end-to-end request (triage, investigate, complete, human approving), roughly $0.06 for the investigation alone, roughly $10 USD a day for the whole coworker.
- MCP server: grew from 36 tools across 7 services (local) to roughly 350 tools across 23 services (production), 2025-2026. Tool-surface ranking derived from 68,768 audited calls, April to July 2026.
All other companies' results mentioned anywhere in this guide are industry references we have not verified, and the pricing in section 12 is the model we run and recommend, adjust for your market.
Citations for the history section
- Vaswani et al., "Attention Is All You Need", 2017.
- Washington Post and subsequent coverage of Blake Lemoine and LaMDA, June 2022.
- OpenAI, ChatGPT launch, 30 November 2022.
- Yao et al., "ReAct: Synergizing Reasoning and Acting in Language Models", October 2022.
- Anthropic, Model Context Protocol announcement, November 2024.
- Bob McGrew on forward deployed engineering, public interviews, 2024-2025.
Talk to us
GCIT, 1/16 Dover Drive, Burleigh Heads QLD 4220. 1300 369 111. gcit.com.au/contact-us. If you are an MSP working through this playbook and you get stuck, reach out. The community will get further sharing notes than competing on secrets.