list_servicesLABSCO SUMMARY
The threat it addresses is the one people actually have: an agent one prompt injection away from your Stripe key.
The usual arrangement gives an agent the raw key and hopes. Here the key never crosses the boundary — the agent names a capability and an action, Janee attaches the credential and returns only the response. That also fixes the operational mess underneath: one config serves every client, so rotating a key is one edit rather than a hunt through settings files. Exec mode is the part worth noticing, because CLI tools want credentials as environment variables and this maps them in without the agent ever reading them. Everything is logged, and a session can be revoked while it is running.
What it is
A TypeScript MCP server that sits between your agents and the APIs they need: keys stay encrypted on your machine, the agent asks for an action, and Janee makes the request with the real credential attached.
What you get
- execute — an HTTP call made on the agent's behalf, with the credential injected and never returned
- janee_exec — a CLI tool run with credentials mapped into its environment, restricted to commands you allowlisted
- list_services — the services an agent can reach, without exposing what is behind them
- An explanation of why a request was allowed or refused — explain_access over MCP, or janee diagnose access on the command line
- manage_credential and reload_config, for changing a key or a policy without restarting everything
- Per-capability allow and deny rules, so a capability can be read-only against one API and full against another
- Session TTLs with instant revocation, and an audit trail carrying timestamp, method, path and status for every request
- Auth types beyond bearer tokens: GitHub App short-lived tokens instead of static PATs, Twitter OAuth 1.0a signed per request, and AWS SigV4 signing
- Git push and pull that just works once the credentials include a GitHub token
- One config that every MCP client shares — Claude Desktop, Cursor, OpenClaw and others
Requirements
Your own API keys, stored encrypted under a local directory Janee creates — nothing is sent to a cloud. Installed globally from npm as @true-and-useful/janee, initialised once, then services added interactively or by editing the config file. JANEE_CONFIG points at a different secrets file if you want one.
Setup effort
One command — npm install -g @true-and-useful/janee
USE CASES
Letting an agent call an API you would not hand it the key to
It asks for the action; the credential is attached server-side and never appears in the response.
Running a CLI tool that expects a secret in the environment
Map the credential into the command's environment, restricted to the commands you allowlisted.
Keeping an agent read-only against a sensitive service
Write the allow and deny rules into the capability rather than into a prompt the agent can be talked out of.
Answering what an agent actually did
The audit trail has each request with its timestamp, method, path and status.
Rotating a key without touching every client
Update it once in Janee and reload — every agent connected keeps working with the new one.
Giving an autonomous agent GitHub access safely
Use GitHub App short-lived tokens rather than a static personal access token, and git push starts working on its own.
8 tools
Listed in project code.
executemanage_credentialtest_servicewhoamiexplain_accessjanee_execreload_configBEFORE YOU INSTALL
What to know first
Tools you get
8 tools registered in the project's code.
Requires
npm on PATH
INSTALLATION
Connect your client
Server setup
npm install -g @true-and-useful/janeeMCP Clients
Claude Code, Claude Desktop, Cursor
{
"mcpServers": {
"janee": {
"command": "janee",
"args": [
"serve"
]
}
}
}Codex
[mcp_servers.janee]
command = "janee"
args = ["serve"]OpenClaw
Install Janee: npm install -g @true-and-useful/janee
Run janee init, then add your services with janee add or by editing ~/.janee/config.yaml
Install the OpenClaw plugin: openclaw plugins install @true-and-useful/janee-openclaw
Enable it in your agent config:
{
"agents": {
"list": [
{
"id": "main",
"tools": {
"allow": [
"janee"
]
}
}
]
}
}The plugin starts janee serve for you and exposes the tools as janee_list_services and janee_execute. All requests are logged to ~/.janee/logs/.
Claude Desktop — Docker
git clone https://github.com/rsdouglas/janee
cd janee
docker build -t janee .
mkdir -p config
cp ~/.janee/config.yaml config/{
"mcpServers": {
"janee": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"<YOUR_PATH_TO_CONFIG>:/root/.janee:ro",
"janee",
"--transport",
"stdio"
]
}
}
}No image is published: janee is the local tag the build above creates. The host side of the -v value is the absolute path of the config directory you just filled (it needs a config.yaml from janee init).