Skip to main content
Use this example when a team needs one Fentaris endpoint with separate reader, developer, and maintainer access. It includes a remote upstream MCP server, a stdio upstream MCP server, one local app-owned namespace, API-key identity, group-scoped credentials, and validation commands. The maintained runnable project is now in Fentaris/team-governed-proxy. See its README for installation and verification, or follow the runnable example walkthrough. This guide shows a broader configuration you can adapt with your own upstreams.

Quick Start

Create the project:
Add package scripts:
Create fentaris.json:
Create tsconfig.json:
Create .gitignore:
Create src/index.ts:

Secrets Manifest

Create the manifest after the entrypoint exists:
See project vault unlocking and migration. macOS can use Keychain instead of an explicit unlock key. Group policies remain distinct from upstream account aliases. The generated .fentaris/secrets.manifest.json is a schema file, not a secret store. Its exact entries depend on the credential helpers in the entrypoint. It uses this shape:
Commit the generated manifest. Do not commit .fentaris/vault.json, raw API keys, upstream tokens, or FENTARIS_VAULT_KEY.

Provision Local Credentials

Generate API keys and store upstream credentials:
Save each generated API key when it is printed. Fentaris stores only hashes in the encrypted local credential store.

Validate The Project

Run local checks before connecting a client:
Expected successful shapes:
Start the proxy:
In another shell, inspect administrative connections and verify runtime health:
MCP inventory lists configured upstreams independently of the incoming user. Test reader and maintainer policies through the running MCP endpoint using their respective API keys. The reader’s tools/list should include filesystem list access and omit maintainer-only GitHub writes; a denied tool call must fail before upstream dispatch. Administrative tool discovery does not establish a client’s runtime permissions.

MCP Client Test

For a direct JSON-RPC smoke test, call the running MCP endpoint with the API key header:
Expected shape: