<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Creating MCPs on FrenchForet</title><link>https://learn.frenchforet.com/creating-mcps/</link><description>Recent content in Creating MCPs on FrenchForet</description><generator>Hugo</generator><language>en</language><atom:link href="https://learn.frenchforet.com/creating-mcps/index.xml" rel="self" type="application/rss+xml"/><item><title>The Problem and the Thesis</title><link>https://learn.frenchforet.com/creating-mcps/00-the-problem-and-the-thesis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/00-the-problem-and-the-thesis/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; understand what this course is for, set up the estate you will work in for the rest
of it, and take a first look at that estate &lt;em&gt;as three different people&lt;/em&gt;. By the end of the unit
you will have Postgres and OpenSearch running with realistic data, and a small script that asks
the same questions as an L1 analyst, an L3 responder and an auditor and gets three different
answers. That difference is the whole course in miniature: once an agent can reach your systems,
&lt;strong&gt;who it is acting for&lt;/strong&gt; decides what it should be able to see and do.&lt;/p&gt;</description></item><item><title>The Current Protocol and a First Server</title><link>https://learn.frenchforet.com/creating-mcps/01-the-current-protocol-and-a-first-server/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/01-the-current-protocol-and-a-first-server/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build your first real MCP server, a read-only &lt;strong&gt;CMDB server&lt;/strong&gt;, with the official Python
SDK v2, on the current protocol (&lt;strong&gt;2026-07-28&lt;/strong&gt;). Along the way you&amp;rsquo;ll see exactly what changed
since the hand-rolled server of Foundations §18: no handshake, no sessions, and every request
carrying what it needs. You&amp;rsquo;ll drive the server with the SDK&amp;rsquo;s &lt;code&gt;Client&lt;/code&gt;, watch every frame go over
the wire, and give it a joinable log from its first line of code.&lt;/p&gt;</description></item><item><title>The Host Side</title><link>https://learn.frenchforet.com/creating-mcps/02-the-host-side/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/02-the-host-side/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build the other end of the protocol, a &lt;strong&gt;host&lt;/strong&gt;: the application that starts MCP
servers, hands their tools to &lt;code&gt;gpt-oss-120b&lt;/code&gt;, runs the tool calls the model asks for, and asks
the &lt;em&gt;person&lt;/em&gt; (never the model) when a server needs a decision. You&amp;rsquo;ll run two servers at once,
Unit 1&amp;rsquo;s CMDB server and a new ticketing server whose one write action asks for confirmation
with the 2026 protocol&amp;rsquo;s &lt;code&gt;input_required&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Unit 1 built a server and drove it from a script. Here a model does the
choosing. This unit builds on &lt;a href="https://learn.frenchforet.com/docs/15-the-tool-use-loop/"&gt;Foundations §15&lt;/a&gt;
 (the
tool-use loop) and &lt;a href="https://learn.frenchforet.com/docs/18-model-context-protocol/"&gt;§18&lt;/a&gt;
 (§18&amp;rsquo;s bridge did a small
version of this by hand). The host you build is also the harness the rest of the course reuses:
Unit 3 measures catalogs through it, Unit 6 A/B-tests tool descriptions through it, and Unit 11
turns it into an eval runner. It still needs no Docker: both servers run on in-memory data.&lt;/p&gt;</description></item><item><title>Catalogs and Discovery</title><link>https://learn.frenchforet.com/creating-mcps/03-catalogs-and-discovery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/03-catalogs-and-discovery/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; give a model what it needs to ask good questions of the CMDB and the SIEM, and
measure the difference. You&amp;rsquo;ll build the two common answers side by side:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;raw discovery&lt;/strong&gt;: what Postgres and OpenSearch say about themselves;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;a curated catalog&lt;/strong&gt;: what the data &lt;em&gt;means&lt;/em&gt;, how to query it, and what this caller may see.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;ll check the catalog against what the backends actually enforce, measure what each approach
costs in the model&amp;rsquo;s context, and run an eval that measures query accuracy over repeated runs.
The CMDB server also moves off the fixture and onto Postgres.&lt;/p&gt;</description></item><item><title>Searching Logs and Incidents</title><link>https://learn.frenchforet.com/creating-mcps/04-searching-logs-and-incidents/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/04-searching-logs-and-incidents/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; build the SIEM server&amp;rsquo;s real tools: incidents, aggregations and log search over
OpenSearch. Three habits run through all of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;every query has a bounded time window&lt;/strong&gt;, and the server picks only the indexes that
window touches;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;aggregate first, then drill down&lt;/strong&gt;: count &lt;em&gt;when&lt;/em&gt;, then &lt;em&gt;who&lt;/em&gt;, and only then read events;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;shape what comes back&lt;/strong&gt;: catalogued fields only, long text cut short, a page at a time,
the total always reported, and a cursor that belongs to the query that made it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then you&amp;rsquo;ll investigate the planted intrusion yourself, and let &lt;code&gt;gpt-oss-120b&lt;/code&gt; do it with the
same tools, and compare the two paths.&lt;/p&gt;</description></item><item><title>The Permission Dial: Restrictive vs Permissive Tools</title><link>https://learn.frenchforet.com/creating-mcps/05-the-permission-dial/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/05-the-permission-dial/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; give the same persona&amp;rsquo;s access to a model four ways, from &amp;ldquo;run any SQL&amp;rdquo; to &amp;ldquo;only
these questions&amp;rdquo;, and measure what each one costs and risks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;permissive&lt;/strong&gt;: &lt;code&gt;run_sql&lt;/code&gt; on the CMDB, and OpenSearch&amp;rsquo;s own MCP server (raw Query DSL and
any REST API) on the SIEM;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;guarded&lt;/strong&gt;: one SELECT, checked on its parse tree; one PPL query, bounded by
construction and checked on its compiled plan;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;restrictive&lt;/strong&gt;: task-shaped tools, with the SQL written once by a person;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hybrid&lt;/strong&gt;: restrictive, plus an escape hatch that runs a guarded query only when the
person using the host approves it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;ll fire the same risky probes at all four, see what each tool list costs on every call,
and run one task set through all four with &lt;code&gt;gpt-oss-120b&lt;/code&gt;, several times each.&lt;/p&gt;</description></item><item><title>Designing Tools for a Model Reader</title><link>https://learn.frenchforet.com/creating-mcps/06-designing-tools-for-a-model-reader/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/06-designing-tools-for-a-model-reader/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; make the restrictive tools from Units 3-5 easier for a model to use correctly,
without changing a line of what they do. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;serve the same nine tools with four different descriptions, from a few words each to a
full rewrite;&lt;/li&gt;
&lt;li&gt;measure what each tool list costs, and where the bytes go;&lt;/li&gt;
&lt;li&gt;lint the definitions against a short set of rules;&lt;/li&gt;
&lt;li&gt;grade the tools&amp;rsquo; error messages, which are instructions too;&lt;/li&gt;
&lt;li&gt;measure, with &lt;code&gt;gpt-oss-120b&lt;/code&gt;, whether the model picks the right tool with the right
arguments, and whether it recovers from a mistake when the error tells it how.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Unit 5 showed that restrictive tools have the smallest blast radius and
the largest tool list. This unit works on that list: what the model reads, what it costs and
what it buys. Unit 7 changes &lt;em&gt;who&lt;/em&gt; sees which tools; Unit 9 caches the list; Unit 11 turns
this unit&amp;rsquo;s evals into regression tests.&lt;/p&gt;</description></item><item><title>Identity, Least Privilege and Enterprise Rules</title><link>https://learn.frenchforet.com/creating-mcps/07-identity-least-privilege-and-enterprise-rules/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/07-identity-least-privilege-and-enterprise-rules/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; turn the single-persona servers of Units 3-6 into shared servers that know who
is calling and act &lt;em&gt;as&lt;/em&gt; that person all the way down. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;issue signed access tokens from a small local issuer, and verify them on every request;&lt;/li&gt;
&lt;li&gt;refuse tokens minted for another server, so no server can replay yours;&lt;/li&gt;
&lt;li&gt;give each caller their own tool list, and their own choices inside it;&lt;/li&gt;
&lt;li&gt;carry the caller&amp;rsquo;s identity to Postgres and OpenSearch through a gateway login that holds
nothing itself;&lt;/li&gt;
&lt;li&gt;add a policy layer: enterprise rules as data, evaluated on every call, every verdict
logged, approvals through elicitation;&lt;/li&gt;
&lt;li&gt;watch the same questions refused at four different layers, and take each layer away to
see what was behind it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; every server so far has acted as one persona from an environment
variable (&lt;code&gt;MCP_PERSONA&lt;/code&gt;). That&amp;rsquo;s fine on a laptop for one person. It doesn&amp;rsquo;t work for a
server the whole SOC shares. Unit 6 made the tools easy to use; this unit decides who may
use which, and what they get back. Unit 8 limits how much each caller may use; Unit 11
writes this unit&amp;rsquo;s verdicts to the audit table; enterprise track
&lt;a href="https://learn.frenchforet.com/creating-mcps/E3-full-oauth-for-remote-servers/"&gt;E3&lt;/a&gt;
 replaces the local issuer with the full OAuth flow.&lt;/p&gt;</description></item><item><title>Resource Management: Many Callers, Finite Backends</title><link>https://learn.frenchforet.com/creating-mcps/08-resource-management-many-callers-finite-backends/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/08-resource-management-many-callers-finite-backends/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; put Unit 7&amp;rsquo;s shared servers inside an operating envelope, so that many agents
calling at once can&amp;rsquo;t exhaust the backends, and one agent stuck in a loop can&amp;rsquo;t starve the
rest. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;measure first, with a load generator that runs many agents against the servers and watches
the backends while it does;&lt;/li&gt;
&lt;li&gt;replace a connection per call with bounded, shared pools;&lt;/li&gt;
&lt;li&gt;give every caller its own limits: rate, result-token quota, concurrency, and the cursors
its searches leave open;&lt;/li&gt;
&lt;li&gt;write refusals a model acts on: which limit, how long to wait, or what to ask instead;&lt;/li&gt;
&lt;li&gt;put time budgets at every layer, and restore one Unit 7 lost without anyone noticing;&lt;/li&gt;
&lt;li&gt;price queries before they run, and cap a single tool for everyone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Unit 7 made the servers shared and carried each caller&amp;rsquo;s identity to the
backends through one gateway login. That login is now the only thing Postgres and OpenSearch
see, so their own per-user limits no longer separate one agent from another. This unit
does. Unit 9 then scales the servers out; Unit 11 turns the numbers you collect here into
per-caller metrics; enterprise track E1 adds write APIs, where a retried call can do damage
twice.&lt;/p&gt;</description></item><item><title>Performance and Scale</title><link>https://learn.frenchforet.com/creating-mcps/09-performance-and-scale/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/09-performance-and-scale/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; run Unit 8&amp;rsquo;s servers as several replicas, and find out what that buys and what it
breaks. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;measure the two transports against each other, per call, at start-up and in memory;&lt;/li&gt;
&lt;li&gt;find what limits throughput before adding anything, from where the CPU goes;&lt;/li&gt;
&lt;li&gt;run three replicas on one port, and size their pools so they fit the backend&amp;rsquo;s limits;&lt;/li&gt;
&lt;li&gt;move the per-caller limits into shared state, so three replicas enforce one set;&lt;/li&gt;
&lt;li&gt;add a result cache in the one place it&amp;rsquo;s safe, and watch a cache in the wrong place leak;&lt;/li&gt;
&lt;li&gt;measure four OpenSearch choices, including one where the cluster&amp;rsquo;s own cache quietly does
nothing;&lt;/li&gt;
&lt;li&gt;package the server as an image with health checks and no secrets inside.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Unit 8 put one server per backend inside an operating envelope. Its
limits live in that one process, which its Limits note flagged. Unit 7 left a CMDB lookup on
every log question that names a host, with a note that this unit would cache it. Unit 10 then
attacks the servers you&amp;rsquo;ve scaled; Unit 11 watches them.&lt;/p&gt;</description></item><item><title>Attacking and Defending MCP</title><link>https://learn.frenchforet.com/creating-mcps/10-attacking-and-defending-mcp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/10-attacking-and-defending-mcp/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status: in progress.&lt;/strong&gt; This unit&amp;rsquo;s defences, servers and lab are complete. The negative
cases, one per OWASP category, are placeholders that the course team is writing: each is
marked &lt;em&gt;Placeholder&lt;/em&gt; below and reported as &lt;code&gt;todo&lt;/code&gt; by &lt;code&gt;examples/10/cases.py&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; know which defence answers each item of the OWASP MCP Top 10, and where in the
stack it lives. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;map the ten categories onto the gateway you&amp;rsquo;ve built since Unit 1;&lt;/li&gt;
&lt;li&gt;add the defences that belong in the &lt;strong&gt;host&lt;/strong&gt;: an allowlist with namespaced tools,
description screening with pinning, an egress rule, redaction, fencing and an audit record;&lt;/li&gt;
&lt;li&gt;add the ones that belong in the &lt;strong&gt;server&lt;/strong&gt;: least privilege, parameterised queries, no
secrets in results, and approvals for anything that changes something;&lt;/li&gt;
&lt;li&gt;see why fencing is a hint to the model and not a control;&lt;/li&gt;
&lt;li&gt;find the false positives a heuristic defence produces on your own honest tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Units 5, 7 and 8 already built several of these defences without naming
them as such: the blast radius on the permission dial, verified identity and the policy layer,
and the operating envelope. The estate has carried hostile data since Unit 0: an instruction
planted in a syslog line on &lt;code&gt;jump-prod-02&lt;/code&gt;, and another in the CMDB description of
&lt;code&gt;build-legacy-01&lt;/code&gt;. Unit 11 records and tests everything this unit decides.&lt;/p&gt;</description></item><item><title>Observability, Audit and Testing</title><link>https://learn.frenchforet.com/creating-mcps/11-observability-audit-and-testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/11-observability-audit-and-testing/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; know what the gateway did, for whom, and why, and know when a change breaks it.
You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;carry one trace across the client, the SDK and the server, and see the SDK&amp;rsquo;s own spans;&lt;/li&gt;
&lt;li&gt;ship every joinable record to OpenSearch without slowing or failing a request;&lt;/li&gt;
&lt;li&gt;write an audit log that records every call, allowed or refused, and withholds a result it
can&amp;rsquo;t record;&lt;/li&gt;
&lt;li&gt;build per-caller metrics and a service-level objective from the gateway&amp;rsquo;s own telemetry;&lt;/li&gt;
&lt;li&gt;pin the server&amp;rsquo;s contract with snapshot tests, its decisions with behaviour tests, and the
model&amp;rsquo;s tool choices with an eval gate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; Unit 1 stamped every request with a session, a trace and a step. Units 4
to 9 added fields to that record: what a query cost, who the caller was, what the policy
decided, which limit said no. Unit 10 named MCP08, &lt;em&gt;Lack of Audit and Telemetry&lt;/em&gt;, as the
category this unit answers. Unit 12, the capstone, is reviewed against what this unit records.&lt;/p&gt;</description></item><item><title>The Measured Default (Capstone)</title><link>https://learn.frenchforet.com/creating-mcps/12-the-measured-default/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/12-the-measured-default/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; put everything the course built behind one endpoint, use it to work a real incident
from alert to containment proposal, and decide, with evidence, whether it&amp;rsquo;s ready for
production. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;compose the SOC / IT-ops gateway from the CMDB and SIEM tools, the policy, the envelope and
the record, without changing any of them;&lt;/li&gt;
&lt;li&gt;add one tool, &lt;code&gt;propose_containment&lt;/code&gt;, that proposes a step for a person to approve and
executes nothing;&lt;/li&gt;
&lt;li&gt;triage the planted incident end to end, the measured way, and follow it through the audit
log and the telemetry;&lt;/li&gt;
&lt;li&gt;give the same gateway to the model and compare its path with the scripted one;&lt;/li&gt;
&lt;li&gt;run a production-readiness review that reports what passes, what&amp;rsquo;s a caveat, what fails and
what nobody has proven yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; every earlier unit left one layer and one check behind. Units 3 and 4
made the tools; Unit 5 placed them on the permission dial; Unit 7 gave them a caller and a
policy; Units 8 and 9 an envelope that holds under load; Unit 10 the threat model; Unit 11 the
record and the tests. This unit is where they meet, and the review is where each check earns
its keep.&lt;/p&gt;</description></item><item><title>References &amp; Further Reading</title><link>https://learn.frenchforet.com/creating-mcps/13-references/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/13-references/</guid><description>&lt;p&gt;The specifications, standards and documentation this course is built on, grouped by topic,
with the unit that leans on each. Where the course makes a claim about a protocol, a database
or a security property, the source is here. Read the source when your version differs from
the course&amp;rsquo;s: specs and products move faster than courses.&lt;/p&gt;
&lt;p&gt;The course targets &lt;strong&gt;MCP 2026-07-28&lt;/strong&gt; with the &lt;strong&gt;Python SDK v2&lt;/strong&gt;, &lt;strong&gt;Postgres 17&lt;/strong&gt; and
&lt;strong&gt;OpenSearch&lt;/strong&gt; with its security plugin. Links were checked in October 2026.&lt;/p&gt;</description></item><item><title>E1. Backend APIs with Approvals</title><link>https://learn.frenchforet.com/creating-mcps/e1-backend-apis-with-approvals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/e1-backend-apis-with-approvals/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; let the capstone gateway carry out the step it proposed, through backend APIs that
fail the way real ones do, without ever doing it twice, doing it unapproved, or doing it at the
wrong time. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;call an EDR and a ticketing API through a client with timeouts, retries, backoff and a
circuit breaker, and make the retries safe with idempotency keys;&lt;/li&gt;
&lt;li&gt;put a destructive tool behind three gates in the right order: prechecks, then the person&amp;rsquo;s
approval, then the call;&lt;/li&gt;
&lt;li&gt;refuse production changes outside the change window, with an emergency route that is
recorded as one;&lt;/li&gt;
&lt;li&gt;turn a slow action into a task with the Tasks extension, and serve clients that don&amp;rsquo;t
understand tasks just as well;&lt;/li&gt;
&lt;li&gt;prove every claim against a ledger of what the backends really did.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; this is the first unit of the optional enterprise track, and it plugs
into Unit 12&amp;rsquo;s gateway. It leans on Unit 7 (the policy and its ticket approval), Unit 8
(backpressure, timeouts and errors a model can act on) and Unit 12 (&lt;code&gt;propose_containment&lt;/code&gt;).
No model is needed.&lt;/p&gt;</description></item><item><title>E2. The Local Systems Server</title><link>https://learn.frenchforet.com/creating-mcps/e2-the-local-systems-server/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/e2-the-local-systems-server/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; give an agent controlled access to a host under investigation: who logged in, what
is running, what it talks to, what will start it again, and what a file is. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;place host triage on the permission dial, and see why the right rung runs no commands at
all;&lt;/li&gt;
&lt;li&gt;build a server whose every tool parses a file, with path rules that keep it inside the
host it examines and away from credentials;&lt;/li&gt;
&lt;li&gt;gate the one write, collecting evidence, behind a person&amp;rsquo;s approval;&lt;/li&gt;
&lt;li&gt;run the server inside the Foundations §16–17 sandbox, because what it parses was written by
the attacker, and probe the walls from inside;&lt;/li&gt;
&lt;li&gt;triage db-prod-01, the host the attacker pivoted to, and check every finding.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; the second unit of the optional enterprise track. It picks up where
Unit 12&amp;rsquo;s triage stopped, uses Unit 5&amp;rsquo;s dial, Unit 7&amp;rsquo;s ticket approval and Unit 10&amp;rsquo;s
redaction, and puts Foundations
&lt;a href="https://learn.frenchforet.com/docs/16-sandboxing-isolation-and-limits/"&gt;§16&lt;/a&gt;
 and
&lt;a href="https://learn.frenchforet.com/docs/17-sandboxing-containers-and-postgres/"&gt;§17&lt;/a&gt;
 around an MCP server. No estate
and no model are needed; Docker makes it a sandbox.&lt;/p&gt;</description></item><item><title>E3. Full OAuth for Remote Servers</title><link>https://learn.frenchforet.com/creating-mcps/e3-full-oauth-for-remote-servers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://learn.frenchforet.com/creating-mcps/e3-full-oauth-for-remote-servers/</guid><description>&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; let a host that has never seen your server connect to it the way a real deployment
does: find the issuer, register, send a person to consent, and get a token that works at that
server and nowhere else. You&amp;rsquo;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;discover everything from one URL and a 401, with no configuration in the host;&lt;/li&gt;
&lt;li&gt;run an authorization server with client registration, PKCE, consent bounded by the
person&amp;rsquo;s groups, and rotating refresh tokens;&lt;/li&gt;
&lt;li&gt;ask for more scope only when a tool needs it (step-up), and see who can approve it;&lt;/li&gt;
&lt;li&gt;call a downstream API &lt;em&gt;for&lt;/em&gt; the person with token exchange, never by passing their token
on;&lt;/li&gt;
&lt;li&gt;walk the flow by hand and hit every guard: a hostile redirect URI, no resource, a wrong PKCE
verifier, a code used twice, a refresh token replayed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where this fits:&lt;/strong&gt; the third unit of the optional enterprise track, after Unit 7. Unit 7&amp;rsquo;s
issuer handed tokens out directly and said the full flow was for later; this is later. The
gateway keeps Unit 7&amp;rsquo;s verification rules (signature, issuer, audience, expiry) and gains
everything around them. No estate and no model are needed: three small servers start on
loopback ports.&lt;/p&gt;</description></item></channel></rss>