Runtime proof passed · identity boundary pending · 15 September 2026

Proposed flow · not a completion status

  1. Step 1Project grant
  2. Step 2Scoped bridge
  3. Step 3Current-policy check
  4. Step 4Approved MCP tool
On this page

Project-scoped MCP for Agent Mate

Status: design and implementation plan; not deployed. Date: 2026-09-15 Authorization: user approved proceeding and requested this artifact before implementation.

Outcome

A user selects an existing project, enables an approved MCP connection, and Agent Mate can use its permitted tools through the existing AIOS runtime. Access belongs to that project and account. The chat explains connection readiness and tool activity. Closing the dashboard does not stop autonomous work.

The four copied services have passed representative shadow checks. This demonstrates installation-level readiness, not project-scoped access or comprehensive tool correctness.

Hard constraints

Evidence from the existing code

Paths below refer to /tmp/agent-mate-discovery.

Existing contract Design consequence
crates/aios-cli/src/tui_backend.rs constructs McpRuntime::connect_configured(&home) once, then registers its definitions/call adapters MCP availability is process-scoped. A per-session prompt instruction cannot enforce project permissions.
crates/aios-agent-mate/src/runtime.rs launches the existing tui-backend with AIOS_HOME, creates/resumes a session and sends prompt.submit Keep this execution path. Scope the integration before launch; do not put MCP calls in a competing agent loop.
crates/aios-agent-mate/src/host.rs owns task lifetime independently of dashboard sockets MCP access and activity records must be owned outside a browser connection too.
aios-connections already defines McpTools, McpHttp, McpStdio and stable Project/Agent principals Extend the existing Connections system rather than build a second ownership database.
Policy::authorized checks current bindings, grants and credential authority Reuse current resource authority on every operation, not just on initial discovery.
Connection.credential is mandatory; registration/grants require that credential's assignment Local keyless MCP needs an explicit supported auth mode. A dummy vault key would be incorrect.
aios-mcp supports configured stdio and remote HTTP/SSE A scoped MCP adapter can present a standard MCP interface to the unchanged client. Exact transport/lifecycle behavior still requires verification.

These are source-review findings, not proof that the proposed bridge is implemented or compatible.

User workflow

  1. In a project's Connections panel, show approved available MCP connections by label and discovered tool descriptions. Keep installation commands, environment values and credentials out of the chooser.
  2. The project owner chooses a connection and permitted tools. Explain what each tool can do; do not classify arbitrary tools as read-only based on their name.
  3. Persist the grant using the authenticated account and a server-resolved immutable project identity. Reject stale selectors.
  4. Show separate states: configured, checking, ready, unavailable, permission revoked. A successful installation-level Test alone does not make a project ready.
  5. Agent Mate can offer the same selection in interactive chat. Chat and the manual panel submit the same backend operation.
  6. During a task, emit correlated started/completed/failed/cancelled tool activity. Show safe descriptions, timing and authorized output links, not raw credentials or unrestricted argument dumps.
  7. Revocation immediately blocks subsequent admission. Explain any operation already admitted whose external side effects cannot be undone.

Permission and configuration model

An administrator-approved server registration supplies a stable server identity and configuration revision. Names are display labels, not authority. Binding a connection to a server does not expose its command, URL headers or environment to the browser.

Reuse Connections ownership and resource bindings. Add an explicit MCP binding containing the server identity/revision and allowed tool names. Replacing a server command/endpoint must invalidate readiness and require explicit acceptance of the new revision; reusing a display name must not inherit trust.

Connection authentication must explicitly distinguish no credential from an assigned credential. Existing serialized credentials and API-provider requirements remain compatible. Only a registered keyless MCP binding permits no credential; an omitted credential must never silently bypass credential checks on existing providers.

Effective permission is the intersection of current account authority, active project binding, enabled connection, McpTools grant, approved server revision and allowed tool set. Agent-wide grants do not implicitly authorize every project. Start with exact tool-name permissions; document that argument-level resource authorization remains the adapter/server's responsibility.

Missing identities, unknown tools, removed accounts, replaced projects, unreadable policy and disconnected connections fail closed.

Execution architecture

Proposed path:

Project chat / Connections panel
  -> existing HTTP or WebSocket management adapter
  -> shared Connections authorization and persistence

Independent Agent Mate host
  -> authenticated task/project binding
  -> existing AIOS runtime and MCP client
  -> project-scoped MCP bridge
  -> approved external MCP service

The bridge is a protocol/permission adapter, not an agent engine. Prefer official rmcp for its MCP protocol implementation. It must be owned by an independent host/service lifecycle, not a dashboard socket or HTTP handler. Integrate service commands into the existing AIOS executable where appropriate; do not introduce another inference engine.

The runtime may see only bridge definitions for its bound project. Simply filtering tools/list is insufficient: tools/call must reauthorize each request, because tool schemas can remain cached in the runtime.

Before choosing the final launch mechanism, verify how runtime configuration, vault access, sessions and project paths resolve from AIOS_HOME. Do not solve isolation by copying the dashboard home, duplicating provider keys, changing global runtime configuration during concurrent work, or sharing one unrestricted worker among projects.

Authenticate the host-to-bridge association using an OS-authenticated private channel plus a server-issued task binding. A shared Linux UID alone does not identify a project. Request-supplied account/project IDs are not evidence of authority. Any capability must be scoped, short-lived, non-loggable and unavailable to other project workers. The exact delivery mechanism is a required implementation gate.

Upstream MCP processes must not inherit the dashboard environment/home. Use reviewed executable/endpoint definitions, minimal environment, output/time/concurrency bounds and scoped workspace/output storage. Browser tools are network-capable; command approval does not imply access to every host or project. Establish and test the allowed filesystem/network boundary before enabling real project access.

Revocation, recovery and events

Reauthorize discovery and every call against current persisted policy. Define call admission as the authorization linearization point. A revocation prevents later admission; signal cancellation for already running calls where supported, but never claim it reverses external effects.

Do not replay a tool invocation after an uncertain disconnect. Persist request identity and terminal/unknown state outside the dashboard. Reconnecting the chat restores activity history; it does not resubmit operations. Revoked tools may remain visible in an existing runtime's cached schema, but invocation must fail safely; newly granted tools become available through a verified supported refresh or a new task/runtime, not a harness change.

Activity records bind account, immutable project, task, runtime session, connection and request ID. Enforce the same ownership on activity replay and artifact access. Raw MCP output is untrusted content, never an authorization instruction. Output HTML needs isolated rendering; screenshot paths need authorized artifact publication rather than arbitrary file access.

Implementation sequence and completion gates

Task Work Evidence required before completion
MCP-P01 Verify runtime/bridge launch and task identity contract Existing runtime discovers and invokes a disposable bridge; two project bindings cannot impersonate each other; no harness diff
MCP-P02 Extend Connections for keyless MCP bindings and exact tool grants Existing credential-backed behavior preserved; keyless allowed only for approved MCP; stale/replaced bindings rejected
MCP-P03 Implement independent bridge with current-policy admission Allowed/denied/revoked calls verified; provider not contacted on denial; process/environment bounds demonstrated
MCP-P04 Bind bridge to Agent Mate task preparation Actual unchanged runtime invokes scoped tool; no cross-project configuration leakage; dashboard close does not stop task
MCP-P05 Add project picker and interactive chat controls over existing transport Same HTTP/WS authorization, readiness states, no mutation replay; owner/member browser checks
MCP-P06 Persist tool activity and publish authorized results Reconnect recovery, duplicate/unknown outcome handling, artifact ownership and safe rendering verified
MCP-P07 Shadow acceptance and rollback checkpoint Full flow below passed; concrete input/output evidence on blackboard; production unchanged

Tasks are sequential where contracts depend on earlier evidence. A source test or stub UI alone does not complete operational integration. Any incompatibility changes Agent Mate or this bridge design, never the harness.

Acceptance scenarios

Use synthetic pages, dummy credentials and disposable fixture projects first. Publish why each check matters, input, expected output, actual output and scope. Distinguish library fixtures, actual runtime integration and real dashboard browser checks. Never describe a planned check as passed.

Rollout and remaining boundaries

Keep project MCP unavailable until the execution and permission gates pass. Add readiness per connection rather than changing a global provider_execution flag to imply all Connections providers work. Preserve admin MCP tooling. Back up affected shadow configuration/data before activation; keep new grants explicit with no automatic grants to existing projects.

Remote OAuth/BYOK lifecycle, arbitrary untrusted server installation, channel onboarding and media generation remain later integration work. The design must support them without claiming they already work. The current page-structure parser is regex-based and style-inliner output is not guaranteed offline self-contained; their prior tests are representative, not exhaustive.

MCP-P01 progress — actual runtime proof

On 15 September 2026, an executable rmcp3.4 fixture ran through the existing shadow AIOS binary, using session.create and prompt.submit. A deterministic loopback model responder requested the MCP tool; no real provider or project was contacted.

Input Observed result Admitted fixture operations
Project A with matching enabled policy Returned project-a and MCP_BOUNDARY_FIXTURE 1
Tool arguments include project B override Rejected unknown project field 0
Disable policy after the runtime discovers tools Project access denied 0
Launch binding B with policy for A Project access denied 0

This proves runtime/protocol compatibility and per-call denial behavior in a controlled fixture. It does not prove hostile-worker isolation, multi-account ownership, concurrent projects, or real Connections grant enforcement. Launch arguments and the fixture policy are supervisor-controlled test inputs, not a production identity mechanism. MCP-P01 remains in progress.

The next implementation requirement is a trusted account/project/task binding and policy boundary outside the worker's writable filesystem. The current host is single-owner and authenticates Unix peers by UID; that alone cannot distinguish multiple projects. Do not enable live project MCP access until this boundary is implemented and verified. Harness source and live services were not changed by the proof.

Durable task identity — implementation progress

The Connections backend now stores an immutable account, host, task and verified project association. It survives registry reopening and checks current project ownership. Revocation prevents an old task from being reactivated. MCP permission lookup uses that stored project identity and current connection grants.

Seven focused tests passed: persistence, wrong account/host/task, permanent revocation, replaced projects and removed policy accounts, unverified selectors, project reassignment, and current MCP grants/credential authority. The full Connections regression suite passed 32 tests. These tests use temporary SQLite databases and synthetic project directories.

Not deployed. Authenticated transport wiring and OS worker isolation remain pending. The API requires trusted service context; an untrusted host or account string is not authentication. No live project MCP access was enabled.

Authenticated submission wiring and worker storage checks

Implemented in the development dashboard: before a scoped Agent Mate send reaches the host, the adapter resolves the logged-in account, checks its server-configured host and project mapping, and persists the task binding in the authority-owned Connections registry. It uses the same deterministic project selection as Agent Mate. Extra identity fields in the command are rejected. Session identity and host assignment are rechecked before dispatch.

The opt-in task configuration is private, owned by the dashboard authority, and requires a different worker Linux UID. Absence of configuration preserves ordinary chat and creates no project MCP binding. This is not implicit permission to use MCP. The policy mapping is operator-controlled; it is not a browser-editable account or host selector.

Verification completed

The dashboard test uses a synthetic Unix host to observe dispatch order; the separate runtime proof uses the actual AIOS execution loop. These do not yet establish a complete real-provider, multi-project bridge flow. The worker storage check enters the actual mount/UID boundary but does not inherit the service cgroup/seccomp filters.

Deployment state

Tested build is staged, not activated. The shadow deployment guard found two dashboard-owned AIOS processes and prevented their interruption. No live project grants, task configuration, runtime restart, production changes or harness edits were made. Deployment can use the existing guarded activation script once the dashboard has no active child processes. No new approval is requested.

Keyless MCP approvals and exact tool admission — 16 September 2026

Connections now supports MCP services without inventing an API key. A keyless definition names an operator-approved service, its revision and an explicit tool list. API connections still require credentials. Existing credential-backed definitions remain readable. The task resolver checks the stored project binding, current grant, selected tool, server revision and transport on each admission request. This is an authorization library, not yet the independent executable MCP bridge.

The existing aios connections operator command now supports allow-mcp --account ACCOUNT --server SERVER --revision REVISION --tool TOOL (repeat --tool for each permitted tool), and remove-mcp --account ACCOUNT --server SERVER. Both require the existing explicit --home. Approval replacement replaces the tool list rather than adding to it. Approval does not create a connection, project grant or running service. A revision is an operator-supplied identifier; the future adapter must derive and verify the actual upstream revision, rather than trust a worker-supplied value.

Verified with disposable data: all 36 Connections library tests passed, including four new keyless/exact-tool tests; 20 Connections UI tests passed. A compiled CLI fixture verified private policy storage, no vault creation, account isolation, invalid update preservation, approval replacement and safe repeated removal. Dashboard and CLI builds passed. No live service approvals or grants were created.

The UI can display keyless definitions and recognizes withdrawn service approvals. The connection creation form still needs a service/tool picker. The full web check remains blocked by the existing Banner component file-length violation; focused Connections lint, React purity and type checks passed. Independent bridge execution, trusted upstream resolution and end-to-end project MCP acceptance remain open.

Approved service picker and bridge admission — 16 September 2026

The Connections page now has an approved MCP service picker. Users name a connection, select a current service revision and explicitly choose tools. Saving does not create project access; the existing sharing controls grant that separately. Changed service approvals require fresh selections. Pending saves reject duplicate clicks, and rejected/failed saves preserve the form. Older backends show the no-approved-services state.

Real Chromium verification against a disposable compiled dashboard passed: one selected tool saved over the authenticated WebSocket without a key or implicit grant; an explicit project grant persisted; operator removal of service approval disabled new grants while existing access remained revocable. The page fit a 390-pixel viewport. All 25 Connections UI tests passed, along with focused lint, purity, TypeScript and the shadow build. The unrelated Banner file-length check still blocks the aggregate web check.

The dashboard-independent Connections library now includes authority-side keyless admission. A trusted supervisor supplies the immutable account/host/task/connection context. Each admission rereads the live account, policy, task binding, grants and a private operator-owned upstream descriptor. Changing the descriptor invalidates the captured SHA-256 revision. Files must be private, single-link regular files owned by the authority; symlinks are rejected. Secret-backed services are rejected by this keyless path.

The fingerprint covers the declared command/arguments or URL and artifact revision. It does not establish executable or script integrity; the isolated launcher must validate the actual deployed artifact. This module does not yet expose an authenticated worker channel or execute tools. Its trusted constructor must never be exposed as a browser/worker identity selector. The independent bridge still needs its authenticated task channel, rmcp transport, isolated upstream lifecycle and final runtime wiring. No MCP subprocess may be launched as the credential-owning authority.

Verification: 41 Connections tests passed, including five new admission tests for bound task/exact tool checks, revoked tasks, deleted accounts, removed policy, modified upstream configuration and private-file enforcement. CLI and dashboard rebuilt successfully. Frontend assets are updated in shadow; new backend binaries remain staged. No live approvals, grants, production changes or harness modifications were made.

Independent task admission channel — 16 September 2026

Implemented the aios mcp-authority command inside the existing AIOS executable. It has no dashboard lifetime dependency and does not initialize the default vault. The authority issues a private five-minute bearer ticket only for an already bound task with a currently granted tool. The ticket fixes account, host, task, connection, service and worker Linux UID in the authority registry. Only its SHA-256 digest is stored. Reissuing the same task/connection invalidates its previous ticket. Explicit revocation, expiry and current grant/account changes are checked on subsequent requests.

The private Unix endpoint verifies the OS peer UID and ticket on every request. Requests may list allowed tool names or check one tool; they cannot supply account/project/host/task overrides. It accepts at most eight concurrent requests, caps each input at4096 bytes, and bounds socket reads/writes to three seconds. Authority and worker UIDs must differ. Responses expose neither secrets nor launch commands and explicitly report tool_execution=false. Tickets are written only to newly created0600 files in a private operator directory, never printed by the CLI.

This endpoint is an admission service, not yet the MCP protocol or upstream executor. A separate-UID test client received a dummy ticket through process stdin. Production ticket delivery must still keep tickets inaccessible to other project workers. OS UID checks alone do not isolate projects sharing that UID. Supervisor issuance/renewal, completion-time revocation, rmcp transport and isolated upstream execution remain to be wired before live access can be enabled. Admission retries are not tool execution or exactly-once guarantees.

Verification completed:45 Connections tests passed. The compiled service accepted only the selected navigate tool from a different Linux UID. It rejected unknown tickets, forged identity fields, an oversized request, the wrong peer UID, old/revoked/expired tickets and removed grants. Reissuing to an existing output file failed without invalidating the existing ticket. The service ran without a dashboard process. CLI and dashboard builds passed. Existing dashboard MCP WebSocket add/list/test/remove, member/origin denial and administrator-revocation cancellation also passed against disposable fixtures. No upstream tool was executed.

The first channel fixture incorrectly used the repository's project ID instead of the operator-created grant principal; admission rejected it. The fixture now uses the principal returned by bind-project, and the final run passed. No authorization checks were weakened.

Deployment remains staged. No new live tickets, grants, services, dashboard restarts, production changes or harness edits were made.

Isolated local MCP execution — 16 September 2026

The existing AIOS executable now contains a Linux-only mcp-executor service and an internal bounded operation subprocess. An optionally configured authority forwards approved stdio calls to this separate executor over a Unix socket. The authority verifies the executor UID; the executor accepts only its configured authority UID. The executor route belongs to one exact account, host and task. A valid ticket for another task cannot use that workspace. Without an executor configuration, the existing admission-only mode remains unchanged. No dashboard-owned process is used for this lifetime.

The upstream is selected from the authority's approved descriptor, never from the worker's tool arguments. Tickets are not forwarded to the executor or upstream. The operation uses the existing AIOS MCP client; it is not a new agent/model loop. Compatibility with an actual rmcp3.4 server was verified. The client-facing rmcp bridge still needs implementation. Remote HTTP upstream execution is intentionally unavailable until its network and credential policy is implemented.

The executor requires a non-root identity and no_new_privs. The trusted supervisor must supply filesystem, process and network isolation; the command does not create that boundary by itself. The disposable verification launcher uses Linux mount/network/PID namespaces, a restricted root, read-only system/tool mounts, a dedicated writable work directory, and a non-root identity with dropped capabilities. It preserves host UID identity for Unix peer authentication. Private user namespace UID translation initially broke that peer check; the corrected launcher does not weaken authentication.

Calls have bounded input/output, one executor operation at a time, a configurable1–120-second deadline, process-group cleanup and child reaping. Operation memory is limited to1GiB, file size to64MiB, and serialized response size to1MiB. A timed-out fixture exposed zombie children; subreaper/group cleanup fixed that before the final run. These controls do not establish aggregate disk/process quotas or containment of a hostile server deliberately escaping its process group. A production per-task service/cgroup profile and pinned executable integrity remain activation prerequisites.

Before forwarding, the authority persists a call ID within the account/host/task/connection scope. Reusing it is rejected even after ticket replacement or registry reopening. Completed calls record completed; transport failures, timeouts and oversized output record unknown. A crash may leave submitted requiring reconciliation. No argument values or raw tool output enter this receipt table. This prevents silent replay; it is not a claim of exactly-once external effects.

Final verification

No live service profile, tickets, grants or production configuration was changed. Harness diff remains empty. Backend changes are staged. Next is the client-facing MCP bridge, trusted Agent Mate ticket delivery/renewal/completion revocation, production-grade per-task isolation, and full unchanged-runtime acceptance. The current tests use a dedicated fixture workspace, not concurrent real projects or public-network tools.

Approved tool-schema discovery — 16 September 2026

Added a discover operation to the independent authority. It resolves the task ticket and exact executor route, starts the approved stdio upstream inside the isolated executor, and returns only currently approved names, descriptions and input schemas. No tool call is sent during discovery; starting an upstream can itself have side effects and remains subject to the existing isolation boundary. The authority re-resolves the ticket and current grants after the upstream responds. No ticket is forwarded to the executor. Discovery uses the same time/output bounds as execution and does not create execution receipts.

The final CLI build and both compiled fixtures passed. Tests observed navigate-only filtering, actual rmcp3.4 marker:string schema preservation, zero discovery tool invocations, rejection before upstream startup for another task or a removed grant, and withholding a response when the task ticket was revoked during discovery. Existing execution/isolation/replay/timeout and admission-only checks also passed. Evidence: scripts/blackboard/reports/mcp-tool-discovery.json; fixture: scripts/security/mcp-isolated-execution.py. Harness diff is empty. No live services or production configuration changed.

This completes schema discovery behind the authority, not the client-facing MCP server or automatic Agent Mate ticket handoff. Those remain pending. The official rmcp SDK is cached for fixtures but is not yet vendored into the AIOS workspace; adding it must preserve the repository’s offline build and desktop dependency union. Production-grade task containment and full unchanged-runtime acceptance remain required.

Linux and macOS parity — required for all AIOS additions

The user requires the complete AIOS functionality on Linux and macOS. This is not limited to the MCP bridge. No disabled macOS feature, Linux-only fallback, or reduced macOS feature set satisfies acceptance. The harness remains unchanged.

Implemented in the staged tree

Verification completed

The Linux CLI build passed. Four Agent Mate tests and four native-platform/policy tests passed. The real SDK bridge passed discovery, execution, duplicate/unapproved-call denial, renewal without restart, and task revocation. Two full turns through unchanged tui-backend passed: approved execution made one upstream call and completed; revocation after discovery made zero upstream calls and completed with denial. These use a network-isolated local fixture model and disposable keys, not a paid provider.

cargo check --tests -p aios-task-platform passed for both aarch64-apple-darwin and x86_64-apple-darwin. These checks cover the new platform library and native test code only. They are not a full Mac AIOS build or proof of native sandbox behavior. The repository's required vendor script preserved the workspace+desktop union and both metadata resolutions passed offline. No harness changes or production deployment occurred.

Remaining acceptance work — not waived

Area Remaining work
Native macOS Run full CLI/dashboard builds and native publication, sandbox, tool execution and runtime tests on actual macOS. A Mac runner has been requested; this environment is Linux.
Child lifecycle and resource bounds Verify Darwin timeout/process-group cleanup and native resource-limit behavior; test detached descendants and aggregate quotas on both platforms. Linux subreaper behavior must not be assumed on macOS.
Service lifetime Integrate and verify independent Agent Mate/importer/authority/executor service startup and recovery on macOS launchd as well as Linux. Existing macOS provisioning starts dashboard/gateway only.
Task supervision Implement trusted automatic ticket issuance, private delivery, renewal and task-end revocation. Current renewal/revocation proof is fixture-driven.
Filesystem/runtime dependencies Verify macOS interpreter/library read grants, home paths, permissions, symlink boundaries, Git runtime and installed SDK tools.
Whole product acceptance Run the existing dashboard and headless workflows on both native OSes. Cross-compiling the new library is insufficient.

The reviewed dashboard HTTP/WebSocket gates, Connections storage and Agent Mate Unix socket identity paths have no explicit Linux-only branch in the inspected additions; they still require full native builds and behavior checks. This audit does not claim every pre-existing AIOS subsystem has been tested.

Source references for the implementation review: Apple SDK libc declarations for renamex_np/RENAME_EXCL; Tokio peer credential platform support; native Seatbelt policy example. Sandbox policy-construction tests are not a substitute for macOS execution.