{
  "markdown": "### Disclaimer: This is an independent, self-built project and is not an official Microsoft tool or service.\n\n# Patch Tuesday MCP Server\n\n[![patch-tuesday-mcp MCP server](https://glama.ai/mcp/servers/jonnybottles/patch-tuesday-mcp/badges/score.svg)](https://glama.ai/mcp/servers/jonnybottles/patch-tuesday-mcp)\n[![PyPI](https://img.shields.io/pypi/v/patch-tuesday-mcp)](https://pypi.org/project/patch-tuesday-mcp/)\n[![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.jonnybottles%2Fpatch--tuesday-blue)](https://registry.modelcontextprotocol.io/v0/servers?search=patch-tuesday)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n\nmcp-name: io.github.jonnybottles/patch-tuesday\n\nAsk your AI assistant about Microsoft security updates. This Python-based MCP (Model Context Protocol) server connects AI assistants like Claude, Copilot, and ChatGPT to the [MSRC Security Update Guide](https://msrc.microsoft.com/update-guide) — the authoritative source for every CVE Microsoft patches — enabling natural-language queries over Patch Tuesday releases: CVEs, KB articles, severity ratings, CVSS scores, affected products, and exploited-in-the-wild status.\n\n## What It Does\n\nPatch Tuesday MCP Server bridges Microsoft's official CVRF security update API and your AI assistant, allowing you to:\n\n- **Get the monthly rollup** - \"What did this month's Patch Tuesday fix?\"\n- **Find what's actively exploited** - \"Which vulnerabilities are being exploited in the wild?\"\n- **Look up any CVE** - \"Tell me about CVE-2026-41108\" (KBs, affected products, CVSS, description)\n- **Map KBs to CVEs** - \"Which vulnerabilities does KB5094123 fix?\"\n- **Filter by product** - \"What Critical CVEs affect Windows Server 2022 this month?\"\n- **Track zero-days** - \"Were any publicly disclosed vulnerabilities patched in April?\"\n- **See what's confirmed exploited** - \"Which of this month's CVEs are on the CISA KEV list?\" — with federal remediation due dates\n- **Rank by exploitation probability** - \"Show me CVEs with EPSS above 50%\" — daily FIRST.org exploit prediction scores\n- **Find zero-click, internet-reachable criticals** - \"Which Critical CVEs are network-reachable with no privileges and no user interaction?\" — filter on the parsed CVSS attack vector, privileges, and user-interaction fields\n- **Jump straight to authoritative sources** - every CVE detail carries ready-to-open MSRC, NVD, EPSS, and (when listed) CISA KEV reference links\n- **Avoid stale patches** - \"Is KB5087538 superseded by anything newer?\" — walks Microsoft's supersedence links\n- **Get mitigations when there's no patch yet** - \"Are there mitigations or workarounds for CVE-2026-47291?\" — surfaces Microsoft's mitigation, workaround, and will-not-fix guidance\n- **Spot trends over time** - \"How many HTTP.sys CVEs shipped over the last 6 months?\" (`months_back=6`, or `start_month`/`end_month`) — aggregates matches across released months with per-month counts\n- **Filter by Microsoft's own exploitation forecast** - \"Which of this month's CVEs does Microsoft rate 'Exploitation More Likely'?\" (`exploitation_likely=True`)\n- **Spot ransomware-weaponized CVEs** - \"Which CVEs this month are used in known ransomware campaigns?\" (`ransomware=True`; add `include_kev_details=True` for the full CISA entry with required actions)\n- **Plan the deployment, not just the priority** - \"Does KB5094123 require a restart, and what build fixes it?\" (`include_kb_details=True` adds per-KB URLs, fixed builds, supersedence, and restart requirements)\n- **Know what Microsoft says an update breaks** - \"Any known issues with KB5094126 before I roll it out?\" (`include_known_issues=True` adds each KB's Microsoft-confirmed known issues — symptoms, workarounds, and the resolving update — best-effort from its public support page; published mainly for Windows updates, and the response says explicitly when Microsoft publishes none)\n- **Know what an update changes, not just what it fixes** - \"What's actually in KB5099536 besides the security fixes?\" (`include_update_summary=True` adds the KB support page's summary and improvements highlights — the change-description content the MSRC security data doesn't carry — from the same page fetch as the known-issues lookup)\n- **Slice a month by weakness class** - \"Show me this month's use-after-free CVEs\" (`cwe=\"CWE-416\"` or `cwe=\"use after free\"`)\n- **Discover the release catalog** - \"Which monthly releases are available, and when were they last revised?\" (`list_months=True`)\n- **Export a triage briefing** - \"Give me this month's Critical CVEs as a Markdown report\" or \"…as CSV\" — a prioritized executive summary and table, or a spreadsheet-ready export (`format=\"markdown\"` / `format=\"csv\"`)\n- **Force-refresh & check data freshness** - \"Re-pull this month's data fresh\" (`force_refresh=True`) bypasses the in-process caches; `include_freshness=True` reports the cache age/TTL of the MSRC document and EPSS/KEV enrichment\n- **Prioritize patching** - Results are sorted most-urgent-first: KEV/exploited, then EPSS, then severity, then CVSS\n\nPerfect for security analysts, sysadmins, and IT professionals who triage Microsoft security updates every month — without clicking through the Security Update Guide portal.\n\nData comes from the official, public [MSRC CVRF v3 API](https://github.com/microsoft/MSRC-Microsoft-Security-Updates-API). No authentication or API key required.\n\n## Why This Server?\n\n**This is the only MCP server that models the Patch Tuesday release itself.** Plenty of MCP servers can look up a CVE — general-purpose vulnerability aggregators fan a known CVE ID out across NVD, OSV, and threat-intel feeds. They answer *\"tell me about CVE-X\"*. But they have no concept of a monthly Microsoft release, a KB article, or a product family — so they structurally cannot answer the questions a Microsoft shop actually asks on the second Tuesday of every month:\n\n| The question you actually have | Generic CVE lookup servers | patch-tuesday-mcp |\n|---|---|---|\n| \"Summarize this month's Patch Tuesday\" | ❌ no concept of a release | ✅ rollup + stats in one call |\n| \"What Critical CVEs affect Windows Server 2022 this month?\" | ❌ can't filter by Microsoft product | ✅ product & family filtering |\n| \"Which vulnerabilities does KB5094123 fix?\" | ❌ no KB awareness | ✅ KB ↔ CVE mapping |\n| \"What's being exploited in the wild right now?\" | ⚠️ per-CVE only, if you already know the CVE | ✅ filter the whole month |\n| \"What do I patch first?\" | ❌ | ✅ urgency-sorted: exploited/KEV → EPSS → severity → CVSS |\n| \"Which criticals are zero-click and internet-reachable?\" | ⚠️ per-CVE CVSS only | ✅ filter the month by parsed CVSS attack vector / privileges / user interaction |\n| \"Tell me about CVE-X\" | ✅ (often with more ecosystem data) | ✅ MSRC detail: KBs, builds, supersedence, parsed CVSS, MSRC/NVD/EPSS/KEV links |\n\nUnder the hood, the difference is the data source: this server parses the full **MSRC CVRF monthly documents** — the ProductTree, per-product severity threats, exploitability assessments, and KB remediation chains that per-CVE APIs never expose. That's what makes release-centric questions possible.\n\nOther things it deliberately gets right:\n\n- **Zero API keys, zero accounts** — the MSRC API is public; setup is one `uvx` command\n- **One tool, not thirty** — a single consolidated `msrc_search` keeps your AI client's context lean and tool selection reliable\n- **Built for the monthly workflow** — triage a release, brief your team, prioritize patching, then get on with your life\n\n## Try It Instantly — Hosted Endpoint (No Install)\n\nA free remote instance is available at:\n\n```\nhttps://patch-tuesday-mcp.agreeabledesert-d0b8e491.eastus2.azurecontainerapps.io/mcp\n```\n\nNo account or API key needed. The endpoint serves the same public data as a local install — for heavy use or guaranteed availability, run it locally (below) or [self-host your own](#self-hosting-as-a-remote-mcp-server). Only minimal, anonymized usage data is recorded — see [Telemetry & Privacy](#telemetry--privacy).\n\n## Requirements\n\n### General\n\n- **Python 3.11+**\n- An MCP-compatible client (Claude Desktop, Cursor, Claude Code, GitHub Copilot CLI, etc.)\n\n### Using `uvx` (Recommended)\n\nIf you are installing or running the server via **`uvx`**, you must have **uv** installed first.\n\n- **uv** (includes `uvx`): https://github.com/astral-sh/uv\n\nInstall uv:\n\n```bash\n# macOS / Linux\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# Windows (PowerShell)\nirm https://astral.sh/uv/install.ps1 | iex\n```\n\n> `uvx` allows you to run the MCP server without installing the package globally.\n\n### Using pip (Alternative)\n\n```bash\npip install patch-tuesday-mcp\n```\n\n## Installation\n\n### Install from PyPI\n\n```bash\nuvx patch-tuesday-mcp\n```\n\nOr install with pip:\n\n```bash\npip install patch-tuesday-mcp\n```\n\n### Upgrade to Latest Version\n\n```bash\nuvx patch-tuesday-mcp@latest\n```\n\nOr with pip:\n\n```bash\npip install --upgrade patch-tuesday-mcp\n```\n\n## Quick Setup\n\n[![Set up in VS Code](https://img.shields.io/badge/Set_up_in-VS_Code-0078d4?style=flat-square&logo=visualstudiocode)](https://vscode.dev/redirect/mcp/install?name=patch-tuesday-mcp&config=%7B%22type%22%3A%20%22stdio%22%2C%20%22command%22%3A%20%22uvx%22%2C%20%22args%22%3A%20%5B%22patch-tuesday-mcp%22%5D%7D)\n[![Set up in Cursor](https://img.shields.io/badge/Set_up_in-Cursor-000000?style=flat-square&logo=cursor)](https://cursor.com/docs/context/mcp)\n[![Set up in Claude Code](https://img.shields.io/badge/Set_up_in-Claude_Code-9b6bff?style=flat-square&logo=anthropic)](https://code.claude.com/docs/en/mcp)\n[![Set up in Copilot CLI](https://img.shields.io/badge/Set_up_in-Copilot_CLI-28a745?style=flat-square&logo=github)](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli)\n\n> **One-click setup:** Click the VS Code badge for automatic configuration (requires `uv` installed)\n> **Manual setup:** See instructions below for VS Code, Cursor, Claude Code, Copilot CLI, or Claude Desktop\n\n## Features\n\n- **msrc_search** – Search and filter Microsoft security updates by keyword, CVE, KB number, month, product, severity, CVSS score, exploited-in-the-wild status, or public disclosure. When no month is given, results default to the most recent release whose Patch Tuesday has already occurred — the upcoming month's pre-release document (early Chromium/out-of-band entries only) is skipped by default and available explicitly via `month=`. Results are enriched with **EPSS scores** (FIRST.org 30-day exploitation probability, `min_epss=0.5` filter) and **CISA KEV** catalog status with federal remediation due dates (`kev=True` filter) — both public, keyless sources. Filter by the **parsed CVSS v3.x exposure fields** — `attack_vector` (N/A/L/P), `privileges_required` (N/L/H), `user_interaction` (N/R), and `scope` (U/C) — to isolate, for example, network-reachable zero-click criticals; matching results surface a structured `cvss` object broken out from the raw vector string. Every CVE detail also includes a **references** block of ready-to-open links (MSRC update guide, NVD, EPSS API, and the CISA KEV catalog when the CVE is listed). Add `include_chain=True` to a KB lookup to walk Microsoft-stated **supersedence chains** (which KBs it replaces, newest → oldest). Pass a **list of KB numbers** (`kb=[\"5094123\", \"KB5094127\", ...]`, up to 30) to resolve them all in one call — e.g. a machine's installed-update list as context for a patch report — and get a grouped response with one per-KB entry (found or not-found, each with the same body as a single-KB lookup); every monthly document is still fetched upstream at most once for the whole batch. Add `include_known_issues=True` to any KB lookup (single or batched) for the **Microsoft-confirmed known issues** of each update — issue titles, symptoms, workarounds, and the resolving KB when Microsoft names one — scraped best-effort from the KB's public support page with an honest per-KB status: `published`, `none_published` (Microsoft publishes no known-issues data for that KB — the norm outside Windows OS updates), or `unavailable` (retrieval/parse failure, explicitly distinct from \"no issues\"); it reports what Microsoft has confirmed breaks, not a prediction for your environment. Add `include_update_summary=True` to a KB lookup for **what the update changes** — the support page's Summary/Highlights text plus its Improvements bullet list (size-capped, `truncated` marks a capped block) with the same honest three-way status; both support-page blocks are served by a single fetch and one shared cache record. Add `include_guidance=True` to a CVE lookup to surface Microsoft-provided **mitigations, workarounds, and will-not-fix advisories** alongside the vendor-fix KBs. Pass `format=\"markdown\"` or `format=\"csv\"` to a monthly/filtered search to get an additive **triage briefing** — a prioritized executive summary and table (Markdown) or a spreadsheet-ready export with stable columns (CSV) — rendered from the same urgency ranking; the JSON `vulnerabilities` list is always included. Use `force_refresh=True` to bypass the in-process caches and re-fetch the MSRC document and EPSS/KEV enrichment for the request, and `include_freshness=True` to add a **freshness** block reporting the cache age and TTL of the MSRC document and enrichment data. Search a **historical range** instead of a single month with `months_back=N` (the N most recent released months) or `start_month`/`end_month` — the response aggregates matching CVEs across the range and adds per-month **trend** counts; ranges are capped at 12 months and reuse the existing cache/concurrency controls. Set `include_stats=True` for aggregate counts (by severity, impact, product family, exploited, KEV). Use `limit=0` with `include_stats=True` for a stats-only month overview. Filter on **Microsoft's exploitation-likelihood assessment** with `exploitation_likely=True` (\"Exploitation More Likely\"/\"Exploitation Detected\"; matches carry an `exploitation_assessment` field) and on **known ransomware campaign use** with `ransomware=True` (from the CISA KEV catalog). Opt into richer rows where you need them: `include_references=True` adds the MSRC/NVD/EPSS/KEV link block to month/KB/trend list results, `include_kev_details=True` replaces the boolean KEV flag with the full catalog entry (due date, required action, vendor/product, ransomware use), `include_kb_details=True` expands KB numbers into full objects with per-KB URL, fixed build, supersedence, sub-type, and **restart-required** status, and `include_temporal=True` adds Microsoft's **CVSS temporal score** to cvss blocks. Filter by **weakness class** with `cwe=` (ID or name substring, e.g. `cwe=\"CWE-416\"`). Use `list_months=True` to fetch the **release catalog** (every available month with initial/current release dates — handy for valid `month=` values and spotting same-month revisions). All new fields are opt-in: the default JSON shape is unchanged.\n\n## Product profiles (watchlists)\n\nScope any search to the products you actually run. Pass `product_profile=\"identity-core\"` (built-in profiles: `identity-core`, `endpoint`, `server-infrastructure`) or supply ad-hoc `products=[\"Exchange Server\", \"Windows Server\"]` / `product_families=[\"Windows\", \"Azure\"]`. A vulnerability is kept if it matches **any** listed product or family. All matching is local — profile contents are never transmitted to MSRC, FIRST.org, CISA, or telemetry.\n\nOverride or extend the built-ins by pointing `MSRC_PROFILES_PATH` at a JSON file:\n\n```json\n{\n  \"my-estate\": {\n    \"families\": [\"Windows\", \"Azure\"],\n    \"products\": [\"Exchange Server\", \"Microsoft Entra\"]\n  }\n}\n```\n\nEach entry may set `products` and/or `families` (case-insensitive partial matchers). A file entry with the same name as a built-in replaces it. An unknown `product_profile`, or a missing/invalid `MSRC_PROFILES_PATH`, returns a clear `invalid_input` error rather than falling back to a broad, unscoped result.\n\n### Companion triage skill\n\nA portable [agent skill](skills/README.md) — `patch-tuesday-triage` — teaches an AI agent how to drive `msrc_search` through the monthly workflow (which searches to run, in what order, how to prioritize). It's plain Markdown and can be **deployed independently of this server**: copy `skills/patch-tuesday-triage/` into your agent's skills directory. See [`skills/README.md`](skills/README.md) for deployment details.\n\n## Guided triage prompt\n\nThe server registers an MCP **prompt** named `monthly_triage`. MCP clients that support prompts can select it to get a step-by-step analyst workflow built entirely on `msrc_search` — publicly disclosed zero-days, CISA KEV, exploited, network/no-auth/no-UI criticals, identity-adjacent products, endpoint/Intune, and a briefing. It accepts two optional arguments: `product_profile` (scope the whole workflow to a watchlist) and `month` (triage a specific release). No new tools are introduced — the prompt only orchestrates `msrc_search` calls.\n\nA portable, plain-text copy of this prompt lives under [`prompts/`](prompts/README.md) so the workflow can be used **independently of the server**.\n\n## Prompt Examples\n\nOnce connected to an MCP client, you can ask questions like:\n\n1. **Monthly overview**: \"Summarize this month's Patch Tuesday\"\n2. **Exploited vulnerabilities**: \"Which Microsoft vulnerabilities are being actively exploited?\"\n3. **CVE lookup**: \"What is CVE-2026-41108 and which KB fixes it?\"\n4. **KB lookup**: \"What does KB5094123 patch?\"\n5. **Machine patch report**: \"Here are the KBs installed on this server: KB5094123, KB5094127, KB5093998 — what do they fix and is anything superseded?\"\n6. **Product filter**: \"Show me Critical vulnerabilities affecting Exchange Server this month\"\n7. **Patch prioritization**: \"What should I patch first from the June 2026 updates?\"\n8. **CISA KEV**: \"Which of this month's CVEs are on the CISA KEV list?\"\n9. **EPSS**: \"Show me CVEs with EPSS above 50%\"\n10. **Exposure filtering**: \"Which Critical CVEs are network-reachable with no privileges and no user interaction?\"\n11. **Reference links**: \"Give me the MSRC, NVD, and EPSS links for CVE-2026-41108\"\n12. **Mitigations & workarounds**: \"Are there any mitigations or workarounds for CVE-2026-41108?\"\n13. **Triage report**: \"Give me this month's Critical CVEs as a Markdown briefing\" (or \"…export them as CSV\")\n14. **Fresh data on demand**: \"Re-pull this month's updates fresh and tell me how current the data is\" (`force_refresh=True`, `include_freshness=True`)\n15. **Historical trends**: \"How many HTTP.sys RCE CVEs shipped over the last 6 months?\" (`query=\"HTTP.sys\"`, `months_back=6`)\n16. **Supersedence**: \"Is KB5087538 superseded by anything newer?\"\n17. **Exploitation forecast**: \"Which CVEs does Microsoft rate 'Exploitation More Likely' this month?\"\n18. **Ransomware**: \"Which of this month's CVEs are used in known ransomware campaigns?\"\n19. **Deployment planning**: \"Does KB5094123 require a restart, and which build fixes it?\"\n20. **Known issues before rollout**: \"What has Microsoft confirmed breaks in KB5094126, and is there a fix or workaround?\" (`include_known_issues=True`)\n21. **What's in an update**: \"Summarize what KB5099536 changes beyond the security fixes\" (`include_update_summary=True`)\n22. **Weakness class**: \"Show me this month's use-after-free vulnerabilities\" (`cwe=\"CWE-416\"`)\n23. **Release catalog**: \"Which Patch Tuesday months are available to query?\"\n24. **Product watchlist**: \"Show me this month's Critical CVEs across my estate\" (`product_profile=\"identity-core\"`, `severity=\"Critical\"`)\n25. **Guided triage**: \"Walk me through this month's triage for my identity estate\" (selects the `monthly_triage` prompt with `product_profile=\"identity-core\"`)\n\n## Usage\n\n### Run the MCP Server\n\n```bash\nuvx patch-tuesday-mcp\n```\n\nOr if installed with pip:\n\n```bash\npatch-tuesday-mcp\n```\n\n### Connect from VS Code\n\n**Option 1: One-Click Install (Recommended)**\n\nClick the **[Set up in VS Code](#quick-setup)** badge at the top of this README for automatic configuration (requires `uv` installed).\n\n**Option 2: Manual Configuration**\n\nVS Code stores MCP servers in a **dedicated `mcp.json` file — not `settings.json`.** Open the Command Palette (`Ctrl+Shift+P` on Windows/Linux, `Cmd+Shift+P` on macOS) and run one of:\n\n- **`MCP: Open User Configuration`** — edits your user-level `mcp.json` (available in every workspace)\n- **`MCP: Open Workspace Folder Configuration`** — edits a project-local `.vscode/mcp.json`\n\nThen add the server. Note that VS Code uses a top-level **`\"servers\"`** key (unlike the `\"mcpServers\"` key used by the other clients below):\n\n```json\n{\n  \"servers\": {\n    \"patch-tuesday\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\"patch-tuesday-mcp\"]\n    }\n  }\n}\n```\n\n### Connect from Claude Desktop\n\nAdd to your Claude Desktop MCP config:\n\n- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- Windows: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n**Using uvx (recommended)**\n\n```json\n{\n  \"mcpServers\": {\n    \"patch-tuesday\": {\n      \"command\": \"uvx\",\n      \"args\": [\"patch-tuesday-mcp\"]\n    }\n  }\n}\n```\n\n**Using installed package**\n\n```json\n{\n  \"mcpServers\": {\n    \"patch-tuesday\": {\n      \"command\": \"patch-tuesday-mcp\"\n    }\n  }\n}\n```\n\n### Connect from Cursor\n\n**Option 1: One-Click Install (Recommended)**\n\n```\ncursor://anysphere.cursor-deeplink/mcp/install?name=patch-tuesday-mcp&config=eyJjb21tYW5kIjogInV2eCIsICJhcmdzIjogWyJwYXRjaC10dWVzZGF5LW1jcCJdfQ==\n```\n\n**Option 2: Manual Configuration**\n\nAdd to your Cursor MCP config (`~/.cursor/mcp.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"patch-tuesday\": {\n      \"command\": \"uvx\",\n      \"args\": [\"patch-tuesday-mcp\"]\n    }\n  }\n}\n```\n\n### Connect from Claude Code\n\n```bash\nclaude mcp add --transport stdio patch-tuesday -- uvx patch-tuesday-mcp\n```\n\n### Connect from GitHub Copilot CLI\n\nAdd to `~/.copilot/mcp-config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"patch-tuesday\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\"patch-tuesday-mcp\"]\n    }\n  }\n}\n```\n\n## Self-Hosting as a Remote MCP Server\n\nThe server also supports the HTTP transport for remote/shared deployments:\n\n```bash\nMCP_TRANSPORT=http MCP_PORT=8000 patch-tuesday-mcp\n# MCP endpoint: http://localhost:8000/mcp\n```\n\nOr with Docker:\n\n```bash\ndocker build -t patch-tuesday-mcp .\ndocker run -p 8000:8000 patch-tuesday-mcp\n```\n\nHTTP-mode environment variables:\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MCP_TRANSPORT` | `stdio` | Set to `http` for remote serving |\n| `MCP_HOST` / `MCP_PORT` | `0.0.0.0` / `8000` | Bind address |\n| `MCP_MAX_BODY_BYTES` | `262144` | Max request body size, returns 413 above it (`0` disables) |\n| `MCP_CORS_ORIGINS` | `*` (all) | Comma-separated allowlist of browser origins. **Set an explicit list for public deployments** (e.g. `https://app.example.com`) |\n| `MCP_LIMIT_CONCURRENCY` | `40` | Max concurrent in-flight connections; uvicorn responds 503 beyond it (`0` disables) |\n| `MCP_TIMEOUT_KEEP_ALIVE` | `15` | Seconds before idle keep-alive connections are closed |\n| `MCP_LOG_LEVEL` | `WARNING` | Root log level (`DEBUG`/`INFO`/`WARNING`/`ERROR`/`CRITICAL`); logs go to stderr |\n| `MCP_MSRC_MAX_RESPONSE_BYTES` | `67108864` (64 MiB) | Cap on a single MSRC upstream response body (read while streaming, never buffered past the cap) |\n| `MCP_ENRICHMENT_MAX_RESPONSE_BYTES` | `33554432` (32 MiB) | Cap on a single EPSS/KEV upstream response body |\n| `MCP_KNOWN_ISSUES_MAX_RESPONSE_BYTES` | `4194304` (4 MiB) | Cap on a single support.microsoft.com KB-page body (known-issues / update-summary lookups) |\n| `APPLICATIONINSIGHTS_CONNECTION_STRING` | unset | Opt-in usage telemetry (requires `pip install patch-tuesday-mcp[telemetry]`) |\n| `MCP_DEPRECATION_SUNSET` | unset | ISO date (`YYYY-MM-DD`) this deployment stops serving. Set **together with** `MCP_DEPRECATION_REPLACEMENT_URL` to announce a migration (see below) |\n| `MCP_DEPRECATION_REPLACEMENT_URL` | unset | URL clients should move to |\n| `MCP_DEPRECATION_SINCE` | unset | Optional ISO date the deprecation was announced (emitted as an RFC 9745 `Deprecation` date) |\n| `MCP_DEPRECATION_MESSAGE` | unset | Optional override for the human-readable notice text |\n\n### Announcing a deprecation (self-hosters)\n\nIf you are retiring a deployment, set `MCP_DEPRECATION_SUNSET` and\n`MCP_DEPRECATION_REPLACEMENT_URL` on **that deployment only**. The server then\nreports the migration through four channels:\n\n- a `deprecation` block on every `msrc_search` response (and on `/health`)\n- `Deprecation`, `Sunset`, and `Link: <url>; rel=\"successor-version\"` response\n  headers ([RFC 9745](https://www.rfc-editor.org/rfc/rfc9745.html),\n  [RFC 8594](https://www.rfc-editor.org/rfc/rfc8594.html),\n  [RFC 5829](https://www.rfc-editor.org/rfc/rfc5829.html))\n- the MCP server `instructions` shown to clients at connection time\n- the `msrc_search` tool description\n\nAll of it is **descriptive**: it states facts about the deployment. It never\ninstructs a connected agent to say or do anything — tool output that issues\ndirectives to someone else's model is prompt injection, however benign the\npayload. Leave the variables unset and behavior is byte-for-byte unchanged;\nsetting only one of the two pair, or a malformed date, is ignored.\n\nHTTP mode also serves `GET /health` (liveness endpoint) and runs stateless,\nso it can scale to multiple replicas behind a load balancer without session\naffinity.\n\n### Hardening a public HTTP deployment\n\nThe HTTP transport is **unauthenticated** — `msrc_search` only reads public\nvulnerability data, but an open endpoint is still abusable. Before exposing it\nto the internet:\n\n- **Put it behind an authenticated front door.** Terminate TLS and require auth\n  at a reverse proxy / API gateway (e.g. Azure API Management, an OAuth2/OIDC\n  proxy such as `oauth2-proxy`, Cloudflare Access, or your ingress controller's\n  auth). This server intentionally ships no built-in auth so you can layer your\n  organization's standard access control in front of it.\n- **Restrict CORS.** Set `MCP_CORS_ORIGINS` to the exact origins of your MCP\n  clients instead of the permissive `*` default.\n- **Keep the defaults on.** Leave `MCP_MAX_BODY_BYTES` and\n  `MCP_LIMIT_CONCURRENCY` at their defaults (or tighten them) — they are your\n  first line of defense against oversized payloads and connection exhaustion.\n- **Upstream reads are bounded and redirect-free.** Responses from MSRC/EPSS/\n  KEV are size-capped while streaming and HTTP redirects are never followed,\n  so a misbehaving upstream can't exhaust container memory.\n\nLocal `stdio` usage is unaffected by all of the above; none of this middleware\nruns for the default transport.\n\nThe container runs on any host that can serve HTTP — Azure Container Apps, Cloud Run, Fly.io, or a plain VM.\n\n## Telemetry & Privacy\n\n- **Local stdio (the default): no telemetry, ever** — there is no code path that sends anything.\n- **The hosted endpoint** records minimal usage data to Azure Application Insights (90-day retention): a daily-salted hash of the client IP (raw IPs are never stored; they are only held briefly in memory for abuse protection), request path and timestamp, which tool parameters were used (parameter *names* only — never your query text or CVE/KB values; only the low-cardinality `month` and `severity` values are kept), result counts, latency, and error categories. No cookies, no accounts, no request/response bodies.\n- **Self-hosted HTTP** collects nothing unless you set `APPLICATIONINSIGHTS_CONNECTION_STRING` to your own resource — then the same minimal set flows to your instance instead.\n\n## Development\n\n```bash\npip install -e \".[dev]\"\npytest                  # offline suite (mocked feeds)\npytest --run-live       # also run live smoke tests against the real MSRC / EPSS / KEV APIs\npytest --cov=patch_tuesday_mcp   # coverage (CI enforces >= 90%)\nruff check src/ tests/\n```\n\nCI (GitHub Actions) runs the offline suite on Python 3.11/3.12/3.14 with a coverage\ngate, lints with ruff, builds the container, scans it with Trivy, and produces\nan SPDX SBOM on every push/PR. Release builds attest provenance for the\npublished wheel/sdist. Dependencies are locked in `uv.lock` (used by the Docker\nbuild via `uv sync --locked`).\n\n## Security\n\nSee [SECURITY.md](SECURITY.md) for the supported versions, scope, and how to\nreport a vulnerability privately.\n\n## License\n\nMIT\n",
  "bytes": 28434,
  "sha": "13fba6b1bc01e9fb754fc72813825df72fc08a51369a04e7cfa15864f6ab84fd",
  "repo_slug": "jonnybottles/patch-tuesday-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_jonnybottles_patch_tuesday_15b0c9e2/readme"
}