New seed-once system project `ungated-global`: every server attached to it
is merged into every project's MCP endpoint in front of the gate (listed
and callable before begin_session), and its project prompt is prepended to
every project's instructions.
- mcpd: bootstrapUngatedGlobal seeds the project once-ever (marker key
`ungatedGlobalSeeded` in mcpctl-system-settings), with default server
`calcmcp` (patched CalcMCP fork, mysources.co.uk/michal/calcmcp:1.1.0)
and a "never do math yourself, always use calcmcp" prompt. Deletions are
durable: `mcpctl delete server calcmcp -p ungated-global` stays deleted.
- mcpd: GET /projects/:id/servers appends global servers flagged
`ungatedGlobal: true` (direct attachment wins, no self-merge);
GET /projects/:id/instructions prepends the global prompt and lists the
global servers.
- mcplocal: discovery surfaces the flagged names; the gate plugin exempts
them — gated tools/list returns begin_session + exempt tools, calls to
them pass through without ungating, and initialize instructions list
them under "Available immediately (no begin_session required)".
- templates/calcmcp.yaml so a deleted default can be re-created by hand.
- docs/ungated-global.md.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Models consuming projects have no idea what day it is. Three always-on
layers from mcplocal plus one from mcpd:
- initialize instructions and the begin_session briefing carry
'[context] now: <date/time> — project: <name>' (frozen at session
start by design);
- a get_current_time virtual tool (ungated catalogs only, same pattern
as read_prompts);
- every tools/call result gets a trailing '[context] now: …' content
item at the endpoint send site — the only chokepoint that also covers
virtual tools, gate intercepts and failure results, and the layer
that keeps a days-old chat session current;
- mcpd agent/project chat system blocks append the same line each turn.
Time renders as UTC plus an optional local timezone from
MCPLOCAL_AMBIENT_TZ (IANA name; both services read it; invalid or unset
means UTC only). ~15 tokens per stamp, minute precision.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
mcpctl hung on prompt-reading whenever the LLM misbehaved (thinking model =
minutes; drifted model = silent failure). Root cause: the gate's begin_session
prompt-selection called the LLM with no timeout, its fallback only fired on
error and was silent, and it forced the project's vLLM model onto the anthropic
heavy provider (so selection failed silently every time).
- New withTimeout(run, ms, label): Promise.race + AbortSignal (fetch-based
providers cancel). CompletionOptions.signal threaded into anthropic/openai.
- Gate begin_session: LLM selection is time-bounded (MCPCTL_GATE_LLM_TIMEOUT_MS,
8s); on timeout/error it falls back to deterministic tag matching, logs
[gate] loudly, prepends a ⚠ degraded note to the response, and sets
degraded/degradedReason on the audit gate_decision.
- Gate selector no longer forces the project vLLM model — uses the heavy
provider's own model (fixes the always-silent-fail bug).
- Pagination smart-index is time-bounded too (falls back to byte-range pages).
- Chat (LLM-essential) surfaces the upstream status+body (names model+reason)
instead of "Adapter returned no choice".
- docs/reliability.md documents the principle.
Tests: with-timeout unit tests; gate degradation test (error → visible ⚠ +
deterministic prompts, no hang). mcplocal 737 + mcpd 945 green; tsc clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add warmup() to LlmProvider interface for eager subprocess startup
- ManagedVllmProvider.warmup() starts vLLM in background on project load
- ProviderRegistry.warmupAll() triggers all managed providers
- NamedProvider proxies warmup() to inner provider
- paginate stage generates LLM-powered descriptive page titles when
available, cached by content hash, falls back to generic "Page N"
- project-mcp-endpoint calls warmupAll() on router creation so vLLM
is loading while the session initializes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>