opschain academy mcp
packs:academy
opschain academy mcp --single-learner [flags]
Serves the learner-side tutor lane: the installed OpsChain Academy
agent speaks the Model Context Protocol on this command's standard
streams — the transport every MCP client launches a local server with —
for the learner-local lane's one learner, over the same data directory
opschain academy serve --single-learner uses. Your own Claude Code,
Claude Desktop or any MCP client becomes the tutor, on the subscription
you already pay for: nothing is paid by the estate or by LimePoint, no
model key exists on any server, and the conversation never touches the
agent.
The lane is read-only. Its four tools answer where you are and never act:
| Tool | Answers |
|---|---|
learning_path | every track with whether it is locked and which pack entitlement unlocks it, every exercise's status, the exercise to work on next |
current_exercise | the current (or named) exercise: its outcome, the instructions rendered with the scenario seeded for you alone, the project your work must live in, the references, the evidence class it can earn, attempts and hints shown |
exercise_hints | the hints you already took on the exercise page, and the next one not yet shown — nothing is counted as shown |
last_check | the examiner's last verdicts on the exercise, each with its reason, and what became of the evidence bundle |
The tools never start, check or reseed an exercise, never hand out an answer and never carry a credential: you still do the work in OpsChain and press Check my work on the exercise page, where the agent's deterministic examiner alone decides. A shared (co-located) agent refuses the command by name — the lane is per learner, and a learner on a shared lab runs a learner-local agent on their own machine for it. Enrol from the agent's page once before the lane answers.
The launcher wires the product in before the agent starts: the targeted
OpsChain server (--server, OPSCHAIN_SERVER or the active context —
never local mode) becomes the agent's OPSCHAIN_SERVER, and your stored
opschain login session for that server — or OPSCHAIN_ACADEMY_TOKEN
when set — becomes its OPSCHAIN_ACADEMY_TOKEN. The agent only ever reads
with it. Without an installed agent, a server target or a credential the
command refuses by name; the lane works over the data directory, so the
launcher does not ask for --academy-server (the agent release this build
pins still refuses to start without one — pass it, or set
ACADEMY_AGENT_SERVER, as for serve). Diagnostics go to standard
error; standard output carries only protocol messages.
Connecting a client
Claude Code — claude mcp add academy -- opschain academy mcp --single-learner --academy-server https://academy.limepoint.com,
or .mcp.json in the project:
{
"mcpServers": {
"academy": {
"command": "opschain",
"args": ["academy", "mcp", "--single-learner", "--academy-server", "https://academy.limepoint.com"]
}
}
}
Claude Desktop — the same object under mcpServers in
claude_desktop_config.json (Settings → Developer → Edit Config). Any
other MCP client takes the same command and arguments; an OPSCHAIN_SERVER
or OPSCHAIN_ACADEMY_TOKEN the client should pass goes in its env
block, and --academy-server and --data-dir must name the same Academy
Server and data directory your serve uses.
Flags
Every flag maps onto the agent's own flag of the same meaning and its
ACADEMY_AGENT_* environment variable (a flag wins over the environment;
only flags you set are passed). --academy-server is the Academy Server,
distinct from the global --server, the OpsChain server the agent reads.
--single-learner is required: the lane serves the learner-local lane.
| Flag | Meaning |
|---|---|
--academy-server <url> | the Academy Server base URL (ACADEMY_AGENT_SERVER) |
--listen <addr> | address the learner pages listen on (default 127.0.0.1:8070; ACADEMY_AGENT_LISTEN) |
--data-dir <dir> | directory for the agent's store, deployment key and pack cache (default <opschain home>/academy; ACADEMY_AGENT_DATA_DIR) |
--grant-file <path> | file holding the registration grant, read at first run (ACADEMY_AGENT_GRANT_FILE) |
--key-file <path> | file holding the deployment key seed; default <data-dir>/deployment.key (ACADEMY_AGENT_KEY_FILE) |
--single-learner | the learner-local lane: one learner signing evidence with their own key (ACADEMY_AGENT_SINGLE_LEARNER) |
--label <text> | label shown to Academy administrators for this agent (ACADEMY_AGENT_LABEL) |
--session-ttl <duration> | browser sign-in lifetime, e.g. 12h (ACADEMY_AGENT_SESSION_TTL) |
--sync-interval <duration> | offline queue push and pack refresh interval, e.g. 30s (ACADEMY_AGENT_SYNC_INTERVAL) |
| `--tutor-provider anthropic | openai` |
--tutor-model <id> | the tutor model id; the provider's default when empty (ACADEMY_AGENT_TUTOR_MODEL) |
--tutor-base-url <url> | the tutor provider base URL; the provider's default when empty (ACADEMY_AGENT_TUTOR_BASE_URL) |
--tutor-key-env <name> | the environment variable holding the tutor model key (default ACADEMY_AGENT_TUTOR_KEY; ACADEMY_AGENT_TUTOR_KEY_ENV) |
--secure-cookies | mark the learner session cookie Secure, behind TLS (ACADEMY_AGENT_SECURE_COOKIES) |
Examples
$ opschain academy mcp --single-learner --academy-server https://academy.limepoint.com
Exit codes: the agent's own exit status (1 when the lane is refused: a shared agent, or no learner enrolled yet); 2 when no agent is installed, no server is targeted or no credential is available (the message names the fix).
See also
opschain docs cli/academy-serve— the lane that serves the pages this one reads beside.opschain docs packs-academy— the three tutor lanes and what the licence unlocks.