X (Twitter)
mcpotherSearch, read and publish X posts and manage users, lists and media via the X API v2.
run it
on your own machines, one way per deploy method#!/usr/bin/env bash
# x (io.github.Role1776/mcp-x), recipe docker (generated).
# Generated by Hub for toolset "my-agent"; started by mcp-my-agent-x.service.
set -euo pipefail
export HOST=127.0.0.1 PORT=8101
exec docker run --rm --name mcp-my-agent-x -p 127.0.0.1:${PORT}:8000 --env-file /etc/mcp/my-agent.env ghcr.io/role1776/mcp-x:0.1.1
[Unit]
Description=MCP server x (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/x
WorkingDirectory=/var/lib/mcp/x
ExecStart=/opt/mcp/my-agent/bin/x.sh
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/var/lib/mcp/x
[Install]
WantedBy=multi-user.target
docker run --rm -p 127.0.0.1:8101:8000 -e X_API_KEY -e X_API_KEY_SECRET -e X_ACCESS_TOKEN -e X_ACCESS_TOKEN_SECRET -e MEDIA_ROOT -e MCP_TRANSPORT -e MCP_NAME -e MCP_PATH -e SERVER_PORT -e SERVER_READ_TIMEOUT -e SERVER_WRITE_TIMEOUT -e LOG_MODE -e MAX_IDLE_CONNS_PER_HOST -e X_DEBUG -e POSTS_MAX_QUERIES -e POSTS_MAX_USERNAMES -e POSTS_MAX_IDS -e POSTS_DEFAULT_RESULTS -e POSTS_MAX_RESULTS -e POSTS_DEFAULT_DAYS -e POSTS_MAX_DAYS -e POSTS_DEFAULT_TIMEOUT_MS -e POSTS_MIN_TIMEOUT_MS -e POSTS_MAX_TIMEOUT_MS -e USERS_MAX_USERNAMES -e USERS_MAX_IDS -e USERS_DEFAULT_RESULTS -e USERS_MAX_RESULTS -e USERS_DEFAULT_TIMEOUT_MS -e USERS_MIN_TIMEOUT_MS -e USERS_MAX_TIMEOUT_MS -e LISTS_DEFAULT_RESULTS -e LISTS_MAX_RESULTS -e LISTS_DEFAULT_TIMEOUT_MS -e LISTS_MIN_TIMEOUT_MS -e LISTS_MAX_TIMEOUT_MS -e MEDIA_CHUNK_BYTES -e MEDIA_POLL_INTERVAL_MS -e MEDIA_DEFAULT_TIMEOUT_MS -e MEDIA_MIN_TIMEOUT_MS -e MEDIA_MAX_TIMEOUT_MS ghcr.io/role1776/mcp-x:0.1.1
# Generated by Hub for toolset "my-agent" (2026-10-18T14:36:46+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:
x:
image: ghcr.io/role1776/mcp-x:0.1.1
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:
X_API_KEY: ${X_API_KEY}
X_API_KEY_SECRET: ${X_API_KEY_SECRET}
X_ACCESS_TOKEN: ${X_ACCESS_TOKEN}
X_ACCESS_TOKEN_SECRET: ${X_ACCESS_TOKEN_SECRET}
MEDIA_ROOT: ${MEDIA_ROOT}
MCP_TRANSPORT: ${MCP_TRANSPORT}
MCP_NAME: ${MCP_NAME}
MCP_PATH: ${MCP_PATH}
SERVER_PORT: ${SERVER_PORT}
SERVER_READ_TIMEOUT: ${SERVER_READ_TIMEOUT}
SERVER_WRITE_TIMEOUT: ${SERVER_WRITE_TIMEOUT}
LOG_MODE: ${LOG_MODE}
MAX_IDLE_CONNS_PER_HOST: ${MAX_IDLE_CONNS_PER_HOST}
X_DEBUG: ${X_DEBUG}
POSTS_MAX_QUERIES: ${POSTS_MAX_QUERIES}
POSTS_MAX_USERNAMES: ${POSTS_MAX_USERNAMES}
POSTS_MAX_IDS: ${POSTS_MAX_IDS}
POSTS_DEFAULT_RESULTS: ${POSTS_DEFAULT_RESULTS}
POSTS_MAX_RESULTS: ${POSTS_MAX_RESULTS}
POSTS_DEFAULT_DAYS: ${POSTS_DEFAULT_DAYS}
POSTS_MAX_DAYS: ${POSTS_MAX_DAYS}
POSTS_DEFAULT_TIMEOUT_MS: ${POSTS_DEFAULT_TIMEOUT_MS}
POSTS_MIN_TIMEOUT_MS: ${POSTS_MIN_TIMEOUT_MS}
POSTS_MAX_TIMEOUT_MS: ${POSTS_MAX_TIMEOUT_MS}
USERS_MAX_USERNAMES: ${USERS_MAX_USERNAMES}
USERS_MAX_IDS: ${USERS_MAX_IDS}
USERS_DEFAULT_RESULTS: ${USERS_DEFAULT_RESULTS}
USERS_MAX_RESULTS: ${USERS_MAX_RESULTS}
USERS_DEFAULT_TIMEOUT_MS: ${USERS_DEFAULT_TIMEOUT_MS}
USERS_MIN_TIMEOUT_MS: ${USERS_MIN_TIMEOUT_MS}
USERS_MAX_TIMEOUT_MS: ${USERS_MAX_TIMEOUT_MS}
LISTS_DEFAULT_RESULTS: ${LISTS_DEFAULT_RESULTS}
LISTS_MAX_RESULTS: ${LISTS_MAX_RESULTS}
LISTS_DEFAULT_TIMEOUT_MS: ${LISTS_DEFAULT_TIMEOUT_MS}
LISTS_MIN_TIMEOUT_MS: ${LISTS_MIN_TIMEOUT_MS}
LISTS_MAX_TIMEOUT_MS: ${LISTS_MAX_TIMEOUT_MS}
MEDIA_CHUNK_BYTES: ${MEDIA_CHUNK_BYTES}
MEDIA_POLL_INTERVAL_MS: ${MEDIA_POLL_INTERVAL_MS}
MEDIA_DEFAULT_TIMEOUT_MS: ${MEDIA_DEFAULT_TIMEOUT_MS}
MEDIA_MIN_TIMEOUT_MS: ${MEDIA_MIN_TIMEOUT_MS}
MEDIA_MAX_TIMEOUT_MS: ${MEDIA_MAX_TIMEOUT_MS}
volumes:
npm-cache: {}
uv-cache: {}
# Generated by Hub for toolset "my-agent" (2026-10-18T14:36:46+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: x
namespace: mcp
labels: &id001
app: x
spec:
replicas: 1
selector:
matchLabels: *id001
template:
metadata:
labels: *id001
spec:
containers:
- name: x
image: ghcr.io/role1776/mcp-x:0.1.1
ports:
- containerPort: 8000
name: http
env:
- name: X_API_KEY
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_API_KEY
- name: X_API_KEY_SECRET
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_API_KEY_SECRET
- name: X_ACCESS_TOKEN
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_ACCESS_TOKEN
- name: X_ACCESS_TOKEN_SECRET
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_ACCESS_TOKEN_SECRET
- name: MEDIA_ROOT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_ROOT
- name: MCP_TRANSPORT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MCP_TRANSPORT
- name: MCP_NAME
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MCP_NAME
- name: MCP_PATH
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MCP_PATH
- name: SERVER_PORT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: SERVER_PORT
- name: SERVER_READ_TIMEOUT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: SERVER_READ_TIMEOUT
- name: SERVER_WRITE_TIMEOUT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: SERVER_WRITE_TIMEOUT
- name: LOG_MODE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LOG_MODE
- name: MAX_IDLE_CONNS_PER_HOST
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MAX_IDLE_CONNS_PER_HOST
- name: X_DEBUG
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_DEBUG
- name: POSTS_MAX_QUERIES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_QUERIES
- name: POSTS_MAX_USERNAMES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_USERNAMES
- name: POSTS_MAX_IDS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_IDS
- name: POSTS_DEFAULT_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_DEFAULT_RESULTS
- name: POSTS_MAX_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_RESULTS
- name: POSTS_DEFAULT_DAYS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_DEFAULT_DAYS
- name: POSTS_MAX_DAYS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_DAYS
- name: POSTS_DEFAULT_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_DEFAULT_TIMEOUT_MS
- name: POSTS_MIN_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MIN_TIMEOUT_MS
- name: POSTS_MAX_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_TIMEOUT_MS
- name: USERS_MAX_USERNAMES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MAX_USERNAMES
- name: USERS_MAX_IDS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MAX_IDS
- name: USERS_DEFAULT_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_DEFAULT_RESULTS
- name: USERS_MAX_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MAX_RESULTS
- name: USERS_DEFAULT_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_DEFAULT_TIMEOUT_MS
- name: USERS_MIN_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MIN_TIMEOUT_MS
- name: USERS_MAX_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MAX_TIMEOUT_MS
- name: LISTS_DEFAULT_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_DEFAULT_RESULTS
- name: LISTS_MAX_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_MAX_RESULTS
- name: LISTS_DEFAULT_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_DEFAULT_TIMEOUT_MS
- name: LISTS_MIN_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_MIN_TIMEOUT_MS
- name: LISTS_MAX_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_MAX_TIMEOUT_MS
- name: MEDIA_CHUNK_BYTES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_CHUNK_BYTES
- name: MEDIA_POLL_INTERVAL_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_POLL_INTERVAL_MS
- name: MEDIA_DEFAULT_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_DEFAULT_TIMEOUT_MS
- name: MEDIA_MIN_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_MIN_TIMEOUT_MS
- name: MEDIA_MAX_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_MAX_TIMEOUT_MS
---
apiVersion: v1
kind: Service
metadata:
name: x
namespace: mcp
spec:
selector:
app: x
ports:
- port: 8000
targetPort: http
name: http
# Generated by Hub for toolset "my-agent" (2026-10-18T14:36:46+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:
x:
enabled: true
replicas: 1
port: 8000
path: /mcp
container:
name: x
image: ghcr.io/role1776/mcp-x:0.1.1
ports:
- containerPort: 8000
name: http
env:
- name: X_API_KEY
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_API_KEY
- name: X_API_KEY_SECRET
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_API_KEY_SECRET
- name: X_ACCESS_TOKEN
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_ACCESS_TOKEN
- name: X_ACCESS_TOKEN_SECRET
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_ACCESS_TOKEN_SECRET
- name: MEDIA_ROOT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_ROOT
- name: MCP_TRANSPORT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MCP_TRANSPORT
- name: MCP_NAME
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MCP_NAME
- name: MCP_PATH
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MCP_PATH
- name: SERVER_PORT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: SERVER_PORT
- name: SERVER_READ_TIMEOUT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: SERVER_READ_TIMEOUT
- name: SERVER_WRITE_TIMEOUT
valueFrom:
secretKeyRef:
name: mcp-credentials
key: SERVER_WRITE_TIMEOUT
- name: LOG_MODE
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LOG_MODE
- name: MAX_IDLE_CONNS_PER_HOST
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MAX_IDLE_CONNS_PER_HOST
- name: X_DEBUG
valueFrom:
secretKeyRef:
name: mcp-credentials
key: X_DEBUG
- name: POSTS_MAX_QUERIES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_QUERIES
- name: POSTS_MAX_USERNAMES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_USERNAMES
- name: POSTS_MAX_IDS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_IDS
- name: POSTS_DEFAULT_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_DEFAULT_RESULTS
- name: POSTS_MAX_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_RESULTS
- name: POSTS_DEFAULT_DAYS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_DEFAULT_DAYS
- name: POSTS_MAX_DAYS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_DAYS
- name: POSTS_DEFAULT_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_DEFAULT_TIMEOUT_MS
- name: POSTS_MIN_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MIN_TIMEOUT_MS
- name: POSTS_MAX_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: POSTS_MAX_TIMEOUT_MS
- name: USERS_MAX_USERNAMES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MAX_USERNAMES
- name: USERS_MAX_IDS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MAX_IDS
- name: USERS_DEFAULT_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_DEFAULT_RESULTS
- name: USERS_MAX_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MAX_RESULTS
- name: USERS_DEFAULT_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_DEFAULT_TIMEOUT_MS
- name: USERS_MIN_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MIN_TIMEOUT_MS
- name: USERS_MAX_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: USERS_MAX_TIMEOUT_MS
- name: LISTS_DEFAULT_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_DEFAULT_RESULTS
- name: LISTS_MAX_RESULTS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_MAX_RESULTS
- name: LISTS_DEFAULT_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_DEFAULT_TIMEOUT_MS
- name: LISTS_MIN_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_MIN_TIMEOUT_MS
- name: LISTS_MAX_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: LISTS_MAX_TIMEOUT_MS
- name: MEDIA_CHUNK_BYTES
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_CHUNK_BYTES
- name: MEDIA_POLL_INTERVAL_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_POLL_INTERVAL_MS
- name: MEDIA_DEFAULT_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_DEFAULT_TIMEOUT_MS
- name: MEDIA_MIN_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_MIN_TIMEOUT_MS
- name: MEDIA_MAX_TIMEOUT_MS
valueFrom:
secretKeyRef:
name: mcp-credentials
key: MEDIA_MAX_TIMEOUT_MS
# 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: X_API_KEY, X_API_KEY_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET, MEDIA_ROOT, MCP_TRANSPORT, MCP_NAME, MCP_PATH, SERVER_PORT, SERVER_READ_TIMEOUT, SERVER_WRITE_TIMEOUT, LOG_MODE, MAX_IDLE_CONNS_PER_HOST, X_DEBUG, POSTS_MAX_QUERIES, POSTS_MAX_USERNAMES, POSTS_MAX_IDS, POSTS_DEFAULT_RESULTS, POSTS_MAX_RESULTS, POSTS_DEFAULT_DAYS, POSTS_MAX_DAYS, POSTS_DEFAULT_TIMEOUT_MS, POSTS_MIN_TIMEOUT_MS, POSTS_MAX_TIMEOUT_MS, USERS_MAX_USERNAMES, USERS_MAX_IDS, USERS_DEFAULT_RESULTS, USERS_MAX_RESULTS, USERS_DEFAULT_TIMEOUT_MS, USERS_MIN_TIMEOUT_MS, USERS_MAX_TIMEOUT_MS, LISTS_DEFAULT_RESULTS, LISTS_MAX_RESULTS, LISTS_DEFAULT_TIMEOUT_MS, LISTS_MIN_TIMEOUT_MS, LISTS_MAX_TIMEOUT_MS, MEDIA_CHUNK_BYTES, MEDIA_POLL_INTERVAL_MS, MEDIA_DEFAULT_TIMEOUT_MS, MEDIA_MIN_TIMEOUT_MS, MEDIA_MAX_TIMEOUT_MS. 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 X_API_KEY -e X_API_KEY_SECRET -e X_ACCESS_TOKEN -e X_ACCESS_TOKEN_SECRET -e MEDIA_ROOT -e MCP_TRANSPORT -e MCP_NAME -e MCP_PATH -e SERVER_PORT -e SERVER_READ_TIMEOUT -e SERVER_WRITE_TIMEOUT -e LOG_MODE -e MAX_IDLE_CONNS_PER_HOST -e X_DEBUG -e POSTS_MAX_QUERIES -e POSTS_MAX_USERNAMES -e POSTS_MAX_IDS -e POSTS_DEFAULT_RESULTS -e POSTS_MAX_RESULTS -e POSTS_DEFAULT_DAYS -e POSTS_MAX_DAYS -e POSTS_DEFAULT_TIMEOUT_MS -e POSTS_MIN_TIMEOUT_MS -e POSTS_MAX_TIMEOUT_MS -e USERS_MAX_USERNAMES -e USERS_MAX_IDS -e USERS_DEFAULT_RESULTS -e USERS_MAX_RESULTS -e USERS_DEFAULT_TIMEOUT_MS -e USERS_MIN_TIMEOUT_MS -e USERS_MAX_TIMEOUT_MS -e LISTS_DEFAULT_RESULTS -e LISTS_MAX_RESULTS -e LISTS_DEFAULT_TIMEOUT_MS -e LISTS_MIN_TIMEOUT_MS -e LISTS_MAX_TIMEOUT_MS -e MEDIA_CHUNK_BYTES -e MEDIA_POLL_INTERVAL_MS -e MEDIA_DEFAULT_TIMEOUT_MS -e MEDIA_MIN_TIMEOUT_MS -e MEDIA_MAX_TIMEOUT_MS ghcr.io/role1776/mcp-x:0.1.1
{
"mcpServers": {
"x": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"X_API_KEY",
"-e",
"X_API_KEY_SECRET",
"-e",
"X_ACCESS_TOKEN",
"-e",
"X_ACCESS_TOKEN_SECRET",
"-e",
"MEDIA_ROOT",
"-e",
"MCP_TRANSPORT",
"-e",
"MCP_NAME",
"-e",
"MCP_PATH",
"-e",
"SERVER_PORT",
"-e",
"SERVER_READ_TIMEOUT",
"-e",
"SERVER_WRITE_TIMEOUT",
"-e",
"LOG_MODE",
"-e",
"MAX_IDLE_CONNS_PER_HOST",
"-e",
"X_DEBUG",
"-e",
"POSTS_MAX_QUERIES",
"-e",
"POSTS_MAX_USERNAMES",
"-e",
"POSTS_MAX_IDS",
"-e",
"POSTS_DEFAULT_RESULTS",
"-e",
"POSTS_MAX_RESULTS",
"-e",
"POSTS_DEFAULT_DAYS",
"-e",
"POSTS_MAX_DAYS",
"-e",
"POSTS_DEFAULT_TIMEOUT_MS",
"-e",
"POSTS_MIN_TIMEOUT_MS",
"-e",
"POSTS_MAX_TIMEOUT_MS",
"-e",
"USERS_MAX_USERNAMES",
"-e",
"USERS_MAX_IDS",
"-e",
"USERS_DEFAULT_RESULTS",
"-e",
"USERS_MAX_RESULTS",
"-e",
"USERS_DEFAULT_TIMEOUT_MS",
"-e",
"USERS_MIN_TIMEOUT_MS",
"-e",
"USERS_MAX_TIMEOUT_MS",
"-e",
"LISTS_DEFAULT_RESULTS",
"-e",
"LISTS_MAX_RESULTS",
"-e",
"LISTS_DEFAULT_TIMEOUT_MS",
"-e",
"LISTS_MIN_TIMEOUT_MS",
"-e",
"LISTS_MAX_TIMEOUT_MS",
"-e",
"MEDIA_CHUNK_BYTES",
"-e",
"MEDIA_POLL_INTERVAL_MS",
"-e",
"MEDIA_DEFAULT_TIMEOUT_MS",
"-e",
"MEDIA_MIN_TIMEOUT_MS",
"-e",
"MEDIA_MAX_TIMEOUT_MS",
"ghcr.io/role1776/mcp-x:0.1.1"
],
"env": {
"X_API_KEY": "${X_API_KEY}",
"X_API_KEY_SECRET": "${X_API_KEY_SECRET}",
"X_ACCESS_TOKEN": "${X_ACCESS_TOKEN}",
"X_ACCESS_TOKEN_SECRET": "${X_ACCESS_TOKEN_SECRET}",
"MEDIA_ROOT": "${MEDIA_ROOT}",
"MCP_TRANSPORT": "${MCP_TRANSPORT}",
"MCP_NAME": "${MCP_NAME}",
"MCP_PATH": "${MCP_PATH}",
"SERVER_PORT": "${SERVER_PORT}",
"SERVER_READ_TIMEOUT": "${SERVER_READ_TIMEOUT}",
"SERVER_WRITE_TIMEOUT": "${SERVER_WRITE_TIMEOUT}",
"LOG_MODE": "${LOG_MODE}",
"MAX_IDLE_CONNS_PER_HOST": "${MAX_IDLE_CONNS_PER_HOST}",
"X_DEBUG": "${X_DEBUG}",
"POSTS_MAX_QUERIES": "${POSTS_MAX_QUERIES}",
"POSTS_MAX_USERNAMES": "${POSTS_MAX_USERNAMES}",
"POSTS_MAX_IDS": "${POSTS_MAX_IDS}",
"POSTS_DEFAULT_RESULTS": "${POSTS_DEFAULT_RESULTS}",
"POSTS_MAX_RESULTS": "${POSTS_MAX_RESULTS}",
"POSTS_DEFAULT_DAYS": "${POSTS_DEFAULT_DAYS}",
"POSTS_MAX_DAYS": "${POSTS_MAX_DAYS}",
"POSTS_DEFAULT_TIMEOUT_MS": "${POSTS_DEFAULT_TIMEOUT_MS}",
"POSTS_MIN_TIMEOUT_MS": "${POSTS_MIN_TIMEOUT_MS}",
"POSTS_MAX_TIMEOUT_MS": "${POSTS_MAX_TIMEOUT_MS}",
"USERS_MAX_USERNAMES": "${USERS_MAX_USERNAMES}",
"USERS_MAX_IDS": "${USERS_MAX_IDS}",
"USERS_DEFAULT_RESULTS": "${USERS_DEFAULT_RESULTS}",
"USERS_MAX_RESULTS": "${USERS_MAX_RESULTS}",
"USERS_DEFAULT_TIMEOUT_MS": "${USERS_DEFAULT_TIMEOUT_MS}",
"USERS_MIN_TIMEOUT_MS": "${USERS_MIN_TIMEOUT_MS}",
"USERS_MAX_TIMEOUT_MS": "${USERS_MAX_TIMEOUT_MS}",
"LISTS_DEFAULT_RESULTS": "${LISTS_DEFAULT_RESULTS}",
"LISTS_MAX_RESULTS": "${LISTS_MAX_RESULTS}",
"LISTS_DEFAULT_TIMEOUT_MS": "${LISTS_DEFAULT_TIMEOUT_MS}",
"LISTS_MIN_TIMEOUT_MS": "${LISTS_MIN_TIMEOUT_MS}",
"LISTS_MAX_TIMEOUT_MS": "${LISTS_MAX_TIMEOUT_MS}",
"MEDIA_CHUNK_BYTES": "${MEDIA_CHUNK_BYTES}",
"MEDIA_POLL_INTERVAL_MS": "${MEDIA_POLL_INTERVAL_MS}",
"MEDIA_DEFAULT_TIMEOUT_MS": "${MEDIA_DEFAULT_TIMEOUT_MS}",
"MEDIA_MIN_TIMEOUT_MS": "${MEDIA_MIN_TIMEOUT_MS}",
"MEDIA_MAX_TIMEOUT_MS": "${MEDIA_MAX_TIMEOUT_MS}"
}
}
}
}
#!/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 x -e "X_API_KEY=${X_API_KEY}" -e "X_API_KEY_SECRET=${X_API_KEY_SECRET}" -e "X_ACCESS_TOKEN=${X_ACCESS_TOKEN}" -e "X_ACCESS_TOKEN_SECRET=${X_ACCESS_TOKEN_SECRET}" -e "MEDIA_ROOT=${MEDIA_ROOT}" -e "MCP_TRANSPORT=${MCP_TRANSPORT}" -e "MCP_NAME=${MCP_NAME}" -e "MCP_PATH=${MCP_PATH}" -e "SERVER_PORT=${SERVER_PORT}" -e "SERVER_READ_TIMEOUT=${SERVER_READ_TIMEOUT}" -e "SERVER_WRITE_TIMEOUT=${SERVER_WRITE_TIMEOUT}" -e "LOG_MODE=${LOG_MODE}" -e "MAX_IDLE_CONNS_PER_HOST=${MAX_IDLE_CONNS_PER_HOST}" -e "X_DEBUG=${X_DEBUG}" -e "POSTS_MAX_QUERIES=${POSTS_MAX_QUERIES}" -e "POSTS_MAX_USERNAMES=${POSTS_MAX_USERNAMES}" -e "POSTS_MAX_IDS=${POSTS_MAX_IDS}" -e "POSTS_DEFAULT_RESULTS=${POSTS_DEFAULT_RESULTS}" -e "POSTS_MAX_RESULTS=${POSTS_MAX_RESULTS}" -e "POSTS_DEFAULT_DAYS=${POSTS_DEFAULT_DAYS}" -e "POSTS_MAX_DAYS=${POSTS_MAX_DAYS}" -e "POSTS_DEFAULT_TIMEOUT_MS=${POSTS_DEFAULT_TIMEOUT_MS}" -e "POSTS_MIN_TIMEOUT_MS=${POSTS_MIN_TIMEOUT_MS}" -e "POSTS_MAX_TIMEOUT_MS=${POSTS_MAX_TIMEOUT_MS}" -e "USERS_MAX_USERNAMES=${USERS_MAX_USERNAMES}" -e "USERS_MAX_IDS=${USERS_MAX_IDS}" -e "USERS_DEFAULT_RESULTS=${USERS_DEFAULT_RESULTS}" -e "USERS_MAX_RESULTS=${USERS_MAX_RESULTS}" -e "USERS_DEFAULT_TIMEOUT_MS=${USERS_DEFAULT_TIMEOUT_MS}" -e "USERS_MIN_TIMEOUT_MS=${USERS_MIN_TIMEOUT_MS}" -e "USERS_MAX_TIMEOUT_MS=${USERS_MAX_TIMEOUT_MS}" -e "LISTS_DEFAULT_RESULTS=${LISTS_DEFAULT_RESULTS}" -e "LISTS_MAX_RESULTS=${LISTS_MAX_RESULTS}" -e "LISTS_DEFAULT_TIMEOUT_MS=${LISTS_DEFAULT_TIMEOUT_MS}" -e "LISTS_MIN_TIMEOUT_MS=${LISTS_MIN_TIMEOUT_MS}" -e "LISTS_MAX_TIMEOUT_MS=${LISTS_MAX_TIMEOUT_MS}" -e "MEDIA_CHUNK_BYTES=${MEDIA_CHUNK_BYTES}" -e "MEDIA_POLL_INTERVAL_MS=${MEDIA_POLL_INTERVAL_MS}" -e "MEDIA_DEFAULT_TIMEOUT_MS=${MEDIA_DEFAULT_TIMEOUT_MS}" -e "MEDIA_MIN_TIMEOUT_MS=${MEDIA_MIN_TIMEOUT_MS}" -e "MEDIA_MAX_TIMEOUT_MS=${MEDIA_MAX_TIMEOUT_MS}" -- docker run -i --rm -e X_API_KEY -e X_API_KEY_SECRET -e X_ACCESS_TOKEN -e X_ACCESS_TOKEN_SECRET -e MEDIA_ROOT -e MCP_TRANSPORT -e MCP_NAME -e MCP_PATH -e SERVER_PORT -e SERVER_READ_TIMEOUT -e SERVER_WRITE_TIMEOUT -e LOG_MODE -e MAX_IDLE_CONNS_PER_HOST -e X_DEBUG -e POSTS_MAX_QUERIES -e POSTS_MAX_USERNAMES -e POSTS_MAX_IDS -e POSTS_DEFAULT_RESULTS -e POSTS_MAX_RESULTS -e POSTS_DEFAULT_DAYS -e POSTS_MAX_DAYS -e POSTS_DEFAULT_TIMEOUT_MS -e POSTS_MIN_TIMEOUT_MS -e POSTS_MAX_TIMEOUT_MS -e USERS_MAX_USERNAMES -e USERS_MAX_IDS -e USERS_DEFAULT_RESULTS -e USERS_MAX_RESULTS -e USERS_DEFAULT_TIMEOUT_MS -e USERS_MIN_TIMEOUT_MS -e USERS_MAX_TIMEOUT_MS -e LISTS_DEFAULT_RESULTS -e LISTS_MAX_RESULTS -e LISTS_DEFAULT_TIMEOUT_MS -e LISTS_MIN_TIMEOUT_MS -e LISTS_MAX_TIMEOUT_MS -e MEDIA_CHUNK_BYTES -e MEDIA_POLL_INTERVAL_MS -e MEDIA_DEFAULT_TIMEOUT_MS -e MEDIA_MIN_TIMEOUT_MS -e MEDIA_MAX_TIMEOUT_MS ghcr.io/role1776/mcp-x:0.1.1
{
"mcpServers": {
"x": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"X_API_KEY",
"-e",
"X_API_KEY_SECRET",
"-e",
"X_ACCESS_TOKEN",
"-e",
"X_ACCESS_TOKEN_SECRET",
"-e",
"MEDIA_ROOT",
"-e",
"MCP_TRANSPORT",
"-e",
"MCP_NAME",
"-e",
"MCP_PATH",
"-e",
"SERVER_PORT",
"-e",
"SERVER_READ_TIMEOUT",
"-e",
"SERVER_WRITE_TIMEOUT",
"-e",
"LOG_MODE",
"-e",
"MAX_IDLE_CONNS_PER_HOST",
"-e",
"X_DEBUG",
"-e",
"POSTS_MAX_QUERIES",
"-e",
"POSTS_MAX_USERNAMES",
"-e",
"POSTS_MAX_IDS",
"-e",
"POSTS_DEFAULT_RESULTS",
"-e",
"POSTS_MAX_RESULTS",
"-e",
"POSTS_DEFAULT_DAYS",
"-e",
"POSTS_MAX_DAYS",
"-e",
"POSTS_DEFAULT_TIMEOUT_MS",
"-e",
"POSTS_MIN_TIMEOUT_MS",
"-e",
"POSTS_MAX_TIMEOUT_MS",
"-e",
"USERS_MAX_USERNAMES",
"-e",
"USERS_MAX_IDS",
"-e",
"USERS_DEFAULT_RESULTS",
"-e",
"USERS_MAX_RESULTS",
"-e",
"USERS_DEFAULT_TIMEOUT_MS",
"-e",
"USERS_MIN_TIMEOUT_MS",
"-e",
"USERS_MAX_TIMEOUT_MS",
"-e",
"LISTS_DEFAULT_RESULTS",
"-e",
"LISTS_MAX_RESULTS",
"-e",
"LISTS_DEFAULT_TIMEOUT_MS",
"-e",
"LISTS_MIN_TIMEOUT_MS",
"-e",
"LISTS_MAX_TIMEOUT_MS",
"-e",
"MEDIA_CHUNK_BYTES",
"-e",
"MEDIA_POLL_INTERVAL_MS",
"-e",
"MEDIA_DEFAULT_TIMEOUT_MS",
"-e",
"MEDIA_MIN_TIMEOUT_MS",
"-e",
"MEDIA_MAX_TIMEOUT_MS",
"ghcr.io/role1776/mcp-x:0.1.1"
],
"env": {
"X_API_KEY": "${X_API_KEY}",
"X_API_KEY_SECRET": "${X_API_KEY_SECRET}",
"X_ACCESS_TOKEN": "${X_ACCESS_TOKEN}",
"X_ACCESS_TOKEN_SECRET": "${X_ACCESS_TOKEN_SECRET}",
"MEDIA_ROOT": "${MEDIA_ROOT}",
"MCP_TRANSPORT": "${MCP_TRANSPORT}",
"MCP_NAME": "${MCP_NAME}",
"MCP_PATH": "${MCP_PATH}",
"SERVER_PORT": "${SERVER_PORT}",
"SERVER_READ_TIMEOUT": "${SERVER_READ_TIMEOUT}",
"SERVER_WRITE_TIMEOUT": "${SERVER_WRITE_TIMEOUT}",
"LOG_MODE": "${LOG_MODE}",
"MAX_IDLE_CONNS_PER_HOST": "${MAX_IDLE_CONNS_PER_HOST}",
"X_DEBUG": "${X_DEBUG}",
"POSTS_MAX_QUERIES": "${POSTS_MAX_QUERIES}",
"POSTS_MAX_USERNAMES": "${POSTS_MAX_USERNAMES}",
"POSTS_MAX_IDS": "${POSTS_MAX_IDS}",
"POSTS_DEFAULT_RESULTS": "${POSTS_DEFAULT_RESULTS}",
"POSTS_MAX_RESULTS": "${POSTS_MAX_RESULTS}",
"POSTS_DEFAULT_DAYS": "${POSTS_DEFAULT_DAYS}",
"POSTS_MAX_DAYS": "${POSTS_MAX_DAYS}",
"POSTS_DEFAULT_TIMEOUT_MS": "${POSTS_DEFAULT_TIMEOUT_MS}",
"POSTS_MIN_TIMEOUT_MS": "${POSTS_MIN_TIMEOUT_MS}",
"POSTS_MAX_TIMEOUT_MS": "${POSTS_MAX_TIMEOUT_MS}",
"USERS_MAX_USERNAMES": "${USERS_MAX_USERNAMES}",
"USERS_MAX_IDS": "${USERS_MAX_IDS}",
"USERS_DEFAULT_RESULTS": "${USERS_DEFAULT_RESULTS}",
"USERS_MAX_RESULTS": "${USERS_MAX_RESULTS}",
"USERS_DEFAULT_TIMEOUT_MS": "${USERS_DEFAULT_TIMEOUT_MS}",
"USERS_MIN_TIMEOUT_MS": "${USERS_MIN_TIMEOUT_MS}",
"USERS_MAX_TIMEOUT_MS": "${USERS_MAX_TIMEOUT_MS}",
"LISTS_DEFAULT_RESULTS": "${LISTS_DEFAULT_RESULTS}",
"LISTS_MAX_RESULTS": "${LISTS_MAX_RESULTS}",
"LISTS_DEFAULT_TIMEOUT_MS": "${LISTS_DEFAULT_TIMEOUT_MS}",
"LISTS_MIN_TIMEOUT_MS": "${LISTS_MIN_TIMEOUT_MS}",
"LISTS_MAX_TIMEOUT_MS": "${LISTS_MAX_TIMEOUT_MS}",
"MEDIA_CHUNK_BYTES": "${MEDIA_CHUNK_BYTES}",
"MEDIA_POLL_INTERVAL_MS": "${MEDIA_POLL_INTERVAL_MS}",
"MEDIA_DEFAULT_TIMEOUT_MS": "${MEDIA_DEFAULT_TIMEOUT_MS}",
"MEDIA_MIN_TIMEOUT_MS": "${MEDIA_MIN_TIMEOUT_MS}",
"MEDIA_MAX_TIMEOUT_MS": "${MEDIA_MAX_TIMEOUT_MS}"
}
}
}
}
{
"servers": {
"x": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"X_API_KEY",
"-e",
"X_API_KEY_SECRET",
"-e",
"X_ACCESS_TOKEN",
"-e",
"X_ACCESS_TOKEN_SECRET",
"-e",
"MEDIA_ROOT",
"-e",
"MCP_TRANSPORT",
"-e",
"MCP_NAME",
"-e",
"MCP_PATH",
"-e",
"SERVER_PORT",
"-e",
"SERVER_READ_TIMEOUT",
"-e",
"SERVER_WRITE_TIMEOUT",
"-e",
"LOG_MODE",
"-e",
"MAX_IDLE_CONNS_PER_HOST",
"-e",
"X_DEBUG",
"-e",
"POSTS_MAX_QUERIES",
"-e",
"POSTS_MAX_USERNAMES",
"-e",
"POSTS_MAX_IDS",
"-e",
"POSTS_DEFAULT_RESULTS",
"-e",
"POSTS_MAX_RESULTS",
"-e",
"POSTS_DEFAULT_DAYS",
"-e",
"POSTS_MAX_DAYS",
"-e",
"POSTS_DEFAULT_TIMEOUT_MS",
"-e",
"POSTS_MIN_TIMEOUT_MS",
"-e",
"POSTS_MAX_TIMEOUT_MS",
"-e",
"USERS_MAX_USERNAMES",
"-e",
"USERS_MAX_IDS",
"-e",
"USERS_DEFAULT_RESULTS",
"-e",
"USERS_MAX_RESULTS",
"-e",
"USERS_DEFAULT_TIMEOUT_MS",
"-e",
"USERS_MIN_TIMEOUT_MS",
"-e",
"USERS_MAX_TIMEOUT_MS",
"-e",
"LISTS_DEFAULT_RESULTS",
"-e",
"LISTS_MAX_RESULTS",
"-e",
"LISTS_DEFAULT_TIMEOUT_MS",
"-e",
"LISTS_MIN_TIMEOUT_MS",
"-e",
"LISTS_MAX_TIMEOUT_MS",
"-e",
"MEDIA_CHUNK_BYTES",
"-e",
"MEDIA_POLL_INTERVAL_MS",
"-e",
"MEDIA_DEFAULT_TIMEOUT_MS",
"-e",
"MEDIA_MIN_TIMEOUT_MS",
"-e",
"MEDIA_MAX_TIMEOUT_MS",
"ghcr.io/role1776/mcp-x:0.1.1"
],
"env": {
"X_API_KEY": "${X_API_KEY}",
"X_API_KEY_SECRET": "${X_API_KEY_SECRET}",
"X_ACCESS_TOKEN": "${X_ACCESS_TOKEN}",
"X_ACCESS_TOKEN_SECRET": "${X_ACCESS_TOKEN_SECRET}",
"MEDIA_ROOT": "${MEDIA_ROOT}",
"MCP_TRANSPORT": "${MCP_TRANSPORT}",
"MCP_NAME": "${MCP_NAME}",
"MCP_PATH": "${MCP_PATH}",
"SERVER_PORT": "${SERVER_PORT}",
"SERVER_READ_TIMEOUT": "${SERVER_READ_TIMEOUT}",
"SERVER_WRITE_TIMEOUT": "${SERVER_WRITE_TIMEOUT}",
"LOG_MODE": "${LOG_MODE}",
"MAX_IDLE_CONNS_PER_HOST": "${MAX_IDLE_CONNS_PER_HOST}",
"X_DEBUG": "${X_DEBUG}",
"POSTS_MAX_QUERIES": "${POSTS_MAX_QUERIES}",
"POSTS_MAX_USERNAMES": "${POSTS_MAX_USERNAMES}",
"POSTS_MAX_IDS": "${POSTS_MAX_IDS}",
"POSTS_DEFAULT_RESULTS": "${POSTS_DEFAULT_RESULTS}",
"POSTS_MAX_RESULTS": "${POSTS_MAX_RESULTS}",
"POSTS_DEFAULT_DAYS": "${POSTS_DEFAULT_DAYS}",
"POSTS_MAX_DAYS": "${POSTS_MAX_DAYS}",
"POSTS_DEFAULT_TIMEOUT_MS": "${POSTS_DEFAULT_TIMEOUT_MS}",
"POSTS_MIN_TIMEOUT_MS": "${POSTS_MIN_TIMEOUT_MS}",
"POSTS_MAX_TIMEOUT_MS": "${POSTS_MAX_TIMEOUT_MS}",
"USERS_MAX_USERNAMES": "${USERS_MAX_USERNAMES}",
"USERS_MAX_IDS": "${USERS_MAX_IDS}",
"USERS_DEFAULT_RESULTS": "${USERS_DEFAULT_RESULTS}",
"USERS_MAX_RESULTS": "${USERS_MAX_RESULTS}",
"USERS_DEFAULT_TIMEOUT_MS": "${USERS_DEFAULT_TIMEOUT_MS}",
"USERS_MIN_TIMEOUT_MS": "${USERS_MIN_TIMEOUT_MS}",
"USERS_MAX_TIMEOUT_MS": "${USERS_MAX_TIMEOUT_MS}",
"LISTS_DEFAULT_RESULTS": "${LISTS_DEFAULT_RESULTS}",
"LISTS_MAX_RESULTS": "${LISTS_MAX_RESULTS}",
"LISTS_DEFAULT_TIMEOUT_MS": "${LISTS_DEFAULT_TIMEOUT_MS}",
"LISTS_MIN_TIMEOUT_MS": "${LISTS_MIN_TIMEOUT_MS}",
"LISTS_MAX_TIMEOUT_MS": "${LISTS_MAX_TIMEOUT_MS}",
"MEDIA_CHUNK_BYTES": "${MEDIA_CHUNK_BYTES}",
"MEDIA_POLL_INTERVAL_MS": "${MEDIA_POLL_INTERVAL_MS}",
"MEDIA_DEFAULT_TIMEOUT_MS": "${MEDIA_DEFAULT_TIMEOUT_MS}",
"MEDIA_MIN_TIMEOUT_MS": "${MEDIA_MIN_TIMEOUT_MS}",
"MEDIA_MAX_TIMEOUT_MS": "${MEDIA_MAX_TIMEOUT_MS}"
}
}
}
}
name: my-agent target: local servers: - hub: io.github.Role1776/mcp-x
- not probed yet: tools unpinned, ingest lists them