Gramps Web MCP
mcpotherMCP server for structured access to Gramps Web genealogy data
run it
on your own machines, one way per deploy method#!/usr/bin/env bash
# gramps-web (io.github.Scormave/gramps-web-mcp), recipe docker (generated).
# Generated by Hub for toolset "my-agent"; started by mcp-my-agent-gramps-web.service.
set -euo pipefail
export HOST=127.0.0.1 PORT=8101
exec docker run --rm --name mcp-my-agent-gramps-web -p 127.0.0.1:${PORT}:8000 --env-file /etc/mcp/my-agent.env ghcr.io/scormave/gramps-web-mcp:2.6.0
[Unit]
Description=MCP server gramps-web (toolset my-agent), generated by Hub
After=network-online.target docker.service
Wants=network-online.target
[Service]
Type=simple
User=mcp
Group=mcp
SupplementaryGroups=docker
EnvironmentFile=/etc/mcp/my-agent.env
Environment=HOME=/var/lib/mcp/gramps-web
WorkingDirectory=/var/lib/mcp/gramps-web
ExecStart=/opt/mcp/my-agent/bin/gramps-web.sh
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/var/lib/mcp/gramps-web
[Install]
WantedBy=multi-user.target
docker run --rm -p 127.0.0.1:8101:8000 -e MCP_TRANSPORT -e GRAMPS_API_URL -e GRAMPS_USERNAME -e GRAMPS_PASSWORD -e GRAMPS_REFRESH_TOKEN -e GRAMPS_TREE_ID -e GRAMPS_READ_ONLY -e GRAMPS_MUTATION_SERIALIZE -e GRAMPS_MUTATION_MIN_INTERVAL_MS -e GRAMPS_LOG_LEVEL -e GRAMPS_MEDIA_RESOURCES_ENABLED -e GRAMPS_MEDIA_MAX_BYTES -e GRAMPS_MEDIA_ALLOW_PRIVATE -e GRAMPS_MEDIA_UPLOAD_DIRS -e GRAMPS_MEDIA_UPLOAD_MAX_BYTES ghcr.io/scormave/gramps-web-mcp:2.6.0
# Generated by Hub for toolset "my-agent" (2026-10-18T02:43:23+00:00).
# Each package server runs behind a stdio->HTTP bridge and listens on localhost only.
# cp .env.example .env # fill the ${VAR}s
# docker compose up -d && bash smoke.sh
# Remote servers are not here: clients reach them directly (see clients/).
name: mcp-my-agent
services:
gramps-web:
image: ghcr.io/scormave/gramps-web-mcp:2.6.0
ports:
- 127.0.0.1:8101:8000
restart: unless-stopped
x-note: 'CHANGE_ME: check the image''s README for its transport and port; this assumes streamable
HTTP at :8000/mcp. If it speaks stdio only, use it from clients/mcp.json as a `docker run -i` command
instead.'
environment:
MCP_TRANSPORT: ${MCP_TRANSPORT}
GRAMPS_API_URL: ${GRAMPS_API_URL}
GRAMPS_USERNAME: ${GRAMPS_USERNAME}
GRAMPS_PASSWORD: ${GRAMPS_PASSWORD}
GRAMPS_REFRESH_TOKEN: ${GRAMPS_REFRESH_TOKEN}
GRAMPS_TREE_ID: ${GRAMPS_TREE_ID}
GRAMPS_READ_ONLY: ${GRAMPS_READ_ONLY}
GRAMPS_MUTATION_SERIALIZE: ${GRAMPS_MUTATION_SERIALIZE}
GRAMPS_MUTATION_MIN_INTERVAL_MS: ${GRAMPS_MUTATION_MIN_INTERVAL_MS}
GRAMPS_LOG_LEVEL: ${GRAMPS_LOG_LEVEL}
GRAMPS_MEDIA_RESOURCES_ENABLED: ${GRAMPS_MEDIA_RESOURCES_ENABLED}
GRAMPS_MEDIA_MAX_BYTES: ${GRAMPS_MEDIA_MAX_BYTES}
GRAMPS_MEDIA_ALLOW_PRIVATE: ${GRAMPS_MEDIA_ALLOW_PRIVATE}
GRAMPS_MEDIA_UPLOAD_DIRS: ${GRAMPS_MEDIA_UPLOAD_DIRS}
GRAMPS_MEDIA_UPLOAD_MAX_BYTES: ${GRAMPS_MEDIA_UPLOAD_MAX_BYTES}
volumes:
npm-cache: {}
uv-cache: {}
# Generated by Hub for toolset "my-agent" (2026-10-18T02:43:23+00:00).
# kubectl create namespace mcp
# kubectl -n mcp create secret generic mcp-credentials --from-env-file=.env
# kubectl apply -f kubernetes.yaml
# Services are cluster-internal: <name>.mcp.svc.cluster.local:8000/mcp. Put an ingress
# with auth in front before exposing any of them.
apiVersion: v1
kind: Namespace
metadata:
name: mcp
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gramps-web
namespace: mcp
labels: &id001
app: gramps-web
spec:
replicas: 1
selector:
matchLabels: *id001
template:
metadata:
labels: *id001
spec:
containers:
- name: gramps-web
image: ghcr.io/scormave/gramps-web-mcp:2.6.0
ports:
- containerPort: 8000
name: http
env:
- name: MCP_TRANSPORT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MCP_TRANSPORT
- name: GRAMPS_API_URL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_API_URL
- name: GRAMPS_USERNAME
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_USERNAME
- name: GRAMPS_PASSWORD
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_PASSWORD
- name: GRAMPS_REFRESH_TOKEN
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_REFRESH_TOKEN
- name: GRAMPS_TREE_ID
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_TREE_ID
- name: GRAMPS_READ_ONLY
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_READ_ONLY
- name: GRAMPS_MUTATION_SERIALIZE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MUTATION_SERIALIZE
- name: GRAMPS_MUTATION_MIN_INTERVAL_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MUTATION_MIN_INTERVAL_MS
- name: GRAMPS_LOG_LEVEL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_LOG_LEVEL
- name: GRAMPS_MEDIA_RESOURCES_ENABLED
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_RESOURCES_ENABLED
- name: GRAMPS_MEDIA_MAX_BYTES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_MAX_BYTES
- name: GRAMPS_MEDIA_ALLOW_PRIVATE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_ALLOW_PRIVATE
- name: GRAMPS_MEDIA_UPLOAD_DIRS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_UPLOAD_DIRS
- name: GRAMPS_MEDIA_UPLOAD_MAX_BYTES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_UPLOAD_MAX_BYTES
---
apiVersion: v1
kind: Service
metadata:
name: gramps-web
namespace: mcp
spec:
selector:
app: gramps-web
ports:
- port: 8000
targetPort: http
name: http
# Generated by Hub for toolset "my-agent" (2026-10-18T02:43:23+00:00).
# Credentials come from the Secret 'mcp-credentials' (kubectl create secret generic ... --from-env-file=.env).
# Each server under `servers` is one Deployment + Service; the keys after it configure
# upstream charts a worker verified.
servers:
gramps-web:
enabled: true
replicas: 1
port: 8000
path: /mcp
container:
name: gramps-web
image: ghcr.io/scormave/gramps-web-mcp:2.6.0
ports:
- containerPort: 8000
name: http
env:
- name: MCP_TRANSPORT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MCP_TRANSPORT
- name: GRAMPS_API_URL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_API_URL
- name: GRAMPS_USERNAME
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_USERNAME
- name: GRAMPS_PASSWORD
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_PASSWORD
- name: GRAMPS_REFRESH_TOKEN
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_REFRESH_TOKEN
- name: GRAMPS_TREE_ID
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_TREE_ID
- name: GRAMPS_READ_ONLY
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_READ_ONLY
- name: GRAMPS_MUTATION_SERIALIZE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MUTATION_SERIALIZE
- name: GRAMPS_MUTATION_MIN_INTERVAL_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MUTATION_MIN_INTERVAL_MS
- name: GRAMPS_LOG_LEVEL
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_LOG_LEVEL
- name: GRAMPS_MEDIA_RESOURCES_ENABLED
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_RESOURCES_ENABLED
- name: GRAMPS_MEDIA_MAX_BYTES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_MAX_BYTES
- name: GRAMPS_MEDIA_ALLOW_PRIVATE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_ALLOW_PRIVATE
- name: GRAMPS_MEDIA_UPLOAD_DIRS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_UPLOAD_DIRS
- name: GRAMPS_MEDIA_UPLOAD_MAX_BYTES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: GRAMPS_MEDIA_UPLOAD_MAX_BYTES
# helm install my-agent helm/my-agent -n mcp
in the cloud
one click: the provider's deploy form opens filled in, in your own account- koyeb
-
The form opens with CHANGE_ME for each value you supply: MCP_TRANSPORT, GRAMPS_API_URL, GRAMPS_USERNAME, GRAMPS_PASSWORD, GRAMPS_REFRESH_TOKEN, GRAMPS_TREE_ID, GRAMPS_READ_ONLY, GRAMPS_MUTATION_SERIALIZE, GRAMPS_MUTATION_MIN_INTERVAL_MS, GRAMPS_LOG_LEVEL, GRAMPS_MEDIA_RESOURCES_ENABLED, GRAMPS_MEDIA_MAX_BYTES, GRAMPS_MEDIA_ALLOW_PRIVATE, GRAMPS_MEDIA_UPLOAD_DIRS, GRAMPS_MEDIA_UPLOAD_MAX_BYTES. Fill them in before you deploy.
Clients connect to the service's https://…koyeb.app address plus /mcp.
- azure
-
A Container Apps environment with one app per server, each with HTTPS ingress and one replica. The portal asks for each value you supply as a secure parameter; the deployment's outputs list the endpoints.
connect to it
copy what your client needsdocker run -i --rm -e MCP_TRANSPORT -e GRAMPS_API_URL -e GRAMPS_USERNAME -e GRAMPS_PASSWORD -e GRAMPS_REFRESH_TOKEN -e GRAMPS_TREE_ID -e GRAMPS_READ_ONLY -e GRAMPS_MUTATION_SERIALIZE -e GRAMPS_MUTATION_MIN_INTERVAL_MS -e GRAMPS_LOG_LEVEL -e GRAMPS_MEDIA_RESOURCES_ENABLED -e GRAMPS_MEDIA_MAX_BYTES -e GRAMPS_MEDIA_ALLOW_PRIVATE -e GRAMPS_MEDIA_UPLOAD_DIRS -e GRAMPS_MEDIA_UPLOAD_MAX_BYTES ghcr.io/scormave/gramps-web-mcp:2.6.0
{
"mcpServers": {
"gramps-web": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT",
"-e",
"GRAMPS_API_URL",
"-e",
"GRAMPS_USERNAME",
"-e",
"GRAMPS_PASSWORD",
"-e",
"GRAMPS_REFRESH_TOKEN",
"-e",
"GRAMPS_TREE_ID",
"-e",
"GRAMPS_READ_ONLY",
"-e",
"GRAMPS_MUTATION_SERIALIZE",
"-e",
"GRAMPS_MUTATION_MIN_INTERVAL_MS",
"-e",
"GRAMPS_LOG_LEVEL",
"-e",
"GRAMPS_MEDIA_RESOURCES_ENABLED",
"-e",
"GRAMPS_MEDIA_MAX_BYTES",
"-e",
"GRAMPS_MEDIA_ALLOW_PRIVATE",
"-e",
"GRAMPS_MEDIA_UPLOAD_DIRS",
"-e",
"GRAMPS_MEDIA_UPLOAD_MAX_BYTES",
"ghcr.io/scormave/gramps-web-mcp:2.6.0"
],
"env": {
"MCP_TRANSPORT": "${MCP_TRANSPORT}",
"GRAMPS_API_URL": "${GRAMPS_API_URL}",
"GRAMPS_USERNAME": "${GRAMPS_USERNAME}",
"GRAMPS_PASSWORD": "${GRAMPS_PASSWORD}",
"GRAMPS_REFRESH_TOKEN": "${GRAMPS_REFRESH_TOKEN}",
"GRAMPS_TREE_ID": "${GRAMPS_TREE_ID}",
"GRAMPS_READ_ONLY": "${GRAMPS_READ_ONLY}",
"GRAMPS_MUTATION_SERIALIZE": "${GRAMPS_MUTATION_SERIALIZE}",
"GRAMPS_MUTATION_MIN_INTERVAL_MS": "${GRAMPS_MUTATION_MIN_INTERVAL_MS}",
"GRAMPS_LOG_LEVEL": "${GRAMPS_LOG_LEVEL}",
"GRAMPS_MEDIA_RESOURCES_ENABLED": "${GRAMPS_MEDIA_RESOURCES_ENABLED}",
"GRAMPS_MEDIA_MAX_BYTES": "${GRAMPS_MEDIA_MAX_BYTES}",
"GRAMPS_MEDIA_ALLOW_PRIVATE": "${GRAMPS_MEDIA_ALLOW_PRIVATE}",
"GRAMPS_MEDIA_UPLOAD_DIRS": "${GRAMPS_MEDIA_UPLOAD_DIRS}",
"GRAMPS_MEDIA_UPLOAD_MAX_BYTES": "${GRAMPS_MEDIA_UPLOAD_MAX_BYTES}"
}
}
}
}
#!/usr/bin/env bash
# Registers every server with Claude Code (run once; `claude mcp list` to check).
set -euo pipefail
set -a; [ -f .env ] && source .env; set +a
claude mcp add gramps-web -e "MCP_TRANSPORT=${MCP_TRANSPORT}" -e "GRAMPS_API_URL=${GRAMPS_API_URL}" -e "GRAMPS_USERNAME=${GRAMPS_USERNAME}" -e "GRAMPS_PASSWORD=${GRAMPS_PASSWORD}" -e "GRAMPS_REFRESH_TOKEN=${GRAMPS_REFRESH_TOKEN}" -e "GRAMPS_TREE_ID=${GRAMPS_TREE_ID}" -e "GRAMPS_READ_ONLY=${GRAMPS_READ_ONLY}" -e "GRAMPS_MUTATION_SERIALIZE=${GRAMPS_MUTATION_SERIALIZE}" -e "GRAMPS_MUTATION_MIN_INTERVAL_MS=${GRAMPS_MUTATION_MIN_INTERVAL_MS}" -e "GRAMPS_LOG_LEVEL=${GRAMPS_LOG_LEVEL}" -e "GRAMPS_MEDIA_RESOURCES_ENABLED=${GRAMPS_MEDIA_RESOURCES_ENABLED}" -e "GRAMPS_MEDIA_MAX_BYTES=${GRAMPS_MEDIA_MAX_BYTES}" -e "GRAMPS_MEDIA_ALLOW_PRIVATE=${GRAMPS_MEDIA_ALLOW_PRIVATE}" -e "GRAMPS_MEDIA_UPLOAD_DIRS=${GRAMPS_MEDIA_UPLOAD_DIRS}" -e "GRAMPS_MEDIA_UPLOAD_MAX_BYTES=${GRAMPS_MEDIA_UPLOAD_MAX_BYTES}" -- docker run -i --rm -e MCP_TRANSPORT -e GRAMPS_API_URL -e GRAMPS_USERNAME -e GRAMPS_PASSWORD -e GRAMPS_REFRESH_TOKEN -e GRAMPS_TREE_ID -e GRAMPS_READ_ONLY -e GRAMPS_MUTATION_SERIALIZE -e GRAMPS_MUTATION_MIN_INTERVAL_MS -e GRAMPS_LOG_LEVEL -e GRAMPS_MEDIA_RESOURCES_ENABLED -e GRAMPS_MEDIA_MAX_BYTES -e GRAMPS_MEDIA_ALLOW_PRIVATE -e GRAMPS_MEDIA_UPLOAD_DIRS -e GRAMPS_MEDIA_UPLOAD_MAX_BYTES ghcr.io/scormave/gramps-web-mcp:2.6.0
{
"mcpServers": {
"gramps-web": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT",
"-e",
"GRAMPS_API_URL",
"-e",
"GRAMPS_USERNAME",
"-e",
"GRAMPS_PASSWORD",
"-e",
"GRAMPS_REFRESH_TOKEN",
"-e",
"GRAMPS_TREE_ID",
"-e",
"GRAMPS_READ_ONLY",
"-e",
"GRAMPS_MUTATION_SERIALIZE",
"-e",
"GRAMPS_MUTATION_MIN_INTERVAL_MS",
"-e",
"GRAMPS_LOG_LEVEL",
"-e",
"GRAMPS_MEDIA_RESOURCES_ENABLED",
"-e",
"GRAMPS_MEDIA_MAX_BYTES",
"-e",
"GRAMPS_MEDIA_ALLOW_PRIVATE",
"-e",
"GRAMPS_MEDIA_UPLOAD_DIRS",
"-e",
"GRAMPS_MEDIA_UPLOAD_MAX_BYTES",
"ghcr.io/scormave/gramps-web-mcp:2.6.0"
],
"env": {
"MCP_TRANSPORT": "${MCP_TRANSPORT}",
"GRAMPS_API_URL": "${GRAMPS_API_URL}",
"GRAMPS_USERNAME": "${GRAMPS_USERNAME}",
"GRAMPS_PASSWORD": "${GRAMPS_PASSWORD}",
"GRAMPS_REFRESH_TOKEN": "${GRAMPS_REFRESH_TOKEN}",
"GRAMPS_TREE_ID": "${GRAMPS_TREE_ID}",
"GRAMPS_READ_ONLY": "${GRAMPS_READ_ONLY}",
"GRAMPS_MUTATION_SERIALIZE": "${GRAMPS_MUTATION_SERIALIZE}",
"GRAMPS_MUTATION_MIN_INTERVAL_MS": "${GRAMPS_MUTATION_MIN_INTERVAL_MS}",
"GRAMPS_LOG_LEVEL": "${GRAMPS_LOG_LEVEL}",
"GRAMPS_MEDIA_RESOURCES_ENABLED": "${GRAMPS_MEDIA_RESOURCES_ENABLED}",
"GRAMPS_MEDIA_MAX_BYTES": "${GRAMPS_MEDIA_MAX_BYTES}",
"GRAMPS_MEDIA_ALLOW_PRIVATE": "${GRAMPS_MEDIA_ALLOW_PRIVATE}",
"GRAMPS_MEDIA_UPLOAD_DIRS": "${GRAMPS_MEDIA_UPLOAD_DIRS}",
"GRAMPS_MEDIA_UPLOAD_MAX_BYTES": "${GRAMPS_MEDIA_UPLOAD_MAX_BYTES}"
}
}
}
}
{
"servers": {
"gramps-web": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"MCP_TRANSPORT",
"-e",
"GRAMPS_API_URL",
"-e",
"GRAMPS_USERNAME",
"-e",
"GRAMPS_PASSWORD",
"-e",
"GRAMPS_REFRESH_TOKEN",
"-e",
"GRAMPS_TREE_ID",
"-e",
"GRAMPS_READ_ONLY",
"-e",
"GRAMPS_MUTATION_SERIALIZE",
"-e",
"GRAMPS_MUTATION_MIN_INTERVAL_MS",
"-e",
"GRAMPS_LOG_LEVEL",
"-e",
"GRAMPS_MEDIA_RESOURCES_ENABLED",
"-e",
"GRAMPS_MEDIA_MAX_BYTES",
"-e",
"GRAMPS_MEDIA_ALLOW_PRIVATE",
"-e",
"GRAMPS_MEDIA_UPLOAD_DIRS",
"-e",
"GRAMPS_MEDIA_UPLOAD_MAX_BYTES",
"ghcr.io/scormave/gramps-web-mcp:2.6.0"
],
"env": {
"MCP_TRANSPORT": "${MCP_TRANSPORT}",
"GRAMPS_API_URL": "${GRAMPS_API_URL}",
"GRAMPS_USERNAME": "${GRAMPS_USERNAME}",
"GRAMPS_PASSWORD": "${GRAMPS_PASSWORD}",
"GRAMPS_REFRESH_TOKEN": "${GRAMPS_REFRESH_TOKEN}",
"GRAMPS_TREE_ID": "${GRAMPS_TREE_ID}",
"GRAMPS_READ_ONLY": "${GRAMPS_READ_ONLY}",
"GRAMPS_MUTATION_SERIALIZE": "${GRAMPS_MUTATION_SERIALIZE}",
"GRAMPS_MUTATION_MIN_INTERVAL_MS": "${GRAMPS_MUTATION_MIN_INTERVAL_MS}",
"GRAMPS_LOG_LEVEL": "${GRAMPS_LOG_LEVEL}",
"GRAMPS_MEDIA_RESOURCES_ENABLED": "${GRAMPS_MEDIA_RESOURCES_ENABLED}",
"GRAMPS_MEDIA_MAX_BYTES": "${GRAMPS_MEDIA_MAX_BYTES}",
"GRAMPS_MEDIA_ALLOW_PRIVATE": "${GRAMPS_MEDIA_ALLOW_PRIVATE}",
"GRAMPS_MEDIA_UPLOAD_DIRS": "${GRAMPS_MEDIA_UPLOAD_DIRS}",
"GRAMPS_MEDIA_UPLOAD_MAX_BYTES": "${GRAMPS_MEDIA_UPLOAD_MAX_BYTES}"
}
}
}
}
name: my-agent target: local servers: - hub: io.github.Scormave/gramps-web-mcp
- not probed yet: tools unpinned, ingest lists them