Search / io.github.shatch/banjo
Banjo
L0· runs locallySelf-hosted AI assistant that places real phone calls for you: bookings, reservations, errands.
v0.1.13 · active · repository · website · descriptor JSON · versions
Search / io.github.shatch/banjo
L0· runs locallySelf-hosted AI assistant that places real phone calls for you: bookings, reservations, errands.
v0.1.13 · active · repository · website · descriptor JSON · versions
{
"mcpServers": {
"banjo": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"MCP_API_KEY",
"-e",
"ASSISTANT_PRINCIPAL_NAME",
"-e",
"PUBLIC_HOSTNAME",
"-e",
"VOICE_AI_PROVIDER",
"-e",
"OPENAI_API_KEY",
"-e",
"TWILIO_ACCOUNT_SID",
"-e",
"TWILIO_AUTH_TOKEN",
"-e",
"TWILIO_PHONE_NUMBER",
"-e",
"NOTIFICATION_CHANNEL",
"ghcr.io/shatch/banjo:0.1.13"
],
"env": {
"DATABASE_URL": "${DATABASE_URL}",
"MCP_API_KEY": "${MCP_API_KEY}",
"ASSISTANT_PRINCIPAL_NAME": "${ASSISTANT_PRINCIPAL_NAME}",
"PUBLIC_HOSTNAME": "${PUBLIC_HOSTNAME}",
"VOICE_AI_PROVIDER": "openai",
"OPENAI_API_KEY": "${OPENAI_API_KEY}",
"TWILIO_ACCOUNT_SID": "${TWILIO_ACCOUNT_SID}",
"TWILIO_AUTH_TOKEN": "${TWILIO_AUTH_TOKEN}",
"TWILIO_PHONE_NUMBER": "${TWILIO_PHONE_NUMBER}",
"NOTIFICATION_CHANNEL": "twilio_sms"
}
}
}
}claude mcp add banjo -e "DATABASE_URL=${DATABASE_URL}" -e "MCP_API_KEY=${MCP_API_KEY}" -e "ASSISTANT_PRINCIPAL_NAME=${ASSISTANT_PRINCIPAL_NAME}" -e "PUBLIC_HOSTNAME=${PUBLIC_HOSTNAME}" -e "VOICE_AI_PROVIDER=openai" -e "OPENAI_API_KEY=${OPENAI_API_KEY}" -e "TWILIO_ACCOUNT_SID=${TWILIO_ACCOUNT_SID}" -e "TWILIO_AUTH_TOKEN=${TWILIO_AUTH_TOKEN}" -e "TWILIO_PHONE_NUMBER=${TWILIO_PHONE_NUMBER}" -e "NOTIFICATION_CHANNEL=twilio_sms" -- docker run -i --rm -e DATABASE_URL -e MCP_API_KEY -e ASSISTANT_PRINCIPAL_NAME -e PUBLIC_HOSTNAME -e VOICE_AI_PROVIDER -e OPENAI_API_KEY -e TWILIO_ACCOUNT_SID -e TWILIO_AUTH_TOKEN -e TWILIO_PHONE_NUMBER -e NOTIFICATION_CHANNEL ghcr.io/shatch/banjo:0.1.13[mcp_servers.banjo]
command = "docker"
args = ["run", "-i", "--rm", "-e", "DATABASE_URL", "-e", "MCP_API_KEY", "-e", "ASSISTANT_PRINCIPAL_NAME", "-e", "PUBLIC_HOSTNAME", "-e", "VOICE_AI_PROVIDER", "-e", "OPENAI_API_KEY", "-e", "TWILIO_ACCOUNT_SID", "-e", "TWILIO_AUTH_TOKEN", "-e", "TWILIO_PHONE_NUMBER", "-e", "NOTIFICATION_CHANNEL", "ghcr.io/shatch/banjo:0.1.13"]
env = { "DATABASE_URL" = "${DATABASE_URL}", "MCP_API_KEY" = "${MCP_API_KEY}", "ASSISTANT_PRINCIPAL_NAME" = "${ASSISTANT_PRINCIPAL_NAME}", "PUBLIC_HOSTNAME" = "${PUBLIC_HOSTNAME}", "VOICE_AI_PROVIDER" = "openai", "OPENAI_API_KEY" = "${OPENAI_API_KEY}", "TWILIO_ACCOUNT_SID" = "${TWILIO_ACCOUNT_SID}", "TWILIO_AUTH_TOKEN" = "${TWILIO_AUTH_TOKEN}", "TWILIO_PHONE_NUMBER" = "${TWILIO_PHONE_NUMBER}", "NOTIFICATION_CHANNEL" = "twilio_sms" }
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"banjo": {
"type": "local",
"command": [
"docker",
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"MCP_API_KEY",
"-e",
"ASSISTANT_PRINCIPAL_NAME",
"-e",
"PUBLIC_HOSTNAME",
"-e",
"VOICE_AI_PROVIDER",
"-e",
"OPENAI_API_KEY",
"-e",
"TWILIO_ACCOUNT_SID",
"-e",
"TWILIO_AUTH_TOKEN",
"-e",
"TWILIO_PHONE_NUMBER",
"-e",
"NOTIFICATION_CHANNEL",
"ghcr.io/shatch/banjo:0.1.13"
],
"enabled": true,
"environment": {
"DATABASE_URL": "{env:DATABASE_URL}",
"MCP_API_KEY": "{env:MCP_API_KEY}",
"ASSISTANT_PRINCIPAL_NAME": "{env:ASSISTANT_PRINCIPAL_NAME}",
"PUBLIC_HOSTNAME": "{env:PUBLIC_HOSTNAME}",
"VOICE_AI_PROVIDER": "openai",
"OPENAI_API_KEY": "{env:OPENAI_API_KEY}",
"TWILIO_ACCOUNT_SID": "{env:TWILIO_ACCOUNT_SID}",
"TWILIO_AUTH_TOKEN": "{env:TWILIO_AUTH_TOKEN}",
"TWILIO_PHONE_NUMBER": "{env:TWILIO_PHONE_NUMBER}",
"NOTIFICATION_CHANNEL": "twilio_sms"
}
}
}
}{
"mcpServers": {
"banjo": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"MCP_API_KEY",
"-e",
"ASSISTANT_PRINCIPAL_NAME",
"-e",
"PUBLIC_HOSTNAME",
"-e",
"VOICE_AI_PROVIDER",
"-e",
"OPENAI_API_KEY",
"-e",
"TWILIO_ACCOUNT_SID",
"-e",
"TWILIO_AUTH_TOKEN",
"-e",
"TWILIO_PHONE_NUMBER",
"-e",
"NOTIFICATION_CHANNEL",
"ghcr.io/shatch/banjo:0.1.13"
],
"env": {
"DATABASE_URL": "${DATABASE_URL}",
"MCP_API_KEY": "${MCP_API_KEY}",
"ASSISTANT_PRINCIPAL_NAME": "${ASSISTANT_PRINCIPAL_NAME}",
"PUBLIC_HOSTNAME": "${PUBLIC_HOSTNAME}",
"VOICE_AI_PROVIDER": "openai",
"OPENAI_API_KEY": "${OPENAI_API_KEY}",
"TWILIO_ACCOUNT_SID": "${TWILIO_ACCOUNT_SID}",
"TWILIO_AUTH_TOKEN": "${TWILIO_AUTH_TOKEN}",
"TWILIO_PHONE_NUMBER": "${TWILIO_PHONE_NUMBER}",
"NOTIFICATION_CHANNEL": "twilio_sms"
}
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=banjo&config=eyJjb21tYW5kIjoiZG9ja2VyIiwiYXJncyI6WyJydW4iLCItaSIsIi0tcm0iLCItZSIsIkRBVEFCQVNFX1VSTCIsIi1lIiwiTUNQX0FQSV9LRVkiLCItZSIsIkFTU0lTVEFOVF9QUklOQ0lQQUxfTkFNRSIsIi1lIiwiUFVCTElDX0hPU1ROQU1FIiwiLWUiLCJWT0lDRV9BSV9QUk9WSURFUiIsIi1lIiwiT1BFTkFJX0FQSV9LRVkiLCItZSIsIlRXSUxJT19BQ0NPVU5UX1NJRCIsIi1lIiwiVFdJTElPX0FVVEhfVE9LRU4iLCItZSIsIlRXSUxJT19QSE9ORV9OVU1CRVIiLCItZSIsIk5PVElGSUNBVElPTl9DSEFOTkVMIiwiZ2hjci5pby9zaGF0Y2gvYmFuam86MC4xLjEzIl0sImVudiI6eyJEQVRBQkFTRV9VUkwiOiIke0RBVEFCQVNFX1VSTH0iLCJNQ1BfQVBJX0tFWSI6IiR7TUNQX0FQSV9LRVl9IiwiQVNTSVNUQU5UX1BSSU5DSVBBTF9OQU1FIjoiJHtBU1NJU1RBTlRfUFJJTkNJUEFMX05BTUV9IiwiUFVCTElDX0hPU1ROQU1FIjoiJHtQVUJMSUNfSE9TVE5BTUV9IiwiVk9JQ0VfQUlfUFJPVklERVIiOiJvcGVuYWkiLCJPUEVOQUlfQVBJX0tFWSI6IiR7T1BFTkFJX0FQSV9LRVl9IiwiVFdJTElPX0FDQ09VTlRfU0lEIjoiJHtUV0lMSU9fQUNDT1VOVF9TSUR9IiwiVFdJTElPX0FVVEhfVE9LRU4iOiIke1RXSUxJT19BVVRIX1RPS0VOfSIsIlRXSUxJT19QSE9ORV9OVU1CRVIiOiIke1RXSUxJT19QSE9ORV9OVU1CRVJ9IiwiTk9USUZJQ0FUSU9OX0NIQU5ORUwiOiJ0d2lsaW9fc21zIn19"
}{
"servers": {
"banjo": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"MCP_API_KEY",
"-e",
"ASSISTANT_PRINCIPAL_NAME",
"-e",
"PUBLIC_HOSTNAME",
"-e",
"VOICE_AI_PROVIDER",
"-e",
"OPENAI_API_KEY",
"-e",
"TWILIO_ACCOUNT_SID",
"-e",
"TWILIO_AUTH_TOKEN",
"-e",
"TWILIO_PHONE_NUMBER",
"-e",
"NOTIFICATION_CHANNEL",
"ghcr.io/shatch/banjo:0.1.13"
],
"env": {
"DATABASE_URL": "${DATABASE_URL}",
"MCP_API_KEY": "${MCP_API_KEY}",
"ASSISTANT_PRINCIPAL_NAME": "${ASSISTANT_PRINCIPAL_NAME}",
"PUBLIC_HOSTNAME": "${PUBLIC_HOSTNAME}",
"VOICE_AI_PROVIDER": "openai",
"OPENAI_API_KEY": "${OPENAI_API_KEY}",
"TWILIO_ACCOUNT_SID": "${TWILIO_ACCOUNT_SID}",
"TWILIO_AUTH_TOKEN": "${TWILIO_AUTH_TOKEN}",
"TWILIO_PHONE_NUMBER": "${TWILIO_PHONE_NUMBER}",
"NOTIFICATION_CHANNEL": "twilio_sms"
}
}
}
}{
"mcpServers": {
"banjo": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URL",
"-e",
"MCP_API_KEY",
"-e",
"ASSISTANT_PRINCIPAL_NAME",
"-e",
"PUBLIC_HOSTNAME",
"-e",
"VOICE_AI_PROVIDER",
"-e",
"OPENAI_API_KEY",
"-e",
"TWILIO_ACCOUNT_SID",
"-e",
"TWILIO_AUTH_TOKEN",
"-e",
"TWILIO_PHONE_NUMBER",
"-e",
"NOTIFICATION_CHANNEL",
"ghcr.io/shatch/banjo:0.1.13"
],
"env": {
"DATABASE_URL": "${DATABASE_URL}",
"MCP_API_KEY": "${MCP_API_KEY}",
"ASSISTANT_PRINCIPAL_NAME": "${ASSISTANT_PRINCIPAL_NAME}",
"PUBLIC_HOSTNAME": "${PUBLIC_HOSTNAME}",
"VOICE_AI_PROVIDER": "openai",
"OPENAI_API_KEY": "${OPENAI_API_KEY}",
"TWILIO_ACCOUNT_SID": "${TWILIO_ACCOUNT_SID}",
"TWILIO_AUTH_TOKEN": "${TWILIO_AUTH_TOKEN}",
"TWILIO_PHONE_NUMBER": "${TWILIO_PHONE_NUMBER}",
"NOTIFICATION_CHANNEL": "twilio_sms"
}
}
}
}extensions:
"banjo":
enabled: true
name: "banjo"
type: stdio
cmd: "docker"
args:
- "run"
- "-i"
- "--rm"
- "-e"
- "DATABASE_URL"
- "-e"
- "MCP_API_KEY"
- "-e"
- "ASSISTANT_PRINCIPAL_NAME"
- "-e"
- "PUBLIC_HOSTNAME"
- "-e"
- "VOICE_AI_PROVIDER"
- "-e"
- "OPENAI_API_KEY"
- "-e"
- "TWILIO_ACCOUNT_SID"
- "-e"
- "TWILIO_AUTH_TOKEN"
- "-e"
- "TWILIO_PHONE_NUMBER"
- "-e"
- "NOTIFICATION_CHANNEL"
- "ghcr.io/shatch/banjo:0.1.13"
envs:
"DATABASE_URL": "${DATABASE_URL}"
"MCP_API_KEY": "${MCP_API_KEY}"
"ASSISTANT_PRINCIPAL_NAME": "${ASSISTANT_PRINCIPAL_NAME}"
"PUBLIC_HOSTNAME": "${PUBLIC_HOSTNAME}"
"VOICE_AI_PROVIDER": "openai"
"OPENAI_API_KEY": "${OPENAI_API_KEY}"
"TWILIO_ACCOUNT_SID": "${TWILIO_ACCOUNT_SID}"
"TWILIO_AUTH_TOKEN": "${TWILIO_AUTH_TOKEN}"
"TWILIO_PHONE_NUMBER": "${TWILIO_PHONE_NUMBER}"
"NOTIFICATION_CHANNEL": "twilio_sms"
timeout: 300
Placeholders to fill from your own secret store: ${DATABASE_URL}, ${MCP_API_KEY}, ${OPENAI_API_KEY}, ${TWILIO_AUTH_TOKEN}. The registry never accepts secret values.
This is a local package: the command runs on your machine.
Not scored: fewer than three checks apply, usually because no remote answered a credential-free probe or the server is a local package.
protocol.modern, protocol.stateless, protocol.transport, protocol.list_ttlno remote answered a protocol handshake (not probed yet, unreachable, or local-only)auth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptions, tools.description_length, tools.schemas, tools.annotations, tools.directory_hints, tools.token_cost, tools.api_dumptool list unknown (behind auth, not probed, or empty)stability.changes, stability.rug_pulltool list unknowndeps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI packageNo tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +namespace-matches-repo +website ~liveness-unmeasured +updated-2d-ago -unpinned-packages(1)
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
| package | registry | version | runtime | secrets |
|---|---|---|---|---|
ghcr.io/shatch/banjo:0.1.13 | oci | unpinned | – | DATABASE_URL, MCP_API_KEY, OPENAI_API_KEY, TWILIO_AUTH_TOKEN |
No tools observed. Local packages are never executed by the registry.
Schemas: list_tools.
{
"name": "io.github.shatch/banjo",
"title": "Banjo",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"version": "0.1.13",
"packages": [
{
"transport": {
"url": "http://localhost:3000/mcp",
"type": "streamable-http",
"headers": [
{
"name": "Authorization",
"isSecret": true,
"isRequired": true,
"description": "Bearer token: \"Bearer \" followed by the MCP_API_KEY you gave the server."
}
]
},
"identifier": "ghcr.io/shatch/banjo:0.1.13",
"registryType": "oci",
"environmentVariables": [
{
"name": "DATABASE_URL",
"isSecret": true,
"isRequired": true,
"description": "Postgres connection URL. Migrations run on boot."
},
{
"name": "MCP_API_KEY",
"isSecret": true,
"isRequired": true,
"description": "Bearer token MCP clients must send (at least 32 characters, e.g. openssl rand -hex 32)."
},
{
"name": "ASSISTANT_PRINCIPAL_NAME",
"isRequired": true,
"description": "The name of the person Banjo calls on behalf of."
},
{
"name": "PUBLIC_HOSTNAME",
"isRequired": true,
"description": "Public hostname Twilio reaches this server on (no scheme), e.g. a tunnel or reverse proxy."
},
{
"name": "VOICE_AI_PROVIDER",
"choices": [
"openai",
"openai-live",
"gemini",
"elevenlabs"
],
"default": "openai",
"isRequired": true,
"description": "Voice AI vendor. openai is the one carrying live traffic."
},
{
"name": "OPENAI_API_KEY",
"isSecret": true,
"description": "OpenAI API key, for VOICE_AI_PROVIDER=openai or openai-live."
},
{
"name": "TWILIO_ACCOUNT_SID",
"isRequired": true,
"description": "Twilio account SID."
},
{
"name": "TWILIO_AUTH_TOKEN",
"isSecret": true,
"isRequired": true,
"description": "Twilio auth token."
},
{
"name": "TWILIO_PHONE_NUMBER",
"isRequired": true,
"description": "The Twilio number Banjo calls from, in E.164 (+15551234567)."
},
{
"name": "NOTIFICATION_CHANNEL",
"choices": [
"twilio_sms",
"pushover",
"none"
],
"default": "twilio_sms",
"description": "How Banjo tells you a call's outcome. twilio_sms also needs NOTIFY_TO_PHONE_NUMBER and NOTIFY_FROM_PHONE_NUMBER; pushover needs PUSHOVER_APP_TOKEN and PUSHOVER_USER_KEY."
}
]
}
],
"repository": {
"url": "https://github.com/shatch/banjo",
"source": "github"
},
"websiteUrl": "https://github.com/shatch/banjo",
"description": "Self-hosted AI assistant that places real phone calls for you: bookings, reservations, errands."
}