ReferenceProviders and templates
Providers and templates#
Which providers can an agent name, and what does each allow, hold and refuse?
On this page
A template is what an agent names with --provider when it asks for a credential: it fixes where the key may go, how it is sent and which requests need a human's approval, and the human sees its destination marked as verified. An OAuth provider is what mehen connect names. This page is generated from the same catalogue mehen templates --json prints (and vault_templates returns), so it matches the mehen it was built with; mehen templates <id> prints one entry in full.
Templates fail closed. Reads are allowed, except a read that hands back another secret; every other method needs a human's approval unless the template allows a narrow everyday write by name (model calls, searches, read-only queries); sends and money movements are pinned to an approval; and the worst routes (anything that sends data elsewhere for good, gives someone else access, or mints or revokes tokens) are refused outright. For each entry below, the three policy lines say what goes through without a human, what needs approval, and what is refused; "anything else" sits on the line of the policy's default.
A credential without a template needs a proposed binding (--host, and optionally --path), and every request it makes needs an approval until a human allows reads. Prefer a template when one exists.
AI models#
openai#
OpenAI API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.openai.com
- Sent as:
Authorization: Bearer {key} - Without a human: reads; model calls and the data they use
- Needs approval: anything else
- Refused: admin API
- Where the human gets it: platform.openai.com
- Ask for it:
mehen request api-key --name <slug> --provider openai --reason "<why>"
anthropic#
Anthropic API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.anthropic.com
- Sent as:
x-api-key: {key} - Without a human: reads; model calls and the data they use
- Needs approval: anything else
- Refused: admin API
- Where the human gets it: console.anthropic.com
- Ask for it:
mehen request api-key --name <slug> --provider anthropic --reason "<why>"
google-gemini#
Google Gemini API key
- Kind:
api-key; ceilingplaceholder - Goes to: generativelanguage.googleapis.com /v1beta/, /v1/, /upload/v1beta/**
- Sent as:
x-goog-api-key: {key} - Without a human: reads; model calls and the data they use
- Needs approval: anything else
- Refused: shares a tuned model or a corpus with someone else
- Where the human gets it: aistudio.google.com
- Ask for it:
mehen request api-key --name <slug> --provider google-gemini --reason "<why>"
mistral#
Mistral API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.mistral.ai /v1/, /v2/
- Sent as:
Authorization: Bearer {key} - Without a human: reads; model calls and the data they use
- Needs approval: anything else
- Refused: service accounts and their roles; shares a library with someone else
- Where the human gets it: console.mistral.ai
- Ask for it:
mehen request api-key --name <slug> --provider mistral --reason "<why>"
groq#
Groq API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.groq.com /openai/v1/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads; model calls and the data they use
- Needs approval: anything else
- Refused: nothing
- Where the human gets it: console.groq.com
- Ask for it:
mehen request api-key --name <slug> --provider groq --reason "<why>"
openrouter#
OpenRouter API key
- Kind:
api-key; ceilingplaceholder - Goes to: openrouter.ai /api/v1/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads; model calls and the data they use
- Needs approval: buys credits or changes a budget; anything else
- Refused: mints or revokes API keys; provider keys; observability destinations copy every request elsewhere; members and directory sync give someone else access; stored secrets
- Where the human gets it: openrouter.ai
- Ask for it:
mehen request api-key --name <slug> --provider openrouter --reason "<why>"
together#
Together AI API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.together.xyz /v1/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads; model calls and the data they use
- Needs approval: anything else
- Refused: nothing
- Where the human gets it: api.together.ai
- Ask for it:
mehen request api-key --name <slug> --provider together --reason "<why>"
ollama-cloud#
Ollama Cloud API key
- Kind:
api-key; ceilingplaceholder - Goes to: ollama.com /api/, /v1/
- Sent as:
Authorization: Bearer {key} - Without a human: reads; model calls and the data they use; web searches
- Needs approval: anything else
- Refused: nothing
- Where the human gets it: ollama.com
- Ask for it:
mehen request api-key --name <slug> --provider ollama-cloud --reason "<why>"
Code and deploy#
github-pat#
GitHub personal access token
- Kind:
api-key; ceilingplaceholder - Goes to: api.github.com
- Sent as:
Authorization: Bearer {key} - Without a human: reads; read-only GraphQL queries
- Needs approval: GraphQL requests that are not plainly a query; anything else
- Refused: SSH, signing and deploy keys; webhooks; collaborators, invitations and memberships give someone else access; self-hosted runners and their tokens receive jobs and their secrets; transfers the repository away; account email addresses reset the password; OAuth tokens and grants
- Where the human gets it: github.com
- Ask for it:
mehen request api-key --name <slug> --provider github-pat --reason "<why>"
snyk#
Snyk API token
- Kind:
api-key; ceilingplaceholder - Goes to: api.snyk.io, api.us.snyk.io, api.eu.snyk.io, api.au.snyk.io /rest/, /v1/
- Sent as:
Authorization: token {key} - Without a human: reads; tests dependencies for known issues
- Needs approval: anything else
- Refused: invitations and memberships give someone else access; service accounts and their secrets; Snyk Apps and their client secrets; webhooks
- Where the human gets it: app.snyk.io
- Ask for it:
mehen request api-key --name <slug> --provider snyk --reason "<why>"
vercel#
Vercel access token
- Kind:
api-key; ceilingplaceholder - Goes to: api.vercel.com
- Sent as:
Authorization: Bearer {key} - Without a human: reads
- Needs approval: environment variables, whose values are secrets; anything else
- Refused: mints or revokes access tokens; members, invitations and access groups give someone else access; webhooks; drains send logs and traces elsewhere; transfers a project to another account; deletes a project, a team or the account; buys credits
- Where the human gets it: vercel.com
- Ask for it:
mehen request api-key --name <slug> --provider vercel --reason "<why>"
npm#
npm access token
- Kind:
api-key; ceilingplaceholder - Goes to: registry.npmjs.org
- Sent as:
Authorization: Bearer {key} - Without a human: reads
- Needs approval: publishes, deprecates or unpublishes a package; anything else
- Refused: mints or revokes tokens; signs in, adds a user or changes account settings; access, owners, teams, organisation members and trusted publishers decide who may publish; hooks
- Where the human gets it: docs.npmjs.com
- Ask for it:
mehen request api-key --name <slug> --provider npm --reason "<why>"
Productivity and chat#
linear#
Linear API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.linear.app POST /graphql
- Sent as:
Authorization: {key} - Without a human: read-only GraphQL queries
- Needs approval: GraphQL requests that are not plainly a query; anything else
- Refused: nothing
- Where the human gets it: linear.app
- Ask for it:
mehen request api-key --name <slug> --provider linear --reason "<why>"
slack-bot#
Slack bot token
- Kind:
api-key; ceilingplaceholder - Goes to: slack.com /api/**
- Sent as:
Authorization: Bearer {key} - Without a human: read methods; adds an emoji reaction
- Needs approval: posts, shares or invites as the bot; anything else
- Refused: uploads bypass the approval card; ask the human to upload
- Where the human gets it: api.slack.com
- Ask for it:
mehen request api-key --name <slug> --provider slack-bot --reason "<why>"
notion#
Notion integration token
- Kind:
api-key; ceilingplaceholder - Goes to: api.notion.com /v1/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads; searches and queries
- Needs approval: anything else
- Refused: OAuth tokens
- Where the human gets it: www.notion.so
- Ask for it:
mehen request api-key --name <slug> --provider notion --reason "<why>"
gitbook#
GitBook API token
- Kind:
api-key; ceilingplaceholder - Goes to: api.gitbook.com /v1/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads; searches and questions
- Needs approval: anything else
- Refused: members, invitations and permissions give someone else access; share links open a site to anyone with the link; mints integration tokens; transfers a collection away; deletes a space
- Where the human gets it: app.gitbook.com
- Ask for it:
mehen request api-key --name <slug> --provider gitbook --reason "<why>"
fathom#
Fathom API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.fathom.ai /external/v1/**
- Sent as:
X-Api-Key: {key} - Without a human: reads
- Needs approval: a summary or transcript, which can be sent on to any URL; read it from the meetings list; anything else
- Refused: webhooks send every meeting elsewhere
- Where the human gets it: fathom.video
- Ask for it:
mehen request api-key --name <slug> --provider fathom --reason "<why>"
Observability#
sentry#
Sentry auth token
- Kind:
api-key; ceilingplaceholder - Goes to: sentry.io, us.sentry.io, de.sentry.io /api/0/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads
- Needs approval: anything else
- Refused: members and invitations give someone else access; service hooks send events elsewhere; data forwarding sends every event elsewhere; mints or revokes auth tokens; custom integrations receive webhooks and tokens; deletes an organisation or a project
- Where the human gets it: sentry.io
- Ask for it:
mehen request api-key --name <slug> --provider sentry --reason "<why>"
posthog#
PostHog personal API key
- Kind:
api-key; ceilingplaceholder - Goes to: us.posthog.com, eu.posthog.com /api/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads; HogQL and other queries
- Needs approval: anything else
- Refused: invitations, members and roles give someone else access; mints or revokes personal API keys; destinations and batch exports send events elsewhere; deletes a project or an organisation
- Where the human gets it: us.posthog.com
- Ask for it:
mehen request api-key --name <slug> --provider posthog --reason "<why>"
betterstack-uptime#
Better Stack Uptime API token
- Kind:
api-key; ceilingplaceholder - Goes to: uptime.betterstack.com /api/v2/, /api/v3/
- Sent as:
Authorization: Bearer {key} - Without a human: reads
- Needs approval: opens an incident, which pages whoever is on call; posts on a public status page; heartbeats carry their URL, which lets anyone holding it report a job as healthy or failed; anything else
- Refused: nothing
- Where the human gets it: betterstack.com
- Ask for it:
mehen request api-key --name <slug> --provider betterstack-uptime --reason "<why>"
Infrastructure and data#
cloudflare-api-token#
Cloudflare API token
- Kind:
api-key; ceilingplaceholder - Goes to: api.cloudflare.com /client/v4/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads; GraphQL Analytics queries
- Needs approval: deletes; anything else
- Refused: minting tokens
- Where the human gets it: dash.cloudflare.com
- Ask for it:
mehen request api-key --name <slug> --provider cloudflare-api-token --reason "<why>"
hetzner-cloud#
Hetzner Cloud API token
- Kind:
api-key; ceilingplaceholder - Goes to: api.hetzner.cloud /v1/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads
- Needs approval: creates or resizes something that is billed; hands out root access to a server; anything else
- Refused: nothing
- Where the human gets it: console.hetzner.cloud
- Ask for it:
mehen request api-key --name <slug> --provider hetzner-cloud --reason "<why>"
scaleway#
Scaleway API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.scaleway.com
- Sent as:
X-Auth-Token: {key} - Without a human: reads
- Needs approval: reads a stored secret's value; creates something that is billed; anything else
- Refused: IAM: API keys, users, applications, groups, policies and SSH keys; deletes a project
- Where the human gets it: console.scaleway.com
- Ask for it:
mehen request api-key --name <slug> --provider scaleway --reason "<why>"
neon#
Neon API key
- Kind:
api-key; ceilingplaceholder - Goes to: console.neon.tech /api/v2/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads; queries branch logs
- Needs approval: a database password, connection string or other secret; anything else
- Refused: mints or revokes API keys; access, members and invitations give someone else access; transfers projects to another account; lets an outside identity provider sign in to the database; billing and spending limits; deletes a project and every branch in it
- Where the human gets it: console.neon.tech
- Ask for it:
mehen request api-key --name <slug> --provider neon --reason "<why>"
Payments, CRM and email#
stripe#
Stripe secret key
- Kind:
api-key; ceilingplaceholder - Goes to: api.stripe.com
- Sent as:
Authorization: Bearer {key} - Without a human: reads; catalogue records
- Needs approval: moves money; anything else
- Refused: webhooks
- Where the human gets it: dashboard.stripe.com
- Ask for it:
mehen request api-key --name <slug> --provider stripe --reason "<why>"
hubspot-private-app#
HubSpot private app token
- Kind:
api-key; ceilingplaceholder - Goes to: api.hubapi.com
- Sent as:
Authorization: Bearer {key} - Without a human: reads; CRM searches and batch reads
- Needs approval: sends email or a message, or enrols a contact in a sequence; anything else
- Refused: adds, changes or removes users; webhooks; mints SMTP tokens; OAuth tokens
- Where the human gets it: developers.hubspot.com
- Ask for it:
mehen request api-key --name <slug> --provider hubspot-private-app --reason "<why>"
intercom#
Intercom access token
- Kind:
api-key; ceilingplaceholder - Goes to: api.intercom.io, api.eu.intercom.io, api.au.intercom.io
- Sent as:
Authorization: Bearer {key} - Without a human: reads; searches
- Needs approval: messages a customer; anything else
- Refused: nothing
- Where the human gets it: app.intercom.com
- Ask for it:
mehen request api-key --name <slug> --provider intercom --reason "<why>"
resend#
Resend API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.resend.com
- Sent as:
Authorization: Bearer {key} - Without a human: reads
- Needs approval: sends email; anything else
- Refused: mints or revokes API keys; webhooks; OAuth grants
- Where the human gets it: resend.com
- Ask for it:
mehen request api-key --name <slug> --provider resend --reason "<why>"
postmark-server#
Postmark server token
- Kind:
api-key; ceilingplaceholder - Goes to: api.postmarkapp.com
- Sent as:
X-Postmark-Server-Token: {key} - Without a human: reads
- Needs approval: the server's details, which include its API tokens; sends email; anything else
- Refused: webhooks; server settings, including where inbound mail is posted
- Where the human gets it: account.postmarkapp.com
- Ask for it:
mehen request api-key --name <slug> --provider postmark-server --reason "<why>"
loops#
Loops API key
- Kind:
api-key; ceilingplaceholder - Goes to: app.loops.so /api/v1/**
- Sent as:
Authorization: Bearer {key} - Without a human: reads
- Needs approval: sends email, or an event that can send email; anything else
- Refused: nothing
- Where the human gets it: app.loops.so
- Ask for it:
mehen request api-key --name <slug> --provider loops --reason "<why>"
Search, web and media#
brave-search#
Brave Search API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.search.brave.com /res/v1/**
- Sent as:
X-Subscription-Token: {key} - Without a human: searches
- Needs approval: anything else
- Refused: nothing
- Where the human gets it: api-dashboard.search.brave.com
- Ask for it:
mehen request api-key --name <slug> --provider brave-search --reason "<why>"
serpapi#
SerpApi API key
- Kind:
api-key; ceilingplaceholder - Goes to: serpapi.com /search, /search.json, /searches/**, /account, /account.json, /locations.json
- Sent as:
query api_key={key} - Without a human: searches
- Needs approval: anything else
- Refused: nothing
- Where the human gets it: serpapi.com
- Ask for it:
mehen request api-key --name <slug> --provider serpapi --reason "<why>"
semrush#
Semrush API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.semrush.com
- Sent as:
query key={key} - Without a human: reports, which spend API units
- Needs approval: anything else
- Refused: nothing
- Where the human gets it: www.semrush.com
- Ask for it:
mehen request api-key --name <slug> --provider semrush --reason "<why>"
firecrawl#
Firecrawl API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.firecrawl.dev /v1/, /v2/
- Sent as:
Authorization: Bearer {key} - Without a human: reads; scrapes, searches and maps public pages
- Needs approval: anything else
- Refused: nothing
- Where the human gets it: www.firecrawl.dev
- Ask for it:
mehen request api-key --name <slug> --provider firecrawl --reason "<why>"
browserbase#
Browserbase API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.browserbase.com /v1/**
- Sent as:
X-BB-API-Key: {key} - Without a human: reads; starts a browser session, fetches pages and searches
- Needs approval: anything else
- Refused: nothing
- Where the human gets it: www.browserbase.com
- Ask for it:
mehen request api-key --name <slug> --provider browserbase --reason "<why>"
elevenlabs#
ElevenLabs API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.elevenlabs.io
- Sent as:
xi-api-key: {key} - Without a human: reads; speech, transcription and sound
- Needs approval: anything else
- Refused: service accounts, API keys and their settings; invitations, members, groups, sign-in connections and sharing give someone else access; webhooks
- Where the human gets it: elevenlabs.io
- Ask for it:
mehen request api-key --name <slug> --provider elevenlabs --reason "<why>"
heygen#
HeyGen API key
- Kind:
api-key; ceilingplaceholder - Goes to: api.heygen.com
- Sent as:
X-Api-Key: {key} - Without a human: reads; text to speech
- Needs approval: renders a video, which spends credits; creates an avatar or clones a voice; anything else
- Refused: webhooks
- Where the human gets it: app.heygen.com
- Ask for it:
mehen request api-key --name <slug> --provider heygen --reason "<why>"
OAuth clients#
google-oauth-client#
Google OAuth client
- Kind:
oauth-client; ceilingrelay - Goes to: oauth2.googleapis.com (token only)
- Without a human: anything
- Needs approval: nothing
- Refused: nothing
- Where the human gets it: console.cloud.google.com
- Ask for it:
mehen request oauth-client --name <slug> --provider google-oauth-client --reason "<why>"
github-oauth-client#
GitHub OAuth app
- Kind:
oauth-client; ceilingrelay - Goes to: github.com (token only)
- Without a human: anything
- Needs approval: nothing
- Refused: nothing
- Where the human gets it: github.com
- Ask for it:
mehen request oauth-client --name <slug> --provider github-oauth-client --reason "<why>"
microsoft-oauth-client#
Microsoft Entra app registration
- Kind:
oauth-client; ceilingrelay - Goes to: login.microsoftonline.com (token only)
- Without a human: anything
- Needs approval: nothing
- Refused: nothing
- Where the human gets it: entra.microsoft.com
- Ask for it:
mehen request oauth-client --name <slug> --provider microsoft-oauth-client --reason "<why>"
OAuth providers#
What mehen connect may name. Each needs an OAuth client in the workspace, made from its client template; the client must list the redirect URI https://app.mehen.dev/oauth/callback.
google-gmail#
Gmail
- Client template:
google-oauth-client - Default scopes:
gmail.modify - Allowed scopes:
gmail.readonly,gmail.metadata,gmail.labels,gmail.compose,gmail.send,gmail.modify,gmail.insert - Goes to: gmail.googleapis.com /gmail/v1/, /upload/gmail/v1/
- Without a human: reads; creates a draft; changes labels
- Needs approval: sends email as you; puts a message with any sender into the mailbox; permanent deletes; anything else
- Refused: forwarding sends every message elsewhere; delegates give someone else the mailbox; filters can forward or hide mail; send-as identities; mailbox settings, POP and IMAP included; push notifications to another project; sending a saved draft by id cannot show you what is sent; send the whole message with messages/send and raw instead
- Where the human gets it: developers.google.com
- Connect it:
mehen connect google-gmail --name <slug> --reason "<why>"
google-calendar#
Google Calendar
- Client template:
google-oauth-client - Default scopes:
calendar.events - Allowed scopes:
calendar,calendar.readonly,calendar.events,calendar.events.readonly,calendar.freebusy - Goes to: www.googleapis.com /calendar/v3/**
- Without a human: reads; free/busy query
- Needs approval: shares a calendar; deletes a calendar; anything else
- Refused: push notifications to an outside address
- Where the human gets it: developers.google.com
- Connect it:
mehen connect google-calendar --name <slug> --reason "<why>"
google-drive#
Google Drive
- Client template:
google-oauth-client - Default scopes:
drive.file - Allowed scopes:
drive,drive.file,drive.readonly,drive.metadata.readonly,drive.appdata - Goes to: www.googleapis.com /drive/v3/, /upload/drive/v3/
- Without a human: reads
- Needs approval: shares a file; permanent deletes; empties the trash; anything else
- Refused: push notifications to an outside address
- Where the human gets it: developers.google.com
- Connect it:
mehen connect google-drive --name <slug> --reason "<why>"
github-oauth#
GitHub
- Client template:
github-oauth-client - Default scopes:
read:user - Allowed scopes:
repo,public_repo,read:user,user:email,read:org,gist,notifications,workflow,read:project,project - Goes to: api.github.com
- Without a human: reads; read-only GraphQL queries
- Needs approval: GraphQL requests that are not plainly a query; anything else
- Refused: SSH, signing and deploy keys; webhooks; collaborators, invitations and memberships give someone else access; self-hosted runners and their tokens receive jobs and their secrets; transfers the repository away; account email addresses reset the password; OAuth tokens and grants
- Where the human gets it: docs.github.com
- Connect it:
mehen connect github-oauth --name <slug> --reason "<why>"
microsoft-graph#
Microsoft 365 (Graph)
- Client template:
microsoft-oauth-client - Default scopes:
User.Read - Allowed scopes:
User.Read,Mail.Read,Mail.ReadWrite,Mail.Send,Calendars.Read,Calendars.ReadWrite,Contacts.Read,Contacts.ReadWrite,Files.Read,Files.ReadWrite,Tasks.ReadWrite - Goes to: graph.microsoft.com /v1.0/, /beta/
- Without a human: reads
- Needs approval: sends email as you; shares a file; anything else
- Refused: a batch carries requests the vault cannot check one by one; send the requests one by one; mailbox rules can forward or hide mail; forwarding and automatic replies; app registrations and grants; change notifications to an outside address; sending, replying to or forwarding a stored message by id cannot show you what is sent; send the whole message with sendMail instead
- Where the human gets it: learn.microsoft.com
- Connect it:
mehen connect microsoft-graph --name <slug> --reason "<why>"