A containerized Model Context Protocol (MCP) server for interacting with HashiCorp Vault. This server provides MCP tools for reading, writing, listing, and deleting secrets in Vault.
- vault_read: Read secrets from Vault at a specified path
- vault_write: Write secrets to Vault at a specified path
- vault_list: List secrets at a specified path in Vault
- vault_delete: Delete secrets from Vault at a specified path
- Docker and Docker Compose
- Docker Desktop 4.42.0+ with MCP Toolkit enabled (for Docker Desktop integration)
- HashiCorp Vault instance (can use the included dev server)
- Vault token for authentication
Run the setup script to install and configure the server:
Windows (PowerShell):
.\setup.ps1macOS/Linux (Bash):
./setup.shWhat the setup script does:
- Builds the Docker image if needed
- Starts Vault dev server
- Creates the MCP catalog in Docker Desktop
- Adds and enables the vault-mcp server
Configuration used:
- Catalog file:
configs/vault-catalog.yaml - Vault address:
http://host.docker.internal:8200 - Vault token:
myroot(dev mode)
After running the setup script, restart Docker Desktop to see the server in the "My Servers" section.
See docs/INSTALL_DOCKER_DESKTOP.md for detailed installation instructions.
Start both Vault and the MCP server:
# Build and start services
docker-compose up -d
# Check logs
docker-compose logs -f vault-mcpThis will start:
- A Vault dev server at
http://localhost:8200with root tokenmyroot - The vault-mcp server connected to the Vault instance
Step 1: Copy the configuration
Copy configs/mcp_config.json to your Cursor MCP configuration file:
Windows:
# Create directory if it doesn't exist
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.cursor"
# Copy the config file
Copy-Item -Path "configs\mcp_config.json" -Destination "$env:USERPROFILE\.cursor\mcp.json"macOS/Linux:
# Create directory if it doesn't exist
mkdir -p ~/.cursor
# Copy the config file
cp configs/mcp_config.json ~/.cursor/mcp.jsonStep 2: Update the configuration (if needed)
Edit ~/.cursor/mcp.json (or %USERPROFILE%\.cursor\mcp.json on Windows) and update:
VAULT_ADDR: Your Vault server addressVAULT_TOKEN: Your Vault token- Image name: Use
vault-mcp-vault-mcp:latestif built locally
Step 3: Restart Cursor
Completely quit and restart Cursor for the changes to take effect.
Step 4: Test
In Cursor, try asking:
Use vault_read to read the secret at path secret/data/test
See docs/TEST_CURSOR_MCP.md for more testing instructions.
Copy the configuration from configs/mcp_config.json to your Claude Desktop configuration:
Windows:
# Location: %APPDATA%\Claude\claude_desktop_config.json
Copy-Item -Path "configs\mcp_config.json" -Destination "$env:APPDATA\Claude\claude_desktop_config.json"macOS:
# Location: ~/Library/Application Support/Claude/claude_desktop_config.json
cp configs/mcp_config.json ~/Library/Application\ Support/Claude/claude_desktop_config.jsonLinux:
# Location: ~/.config/claude-desktop/claude_desktop_config.json
cp configs/mcp_config.json ~/.config/claude-desktop/claude_desktop_config.jsonThen restart Claude Desktop.
Pre-built container images are automatically published to GitHub Container Registry:
# Pull the latest image
docker pull ghcr.io/kelleyblackmore/vault-mcp:latest
# Pull a specific version
docker pull ghcr.io/kelleyblackmore/vault-mcp:v1.0.0The images are automatically built for multiple platforms:
linux/amd64(x86_64)linux/arm64(ARM64/aarch64)
docker-compose build vault-mcp
# Or
docker build -t vault-mcp-vault-mcp:latest .docker run -it --rm \
-e VAULT_ADDR=http://host.docker.internal:8200 \
-e VAULT_TOKEN=myroot \
vault-mcp-vault-mcp:latestEdit the docker-compose.yml file to configure your Vault connection:
environment:
VAULT_ADDR: http://vault:8200
VAULT_TOKEN: your-tokenThen run:
docker-compose up vault-mcpThe server is configured via environment variables:
VAULT_ADDR: The Vault server address (default:http://127.0.0.1:8200)VAULT_TOKEN: The Vault authentication token (required)
Configuration files are located in the configs/ directory:
configs/vault-catalog.yaml- Docker Desktop MCP Toolkit catalog configurationconfigs/mcp_config.json- MCP client configuration (Cursor, Claude Desktop)
Read a secret from Vault.
Parameters:
path(string, required): The path to read the secret from (e.g.,secret/data/myapp)
Example:
{
"path": "secret/data/myapp"
}Write a secret to Vault.
Parameters:
path(string, required): The path to write the secret to (e.g.,secret/data/myapp)data(object, required): The secret data to write as a JSON object
Example:
{
"path": "secret/data/myapp",
"data": {
"username": "admin",
"password": "secret123"
}
}List secrets at a path in Vault.
Parameters:
path(string, required): The path to list secrets from (e.g.,secret/metadata)
Example:
{
"path": "secret/metadata"
}Delete a secret from Vault.
Parameters:
path(string, required): The path to delete the secret from (e.g.,secret/data/myapp)
Example:
{
"path": "secret/data/myapp"
}# Install dependencies
npm install
# Build the project
npm run build
# Run locally (requires Vault server)
VAULT_ADDR=http://localhost:8200 VAULT_TOKEN=myroot npm startvault-mcp/
├── .github/
│ └── workflows/
│ └── docker-build-publish.yml # CI/CD workflow for container builds
├── configs/ # MCP configuration files
│ ├── mcp_config.json # MCP client configuration (Cursor, Claude Desktop)
│ └── vault-catalog.yaml # Docker Desktop MCP Toolkit catalog
├── docs/ # Documentation files
├── src/
│ └── index.ts # Main MCP server implementation
├── dist/ # Compiled JavaScript (generated)
├── Dockerfile # Container definition
├── docker-compose.yml # Docker Compose configuration
├── package.json # Node.js dependencies
├── setup.ps1 # Setup script for Windows (PowerShell)
├── setup.sh # Setup script for macOS/Linux (Bash)
├── tsconfig.json # TypeScript configuration
└── README.md # This file
The project uses GitHub Actions to automatically build and publish Docker images:
- On push to main: Builds and publishes the
latesttag and a SHA-based tag - On pull request: Builds the image to verify it compiles (does not publish)
- On version tags (e.g.,
v1.0.0): Builds and publishes version-specific tags (e.g.,v1.0.0,v1.0,v1)
Images are published to GitHub Container Registry at ghcr.io/kelleyblackmore/vault-mcp.
- Never hardcode Vault tokens in configuration files
- Use appropriate Vault policies to limit MCP server permissions
- For production use, replace the dev Vault server with a properly configured production instance
- Consider using Vault AppRole or Kubernetes auth instead of token-based auth
- Use secrets management tools to inject
VAULT_TOKENat runtime
MIT