{
  "slug": "io-github-upstash-redis-mcp",
  "name": "io.github.upstash/redis-mcp",
  "title": "redis-mcp",
  "description": "Run Redis commands and look up Upstash Redis Search docs against Upstash Redis over HTTP or TCP.",
  "version": "0.1.1",
  "publishedAt": "2026-07-08T14:32:46.616436Z",
  "updatedAt": "2026-07-08T14:32:46.616436Z",
  "repoUrl": "https://github.com/upstash/redis-mcp",
  "websiteUrl": null,
  "namespace": {
    "type": "github",
    "owner": "upstash"
  },
  "kind": "local",
  "packages": [
    {
      "registryType": "npm",
      "identifier": "@upstash/redis-mcp",
      "version": "0.1.1",
      "transport": "stdio",
      "runtimeHint": null
    }
  ],
  "remotes": [],
  "envVars": [
    {
      "name": "UPSTASH_REDIS_REST_URL",
      "isSecret": false,
      "isRequired": false,
      "description": "Upstash Redis REST URL (HTTP transport)."
    },
    {
      "name": "UPSTASH_REDIS_REST_TOKEN",
      "isSecret": true,
      "isRequired": false,
      "description": "Upstash Redis REST token (HTTP transport)."
    },
    {
      "name": "UPSTASH_REDIS_TCP_URL",
      "isSecret": true,
      "isRequired": false,
      "description": "Upstash Redis rediss:// connection string (TCP transport)."
    }
  ],
  "category": "databases",
  "subcategory": "nosql",
  "company": "upstash",
  "categoryAuto": true,
  "checks": [
    {
      "id": "source-linked",
      "label": "Source repository linked",
      "result": "pass",
      "detail": "https://github.com/upstash/redis-mcp"
    },
    {
      "id": "version-pinned",
      "label": "Version pinned",
      "result": "pass",
      "detail": "Every package has an explicit version"
    },
    {
      "id": "secrets-requested",
      "label": "Secrets requested",
      "result": "info",
      "detail": "Asks for 2 secrets: UPSTASH_REDIS_REST_TOKEN, UPSTASH_REDIS_TCP_URL"
    },
    {
      "id": "known-registry",
      "label": "Known package registry",
      "result": "pass",
      "detail": "All packages come from npm, PyPI, OCI, NuGet or MCPB"
    },
    {
      "id": "namespace",
      "label": "Namespace ownership",
      "result": "info",
      "detail": "Name verified via GitHub account upstash"
    },
    {
      "id": "meta-text",
      "label": "Registry text aimed at the AI",
      "result": "pass",
      "detail": "Description and settings contain no hidden characters or instructions to the AI"
    },
    {
      "id": "install-scripts",
      "label": "Install scripts",
      "result": "pass",
      "detail": "@upstash/redis-mcp@0.1.1 runs nothing at install"
    },
    {
      "id": "code-flags",
      "label": "Code red flags",
      "result": "pass",
      "detail": "Read 4 files in @upstash/redis-mcp@0.1.1: no obfuscation, encoded execution, credential reads or data-collection endpoints found"
    },
    {
      "id": "ai-text",
      "label": "Text aimed at the AI",
      "result": "pass",
      "detail": "No hidden characters or instructions to the AI in 4 files, including comments and the README"
    }
  ],
  "scannedAt": "2026-10-29",
  "level": "Scanned",
  "install": [
    {
      "label": "Claude Desktop (npm)",
      "kind": "claude_desktop_json",
      "text": "{\n  \"mcpServers\": {\n    \"redis-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@upstash/redis-mcp@0.1.1\"\n      ]\n    }\n  }\n}"
    }
  ],
  "curated": true,
  "stars": 0,
  "archived": false,
  "pushedAt": "2026-07-08T14:32:21Z",
  "review": {
    "package": "@upstash/redis-mcp",
    "version": "0.1.1",
    "at": "2026-10-31",
    "files": 2,
    "lines": 881,
    "verdict": "pass-with-notes",
    "summary": "Lets an AI run any Redis command against your Upstash database, over Upstash's REST API or a normal Redis connection, and look up Upstash docs (those questions go to the third-party site context7.com). By default it adds small telemetry headers (Node version, operating system, package version) to requests sent to Upstash; you can turn them off. Turn on --readonly if the AI should not change data, and never use the optional HTTP mode on a normal computer: it has no password and lets any website you visit control your database.",
    "hosts": [
      {
        "host": "the configured Upstash Redis REST URL (UPSTASH_REDIS_REST_URL, *.upstash.io) or, if supplied in a tool call, any http(s) rest_url",
        "when": "only when redis_run_commands is called (HTTP transport)",
        "sends": "the Redis commands as JSON, the REST token as a Bearer header, and by default Upstash-Telemetry-Runtime/Platform/Sdk headers"
      },
      {
        "host": "the configured redis:// or rediss:// host (UPSTASH_REDIS_TCP_URL / REDIS_URL) or a connection_string from the tool call",
        "when": "only when redis_run_commands is called (TCP transport); connection kept open afterwards",
        "sends": "Redis commands and the credentials embedded in the connection string"
      },
      {
        "host": "context7.com (https://context7.com/api/v2/context, library /websites/upstash_redis)",
        "when": "only when redis_search_docs is called",
        "sends": "the search query text, User-Agent upstash-redis-mcp, and CONTEXT7_API_KEY as Bearer if set"
      }
    ],
    "env": [
      {
        "name": "UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN (and UPSTASH_REDIS_<NAME>_REST_URL/_REST_TOKEN)",
        "sent_to": "the matching Upstash REST endpoint (token as Bearer)"
      },
      {
        "name": "UPSTASH_REDIS_TCP_URL / REDIS_URL (and UPSTASH_REDIS_<NAME>_TCP_URL)",
        "sent_to": "the Redis host in that URL"
      },
      {
        "name": "CONTEXT7_API_KEY",
        "sent_to": "context7.com"
      },
      {
        "name": "UPSTASH_REDIS_READONLY, UPSTASH_DISABLE_TELEMETRY",
        "sent_to": "not sent; local switches"
      }
    ],
    "local": "Loads .env from the working directory (dotenv/config, index.js:767). With --debug only, appends a log to redis-mcp-debug.log in the package directory (index.js:241-256). No other file access.",
    "exec": "None. No child_process, eval or dynamic code loading.",
    "telemetry": "On by default: every REST request to the user's Upstash endpoint carries Upstash-Telemetry-Runtime (e.g. node@20.x), Upstash-Telemetry-Platform (OS, e.g. win32) and Upstash-Telemetry-Sdk (@upstash/redis-mcp@0.1.1) headers (index.js:425-437, 488). It goes only to Upstash, contains no data or identifiers, and is turned off with --disable-telemetry or UPSTASH_DISABLE_TELEMETRY=1. Not sent on TCP connections or to context7.",
    "tools": [
      "redis_run_commands",
      "redis_search_docs"
    ],
    "toolText": "clean (descriptions are accurate usage guidance; redis_search_docs asks the model to look up SEARCH.* syntax first, pointing only at this server's own tool; no hidden or invisible text)",
    "deps": [
      "@modelcontextprotocol/sdk",
      "zod",
      "commander",
      "@redis/client",
      "dotenv"
    ],
    "findings": [
      {
        "severity": "high",
        "at": "dist/index.js:815-866",
        "what": "Optional HTTP mode (--transport http) has no authentication, sends Access-Control-Allow-Origin: * and answers CORS preflight, and calls listen(port) without a host so it binds every interface. Any web page open in the user's browser, or anyone on the same network, can call redis_run_commands against the configured databases (read, overwrite, FLUSHALL). The default stdio mode is not affected. Do not use HTTP mode outside a locked-down container."
      },
      {
        "severity": "note",
        "at": "dist/index.js:425-437,488",
        "what": "Telemetry headers (runtime version, OS platform, SDK version) are on by default for REST calls to Upstash; opt out with --disable-telemetry / UPSTASH_DISABLE_TELEMETRY=1."
      },
      {
        "severity": "note",
        "at": "dist/index.js:196-214,593-595",
        "what": "redis_run_commands accepts rest_url+rest_token or connection_string in the tool input, so the model can make the server POST to any http(s) URL (with a bearer token of its choosing) or open a TCP connection to any Redis host. The only check is that the URL is http(s) or redis(s); there is no Upstash-domain allowlist. Credentials passed this way also go through the model's context."
      },
      {
        "severity": "note",
        "at": "dist/index.js:273-400,563,789",
        "what": "Read-only mode exists but is off by default (--readonly / UPSTASH_REDIS_READONLY). When on it uses an allowlist of the command name (first array element), which is a sound approach; it still allows TOUCH and WAIT. Without it the model can run any command, including EVAL, FLUSHALL and DEL."
      },
      {
        "severity": "note",
        "at": "dist/index.js:620-699",
        "what": "redis_search_docs sends the query to context7.com, a third party (not Upstash)."
      },
      {
        "severity": "note",
        "at": "dist/index.js:741,250-253",
        "what": "With --debug, full tool arguments (including any raw rest_token or connection_string passed in a call) are written to stderr and to redis-mcp-debug.log."
      },
      {
        "severity": "info",
        "at": "dist/index.js:786",
        "what": "Debug log path uses new URL('../', import.meta.url).pathname, which gives a malformed path on Windows ('/C:/...'); the write failure is silently ignored."
      },
      {
        "severity": "info",
        "at": "(package)",
        "what": "package.json was not among the reviewed files; dependencies listed come from imports. Line counts use the manifest convention (newline count + 1 per file, i.e. the empty segment after a final newline is counted); every line of every file was read with the Read tool."
      }
    ]
  },
  "health": {
    "score": 43,
    "parts": {
      "popularity": 0.19254671739363097,
      "activity": 0.33,
      "issues": null,
      "security": 1
    },
    "fail": 0,
    "warn": 0,
    "raw": {
      "stars": 0,
      "forks": 0,
      "downloads": 109,
      "hn": null,
      "issuesOpen": 0,
      "issuesClosed": 0,
      "prsMerged": 1,
      "commits90": 0,
      "release": "2026-07-08T14:32:22Z",
      "pushed": "2026-07-08T14:32:21Z",
      "growth": null,
      "growthDays": null,
      "archived": false
    },
    "at": "2026-10-31T07:42:38.200Z"
  },
  "icon": "/icons/co/upstash.png"
}
