Rank
83
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Crawler Summary
Secrets management for AI agents via MCP Janee π **Secrets management for AI agents via MCP** $1 $1 $1 $1 Your AI agents need API access to be useful. But they shouldn't have your raw API keys. Janee sits between your agents and your APIs β injecting credentials, enforcing policies, and logging everything. β¨ Features | | | |---|---| | π **Zero-knowledge agents** | Agents call APIs without ever seeing keys | | π **Full audit trail** | Every request logged Capability contract not published. No trust telemetry is available yet. 20 GitHub stars reported by the source. Last updated 2/25/2026.
Freshness
Last checked 2/25/2026
Best For
@true-and-useful/janee is best for ai, agents, security workflows where MCP compatibility matters.
Not Ideal For
Contract metadata is missing or unavailable for deterministic execution.
Evidence Sources Checked
editorial-content, GITHUB MCP, runtime-metrics, public facts pack
Secrets management for AI agents via MCP Janee π **Secrets management for AI agents via MCP** $1 $1 $1 $1 Your AI agents need API access to be useful. But they shouldn't have your raw API keys. Janee sits between your agents and your APIs β injecting credentials, enforcing policies, and logging everything. β¨ Features | | | |---|---| | π **Zero-knowledge agents** | Agents call APIs without ever seeing keys | | π **Full audit trail** | Every request logged
Public facts
4
Change events
0
Artifacts
0
Freshness
Feb 25, 2026
Capability contract not published. No trust telemetry is available yet. 20 GitHub stars reported by the source. Last updated 2/25/2026.
Trust score
Unknown
Compatibility
MCP
Freshness
Feb 25, 2026
Vendor
Janee
Artifacts
0
Benchmarks
0
Last release
0.11.3
Key links, install path, and a quick operational read before the deeper crawl record.
Summary
Capability contract not published. No trust telemetry is available yet. 20 GitHub stars reported by the source. Last updated 2/25/2026.
Setup snapshot
git clone https://github.com/rsdouglas/janee.gitSetup complexity is MEDIUM. Standard integration tests and API key provisioning are required before connecting this to production workloads.
Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Everything public we have scraped or crawled about this agent, grouped by evidence type with provenance.
Vendor
Janee
Protocol compatibility
MCP
Adoption signal
20 GitHub stars
Handshake status
UNKNOWN
Merged public release, docs, artifact, benchmark, pricing, and trust refresh events.
Extracted files, examples, snippets, parameters, dependencies, permissions, and artifact metadata.
Extracted files
0
Examples
6
Snippets
0
Languages
typescript
yaml
services:
stripe:
baseUrl: https://api.stripe.com
auth: { type: bearer, key: sk_live_xxx }
github:
baseUrl: https://api.github.com
auth: { type: bearer, key: ghp_xxx }
openai:
baseUrl: https://api.openai.com
auth: { type: bearer, key: sk-xxx }bash
npm install -g @true-and-useful/janee
bash
janee init
bash
janee add
text
Service name: stripe Base URL: https://api.stripe.com Auth type: bearer API key: sk_live_xxx β Added service "stripe" Create a capability for this service? (Y/n): y Capability name (default: stripe): TTL (e.g., 1h, 30m): 1h Auto-approve? (Y/n): y β Added capability "stripe" Done! Run 'janee serve' to start.
yaml
services:
stripe:
baseUrl: https://api.stripe.com
auth:
type: bearer
key: sk_live_xxx
capabilities:
stripe:
service: stripe
ttl: 1h
autoApprove: trueFull documentation captured from public sources, including the complete README when available.
Docs source
GITHUB MCP
Editorial quality
ready
Secrets management for AI agents via MCP Janee π **Secrets management for AI agents via MCP** $1 $1 $1 $1 Your AI agents need API access to be useful. But they shouldn't have your raw API keys. Janee sits between your agents and your APIs β injecting credentials, enforcing policies, and logging everything. β¨ Features | | | |---|---| | π **Zero-knowledge agents** | Agents call APIs without ever seeing keys | | π **Full audit trail** | Every request logged
Secrets management for AI agents via MCP
Your AI agents need API access to be useful. But they shouldn't have your raw API keys. Janee sits between your agents and your APIs β injecting credentials, enforcing policies, and logging everything.
| | |
|---|---|
| π Zero-knowledge agents | Agents call APIs without ever seeing keys |
| π Full audit trail | Every request logged with timestamp, method, path, status |
| π‘οΈ Request policies | Allow/deny rules per capability (e.g., read-only Stripe) |
| β±οΈ Session TTLs | Time-limited access with instant revocation |
| π Works with any MCP client | Claude Desktop, Cursor, OpenClaw, and more |
| π Local-first | Keys encrypted on your machine, never sent to a cloud |
| π₯οΈ Exec mode | Run CLI tools with injected credentials β agents never see the keys |
| π€ GitHub App auth | Short-lived tokens for autonomous agents β no static PATs |
| π§ Automatic git auth | git push/pull just works when credentials include GitHub tokens |
AI agents need API access to be useful. The current approach is to give them your keys and hope they behave.
Janee is an MCP server that manages API secrets for AI agents:
~/.janee/janee serve β starts MCP serverexecute MCP toolYour keys stay on your machine. Agents never see them. You stay in control.
Set up your APIs in Janee once:
services:
stripe:
baseUrl: https://api.stripe.com
auth: { type: bearer, key: sk_live_xxx }
github:
baseUrl: https://api.github.com
auth: { type: bearer, key: ghp_xxx }
openai:
baseUrl: https://api.openai.com
auth: { type: bearer, key: sk-xxx }
Now every agent that connects to Janee can use them:
No more copying keys between tools. No more "which agent has which API configured?" Add a new agent? It already has access to everything. Revoke a key? Update it once in Janee.
One config. Every agent. Full audit trail.
npm install -g @true-and-useful/janee
janee init
This creates ~/.janee/config.yaml with example services.
Option 1: Interactive (recommended for first-time users)
janee add
Janee will guide you through adding a service:
Service name: stripe
Base URL: https://api.stripe.com
Auth type: bearer
API key: sk_live_xxx
β Added service "stripe"
Create a capability for this service? (Y/n): y
Capability name (default: stripe):
TTL (e.g., 1h, 30m): 1h
Auto-approve? (Y/n): y
β Added capability "stripe"
Done! Run 'janee serve' to start.
Using an AI agent? See Non-interactive Setup for flags that skip prompts, or the agent-specific guides below.
Option 2: Edit config directly
Edit ~/.janee/config.yaml:
services:
stripe:
baseUrl: https://api.stripe.com
auth:
type: bearer
key: sk_live_xxx
capabilities:
stripe:
service: stripe
ttl: 1h
autoApprove: true
Some tools need credentials as environment variables, not HTTP headers. Exec mode handles this:
janee add twitter --exec \
--key "tvly-xxx" \
--allow-commands "bird,tweet-cli" \
--env-map "TWITTER_API_KEY={{credential}}"
Now agents can run CLI tools through Janee without ever seeing the API key:
// Agent calls janee_exec tool
janee_exec({
capability: "twitter",
command: ["bird", "post", "Hello world!"],
cwd: "/home/agent/project", // optional working directory
reason: "User asked to post a tweet"
})
Janee spawns the process with TWITTER_API_KEY injected, runs the command, and returns stdout/stderr. The credential never enters the agent's context.
Key flags:
--exec β configure as exec-mode (CLI wrapper instead of HTTP proxy)--allow-commands β whitelist of allowed executables (security)--env-map β map credentials to environment variables--work-dir β working directory for the subprocess--timeout β max execution time (default: 30s)When using exec mode with GitHub credentials, Janee automatically handles git authentication. No extra configuration needed β git push, git pull, and git clone just work:
capabilities:
- name: git-ops
service: github
mode: exec
allowCommands: [git]
env:
GH_TOKEN: "{{credential}}"
// Agent can push code without ever seeing the token
janee_exec({
capability: "git-ops",
command: ["git", "push", "origin", "main"],
cwd: "/workspace/my-repo"
})
Janee detects git commands with GH_TOKEN/GITHUB_TOKEN in the environment and creates a temporary askpass script for HTTPS authentication. The script is cleaned up automatically after the command completes.
Static tokens are risky for long-running agents. GitHub App auth generates short-lived installation tokens on demand β no long-lived PATs required.
Option 1: Use create-gh-app (recommended)
npx @true-and-useful/create-gh-app create my-agent --owner @me
# Opens browser β creates app β saves credentials locally
# Install the app on your repos
# https://github.com/apps/my-agent/installations/new
# Register with Janee in one command
npx @true-and-useful/create-gh-app janee-add my-agent
Done. Your agent now gets short-lived GitHub tokens through Janee's MCP proxy.
Option 2: Manual setup
janee add github-app \
--auth-type github-app \
--app-id 123456 \
--pem-file /path/to/private-key.pem \
--installation-id 789
Or via config:
services:
github:
baseUrl: https://api.github.com
auth:
type: github-app
appId: "123456"
pemFile: /path/to/private-key.pem
installationId: "789"
How it works: When an agent requests access, Janee signs a JWT with the app's private key, exchanges it for a 1-hour installation token via GitHub's API, and caches the token until expiry. The agent never sees the private key β only the short-lived token reaches the API.
janee serve
Agents that support MCP (Claude Desktop, Cursor, OpenClaw) can now call the execute tool to make API requests through Janee:
// Agent calls the execute tool
execute({
capability: "stripe",
method: "GET",
path: "/v1/balance",
reason: "User asked for account balance"
})
Janee decrypts the key, makes the request, logs everything, and returns the response.
Works with any agent that speaks MCP:
@true-and-useful/janee-openclaw)
janee serveIf you're using OpenClaw, install the plugin for native tool support:
npm install -g @true-and-useful/janee
janee init
# Edit ~/.janee/config.yaml with your services
# Install the OpenClaw plugin
openclaw plugins install @true-and-useful/janee-openclaw
Enable in your agent config:
{
agents: {
list: [{
id: "main",
tools: { allow: ["janee"] }
}]
}
}
Your agent now has these tools:
janee_list_services β Discover available APIsjanee_execute β Make API requests through JaneeThe plugin spawns janee serve automatically. All requests are logged to ~/.janee/logs/.
Janee exposes three MCP tools:
| Tool | Description |
|------|-------------|
| list_services | Discover available APIs and their policies |
| execute | Make an API request through Janee (HTTP proxy mode) |
| exec | Run a CLI command with injected credentials (exec mode) |
| manage_credential | View, grant, or revoke access to agent-scoped credentials |
| reload_config | Reload config from disk after adding/removing services (available when started with janee serve) |
Agents discover what's available, then call APIs through Janee. Same audit trail, same protection.
Config lives in ~/.janee/config.yaml:
server:
host: localhost
services:
stripe:
baseUrl: https://api.stripe.com
auth:
type: bearer
key: sk_live_xxx # encrypted at rest
github:
baseUrl: https://api.github.com
auth:
type: bearer
key: ghp_xxx
capabilities:
stripe:
service: stripe
ttl: 1h
autoApprove: true
stripe_sensitive:
service: stripe
ttl: 5m
requiresReason: true
Services = Real APIs with real keys
Capabilities = What agents can request, with policies
Control which agents can use which capabilities:
server:
host: localhost
defaultAccess: restricted # capabilities require explicit allowlist
capabilities:
stripe:
service: stripe
ttl: 1h
allowedAgents: ["agent-a", "agent-b"] # only these agents can use it
github:
service: github
ttl: 1h
# no allowedAgents + defaultAccess: restricted β no agent can use this
defaultAccess: restricted β capabilities without an allowedAgents list are hidden from all agentsdefaultAccess: open (default) β capabilities without an allowedAgents list are available to all agentsallowedAgents β per-capability list of agent names (matched against clientInfo.name from the MCP initialize handshake)Credentials created by agents at runtime default to agent-only access β only the creating agent can use them unless it explicitly grants access via the manage_credential tool.
services:
twitter:
auth:
type: bearer
key: tvly-xxx
capabilities:
twitter:
service: twitter
mode: exec
allowCommands: ["bird", "tweet-cli"]
envMap:
TWITTER_API_KEY: "{{credential}}"
ttl: 1h
autoApprove: true
Exec-mode capabilities use janee_exec instead of execute. The credential is injected as an environment variable β the agent sees only stdout/stderr.
Runner hardening defaults in exec mode:
HOME per commandWhen agents run inside Docker containers, janee_exec on a remote host cannot access the container filesystem. The Runner/Authority architecture solves this:
janee_exec locally# Host: start Authority (MCP + exec authorization on one port)
janee serve -t http -p 3100 --host 0.0.0.0 --runner-key "$JANEE_RUNNER_KEY"
# Container: start Runner (agent talks to this)
janee serve -t http -p 3200 --host 127.0.0.1 \
--authority http://host.docker.internal:3100 --runner-key "$JANEE_RUNNER_KEY"
The agent only needs JANEE_URL=http://localhost:3200.
You can also run the Authority as a standalone process:
janee authority --runner-key "$JANEE_RUNNER_KEY" --host 127.0.0.1 --port 9120
See the Runner/Authority guide for the full architecture, exec authorization flow, Docker Compose example, and troubleshooting.
Control exactly what requests each capability can make using rules:
capabilities:
stripe_readonly:
service: stripe
ttl: 1h
rules:
allow:
- GET *
deny:
- POST *
- PUT *
- DELETE *
stripe_billing:
service: stripe
ttl: 15m
requiresReason: true
rules:
allow:
- GET *
- POST /v1/refunds/*
- POST /v1/invoices/*
deny:
- POST /v1/charges/* # Can't charge cards
- DELETE *
How rules work:
deny patterns are checked first β explicit deny always winsallow patterns are checked β must match to proceedPattern format: METHOD PATH
GET * β any GET requestPOST /v1/charges/* β POST to /v1/charges/ and subpaths* /v1/customers β any method to /v1/customersDELETE /v1/customers/* β DELETE any customerThis makes security real: Even if an agent lies about its "reason", it can only access the endpoints the policy allows. Enforcement happens server-side.
janee init # Set up ~/.janee/ with example config
janee add # Add a service (interactive)
janee add stripe -u https://api.stripe.com -k sk_xxx # Add with args
janee remove <service> # Remove a service
janee remove <service> --yes # Remove without confirmation
janee list # List configured services
janee list --json # Output as JSON (for integrations)
janee search [query] # Search service directory
janee search stripe --json # Search with JSON output
janee cap list # List capabilities
janee cap list --json # List capabilities as JSON
janee cap add <name> --service <service> # Add capability
janee cap edit <name> # Edit capability
janee cap remove <name> # Remove capability
janee serve # Start MCP server (stdio, default)
janee serve --transport http --port 9100 # Start with HTTP transport (for containers)
janee serve --authority https://janee.example.com --runner-key $JANEE_RUNNER_KEY # Runner mode
janee authority --runner-key $JANEE_RUNNER_KEY # Start authority API
janee logs # View audit log
janee logs -f # Tail audit log
janee logs --json # Output as JSON
janee sessions # List active sessions
janee sessions --json # Output as JSON
janee revoke <id> # Kill a session
AI agents can't respond to interactive prompts. Use --*-from-env flags to read credentials from environment variables β this keeps secrets out of the agent's context window:
# Bearer auth (Stripe, OpenAI, etc.)
janee add stripe -u https://api.stripe.com --auth-type bearer --key-from-env STRIPE_KEY
# HMAC auth (Bybit)
janee add bybit --auth-type hmac-bybit --key-from-env BYBIT_KEY --secret-from-env BYBIT_SECRET
# HMAC auth with passphrase (OKX)
janee add okx --auth-type hmac-okx --key-from-env OKX_KEY --secret-from-env OKX_SECRET --passphrase-from-env OKX_PASS
# GitHub App auth (short-lived tokens)
janee add github --auth-type github-app --app-id-from-env GH_APP_ID --pem-from-env GH_PEM --installation-id-from-env GH_INSTALL_ID
When all required credentials are provided via flags, Janee:
You can also edit ~/.janee/config.yaml directly if you prefer.
βββββββββββββββ ββββββββββββ βββββββββββ
β AI Agent βββββββΆβ Janee βββββββΆβ Stripe β
β β MCP β MCP β HTTP β API β
βββββββββββββββ ββββββββββββ βββββββββββ
β β
No key Injects key
+ logs request
execute MCP tool with capability, method, pathAgent never touches the real key.
clientInfo.name in the MCP initialize handshake β no custom headers neededallowedAgents whitelist + server-wide defaultAccess policyagent-only~/.janee/logs/janee revoke or delete configRun Janee as a container β no local Node.js required:
# Build
docker build -t janee .
# Run in HTTP mode
docker run -d -p 3000:3000 \
-v ~/.janee:/root/.janee:ro \
janee --transport http --port 3000 --host 0.0.0.0
Or use Docker Compose:
mkdir -p config && cp ~/.janee/config.yaml config/
docker compose up -d
For Claude Desktop with Docker, see Docker docs.
We welcome contributions! Please read CONTRIBUTING.md before submitting a PR β it includes the required PR checklist (tests, changelog, version bump, etc.).
MIT β Built by True and Useful LLC
Stop giving AI agents your keys. Start controlling access. π
Machine endpoints, protocol fit, contract coverage, invocation examples, and guardrails for agent-to-agent use.
Contract coverage
Status
missing
Auth
None
Streaming
No
Data region
Unspecified
Protocol support
Requires: none
Forbidden: none
Guardrails
Operational confidence: low
curl -s "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/snapshot"
curl -s "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/contract"
curl -s "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/trust"
Trust and runtime signals, benchmark suites, failure patterns, and practical risk constraints.
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Do not use if
Every public screenshot, visual asset, demo link, and owner-provided destination tied to this agent.
Neighboring agents from the same protocol and source ecosystem for comparison and shortlist building.
Rank
83
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Rank
80
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Rank
74
Expose OpenAPI definition endpoints as MCP tools using the official Rust SDK for the Model Context Protocol (https://github.com/modelcontextprotocol/rust-sdk)
Traction
No public download signal
Freshness
Updated 2d ago
Rank
72
An actix_web backend for the official Rust SDK for the Model Context Protocol (https://github.com/modelcontextprotocol/rust-sdk)
Traction
No public download signal
Freshness
Updated 2d ago
Contract JSON
{
"contractStatus": "missing",
"authModes": [],
"requires": [],
"forbidden": [],
"supportsMcp": false,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": null,
"outputSchemaRef": null,
"dataRegion": null,
"contractUpdatedAt": null,
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"MCP"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "GITHUB_MCP",
"generatedAt": "2026-04-17T03:22:32.007Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "MCP",
"type": "protocol",
"support": "unknown",
"confidenceSource": "profile",
"notes": "Listed on profile"
},
{
"key": "ai",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "agents",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "security",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "secrets",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "mcp",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "model-context-protocol",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "api-proxy",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "cli",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
}
],
"flattenedTokens": "protocol:MCP|unknown|profile capability:ai|supported|profile capability:agents|supported|profile capability:security|supported|profile capability:secrets|supported|profile capability:mcp|supported|profile capability:model-context-protocol|supported|profile capability:api-proxy|supported|profile capability:cli|supported|profile"
}Facts JSON
[
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Janee",
"href": "https://janee.io",
"sourceUrl": "https://janee.io",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-02-25T03:04:11.905Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "MCP",
"href": "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-02-25T03:04:11.905Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "20 GitHub stars",
"href": "https://github.com/rsdouglas/janee",
"sourceUrl": "https://github.com/rsdouglas/janee",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-02-25T03:04:11.905Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/mcp-rsdouglas-janee/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[]
Sponsored
Ads related to @true-and-useful/janee and adjacent AI workflows.