{
  "data": {
    "tool": {
      "category": "observability",
      "endpoint": "https://agents.releases.sh/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/releases-mcp.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/releases-mcp.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/releases-mcp.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 6841,
          "counts": {
            "error": 0,
            "note": 2,
            "warn": 2
          },
          "findings": [
            {
              "rule": "TC14",
              "severity": "warn",
              "tool": "get_latest_releases",
              "message": "allowed values are in the description, not an enum: since",
              "fix": "Move them into enum."
            },
            {
              "rule": "TC14",
              "severity": "warn",
              "tool": "search",
              "message": "allowed values are in the description, not an enum: product, since",
              "fix": "Move them into enum."
            },
            {
              "rule": "TC11",
              "severity": "note",
              "tool": "manage_webhook",
              "message": "a parameter is documented in the description but not in the schema: action",
              "fix": "Put each one in its property's description (in Python: Annotated[str, Field(description=...)])."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "18 of 18 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:25:54Z",
        "count": 18,
        "schemaTokens": 6841,
        "status": "ok",
        "tools": [
          {
            "name": "search",
            "title": "Search",
            "description": "Unified search across the registry and release content. Returns up to four sections — organizations, catalog entries (products + standalone sources folded into one list), curated collections (cross-org playlists), and releases with CHANGELOG chunks interleaved by relevance.\n\nUse `type` to narrow the surfaces you want and skip the expensive paths. For example, pass `type: ['catalog']` to look up a known entity by name (fast, registry-only); pass `type: ['releases']` when you only care about release content and want to avoid entity lookups. Omit `type` to search all four.\n\nCollections surface via two paths: a direct match on the collection's name/description (lexical in every mode, plus a vector match in hybrid/semantic mode) and a member rollup that includes every collection containing one of the matched orgs. Member rollups carry a list of result-set org slugs that triggered the rollup so a UI can render an \"includes X\" hint.\n\nUse `entity` (product slug / prod_ id OR source slug / src_ id) to scope release results to one catalog entry. Product identifiers expand to every source under the product. Use `organization` to scope to a whole org. Release retrieval defaults to hybrid (FTS5 + semantic vectors fused via RRF); it silently degrades to lexical when vector infra is unavailable and flags the result.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "domain": {
                  "description": "Scope to the org owning this domain. Input is normalized (scheme/path/www stripped, lowercased), so `https://vercel.com/` and `vercel.com` both work. Falls back to a 'no match' message when the domain isn't owned by anything indexed. Use this instead of `organization` when you have a URL-shaped input.",
                  "type": "string"
                },
                "entity": {
                  "description": "Scope release results to one catalog entry. Accepts a prod_ id (expands to every source under the product), a src_ id, or an org-scoped coordinate in the form orgSlug/slug (e.g. 'vercel/nextjs'). Bare slugs without an org prefix are not accepted.",
                  "type": "string"
                },
                "include_coverage": {
                  "description": "Include releases grouped as coverage of another (e.g. marketing posts that re-announce a platform release). Defaults to false so each underlying launch appears once.",
                  "type": "boolean"
                },
                "include_empty": {
                  "description": "Include orgs with zero indexed releases in the `orgs` section. Default false — empty orgs are stubs and surface as noise. Scoping by `domain` ignores this and always returns the resolved org.",
                  "type": "boolean"
                },
                "kind": {
                  "description": "Filter to a specific source/product kind. Release hits resolve through `source.kind ?? product.kind`; catalog hits filter on the row's own kind. The orgs and collections sections are unaffected; changelog chunk hits are unaffected.",
                  "enum": [
                    "platform",
                    "sdk",
                    "mobile",
                    "desktop",
                    "docs",
                    "integration",
                    "tool"
                  ],
                  "type": "string"
                },
                "limit": {
                  "description": "Max results per section (default 20)",
                  "type": "number"
                },
                "mode": {
                  "description": "Release-retrieval strategy. 'hybrid' (default) fuses FTS + vector results. 'lexical' is legacy FTS only. 'semantic' is vectors only. Falls back to lexical if vector infra is unavailable.",
                  "enum": [
                    "lexical",
                    "semantic",
                    "hybrid"
                  ],
                  "type": "string"
                },
                "organization": {
                  "description": "Scope release results to sources belonging to this organization. Accepts an org_ id, slug, or registered domain.",
                  "type": "string"
                },
                "product": {
                  "description": "Scope release results to a specific product's sources. Accepts a prod_ id or an org-scoped coordinate in the form orgSlug/productSlug (e.g. 'vercel/next-js'). Bare slugs without an org prefix are not accepted. When both `entity` and `product` are supplied, `entity` takes precedence. The resolved product coordinate is echoed on `_meta.search.product`.",
                  "type": "string"
                },
                "query": {
                  "description": "Search query",
                  "type": "string"
                },
                "since": {
                  "description": "Keep only release hits published at or after this bound. Accepts an ISO date/datetime (`2026-01-01`) or relative shorthand (`90d`, `4w`, `6m`, `2y`). Filters `published_at`; undated releases are dropped. Only the releases section is affected — great for capability-discovery queries like 'who added X in the last 90 days'.",
                  "type": "string"
                },
                "type": {
                  "description": "Which sections to return. Omit to return all four. Use to skip expensive paths — e.g. ['catalog'] for registry-only lookups, ['releases'] for pure release search, ['collections'] for a quick playlist lookup.",
                  "items": {
                    "enum": [
                      "orgs",
                      "catalog",
                      "releases",
                      "collections"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "until": {
                  "description": "Keep only release hits published at or before this bound. Same input formats as `since`.",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Search"
            }
          },
          {
            "name": "get_latest_releases",
            "title": "Get latest releases",
            "description": "Get the most recent releases, optionally filtered by product or organization. Excludes prereleases (canaries / alphas / betas / RCs) by default — pass `include_prereleases: true` to include them.\n\nCursor-paginated: pass `limit` for slice size (default 10), `cursor` to continue from a prior call. The result's `_meta.pagination` carries `kind: 'cursor'`, `hasMore`, and `nextCursor` when more rows exist; the response text echoes `nextCursor` so an LLM caller can chain without parsing `_meta`. Cursors are stable under inserts — a release added between calls won't shift the slice.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "cursor": {
                  "description": "Opaque continuation token from a prior call's `_meta.pagination.nextCursor`. Pass to fetch the next slice. Stale cursors are silently ignored — the call returns a fresh head of the feed.",
                  "type": "string"
                },
                "include_coverage": {
                  "description": "Include releases grouped as coverage of another (e.g. marketing posts that re-announce a platform release). Defaults to false so each underlying launch appears once.",
                  "type": "boolean"
                },
                "include_prereleases": {
                  "description": "Include prerelease tags (alphas, betas, RCs, canaries). Defaults to false so the feed matches the public web view.",
                  "type": "boolean"
                },
                "kind": {
                  "description": "Filter to releases from sources of a specific kind. Resolves through `source.kind ?? product.kind`, so an SDK repo with no own kind still matches its product's kind. Omit to include all kinds.",
                  "enum": [
                    "platform",
                    "sdk",
                    "mobile",
                    "desktop",
                    "docs",
                    "integration",
                    "tool"
                  ],
                  "type": "string"
                },
                "limit": {
                  "description": "Slice size (1–200). Defaults to 10.",
                  "maximum": 200,
                  "minimum": 1,
                  "type": "integer"
                },
                "minImportance": {
                  "description": "Only include releases with an AI-scored `importance` \u003e= this value (1-5; 5=landmark, 1=housekeeping). Releases with no score (unscored) are excluded when this is set. Mirrors the REST `?minImportance=` filter.",
                  "maximum": 5,
                  "minimum": 1,
                  "type": "integer"
                },
                "organization": {
                  "description": "Filter to sources belonging to this organization. Accepts an org_ id, slug, or registered domain.",
                  "type": "string"
                },
                "product": {
                  "description": "Filter to a product's cross-source release feed. Accepts a prod_ id (expands to ALL sources under the product), a src_ id (single source), or an org-scoped coordinate in the form orgSlug/productSlug (e.g. 'vercel/next-js'). Bare slugs without an org prefix are not accepted. Mirrors the REST ?product= expansion — multi-source products (e.g. Next.js with GitHub releases + blog) return releases from all of their sources interleaved.",
                  "type": "string"
                },
                "since": {
                  "description": "Keep only releases published at or after this bound. Accepts an ISO date/datetime (`2026-01-01`) or relative shorthand (`90d`, `4w`, `6m`, `2y`). Filters `published_at`; undated releases are dropped.",
                  "type": "string"
                },
                "type": {
                  "description": "Filter by release type: 'feature' for individual releases, 'rollup' for seasonal/quarterly catch-all posts. Omit to include both.",
                  "enum": [
                    "feature",
                    "rollup"
                  ],
                  "type": "string"
                },
                "until": {
                  "description": "Keep only releases published at or before this bound. Same input formats as `since`.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Get latest releases"
            }
          },
          {
            "name": "list_catalog",
            "title": "List catalog",
            "description": "List catalog entries — products and standalone sources combined into one list with an `entryType: 'product' | 'source'` discriminator per row.\n\nOrgs that group multiple sources under a product (e.g. Vercel → Next.js, Turborepo) surface those products; orgs with a single source that isn't part of a product surface it directly as an `entryType: 'source'` entry. Either shape is a reasonable thing to pass to `search(entity: ...)`.\n\nPaginated: defaults to 50 entries per page. Pass `page: 2` for the next slice. The footer surfaces the total when more pages exist.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "kind": {
                  "description": "Filter to catalog entries of a specific kind. Matches each row's own kind (a product's kind, or a standalone source's kind) — no source→product inheritance on this catalog surface. Omit to include all kinds.",
                  "enum": [
                    "platform",
                    "sdk",
                    "mobile",
                    "desktop",
                    "docs",
                    "integration",
                    "tool"
                  ],
                  "type": "string"
                },
                "limit": {
                  "description": "Entries per page (1–200). Defaults to 50.",
                  "maximum": 200,
                  "minimum": 1,
                  "type": "integer"
                },
                "organization": {
                  "description": "Organization to scope to. Accepts an org_ id, slug, domain, or name.",
                  "type": "string"
                },
                "page": {
                  "description": "1-based page number. Defaults to 1.",
                  "maximum": 9007199254740991,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "List catalog"
            }
          },
          {
            "name": "get_catalog_entry",
            "title": "Get catalog entry",
            "description": "Detail for a single catalog entry — accepts a prod_ id, src_ id, or an org-scoped coordinate in the form orgSlug/slug (e.g. 'vercel/nextjs' or 'vercel/next-js'). Returns the union of product / source detail fields depending on the entry kind. Source entries list tracked CHANGELOG files by path and byte size. Pass `include_changelog: true` to inline the root CHANGELOG, or `changelog_path` / `changelog_offset` / `changelog_limit` / `changelog_tokens` to embed a specific file or slice — heading-aligned, supports per-package files in monorepos (e.g. `packages/next/CHANGELOG.md`), and emits `totalTokens` / `sliceTokens` for LLM context budgeting. Files over 1MB are flagged as truncated so you know the tail is missing.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "changelog_limit": {
                  "description": "Target slice size in characters. Slice ends at a heading boundary. Defaults to 40000 when slicing without a token budget. Passing this implies include_changelog.",
                  "type": "number"
                },
                "changelog_offset": {
                  "description": "Character offset into the selected CHANGELOG. Snapped forward to the next heading unless 0. Passing this implies include_changelog.",
                  "type": "number"
                },
                "changelog_path": {
                  "description": "Specific CHANGELOG path for a source-kind entry (e.g. 'packages/next/CHANGELOG.md'). Passing this implies include_changelog.",
                  "type": "string"
                },
                "changelog_tokens": {
                  "description": "Target slice size in tokens (cl100k_base). Takes precedence over changelog_limit. Recommended brackets: 2000, 5000, 10000, 20000. Passing this implies include_changelog.",
                  "type": "number"
                },
                "identifier": {
                  "description": "Catalog entry identifier: prod_ id, src_ id, or org-scoped coordinate orgSlug/slug (e.g. 'vercel/nextjs'). Bare slugs without an org prefix are not accepted.",
                  "type": "string"
                },
                "include_changelog": {
                  "description": "When true, inline the root tracked CHANGELOG for a source-kind entry. Ignored for products.",
                  "type": "boolean"
                }
              },
              "required": [
                "identifier"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Get catalog entry"
            }
          },
          {
            "name": "list_organizations",
            "title": "List organizations",
            "description": "List all indexed organizations, optionally filtered. Paginated: defaults to 50 entries per page; pass `page: 2` for the next slice. Orgs with zero indexed releases are hidden by default (curator-stub noise); set `include_empty: true` to see them.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "category": {
                  "description": "Filter to a single category slug (e.g. `ai`, `devops`). Aliases (e.g. `e-commerce`) resolve to their canonical category (`commerce`); unknown values are ignored (unfiltered).",
                  "type": "string"
                },
                "include_empty": {
                  "description": "Include orgs with zero indexed releases. Default false — empty orgs are stubs from in-flight discovery or broken parsers and surface as noise on the public catalog.",
                  "type": "boolean"
                },
                "limit": {
                  "description": "Entries per page (1–200). Defaults to 50.",
                  "maximum": 200,
                  "minimum": 1,
                  "type": "integer"
                },
                "page": {
                  "description": "1-based page number. Defaults to 1.",
                  "maximum": 9007199254740991,
                  "minimum": 1,
                  "type": "integer"
                },
                "platform": {
                  "description": "Filter to orgs with an account on this platform",
                  "type": "string"
                },
                "query": {
                  "description": "Search across org name, slug, domain, and account handles",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "List organizations"
            }
          },
          {
            "name": "get_organization",
            "title": "Get organization",
            "description": "Get detailed information about a single organization — accounts, tags, sources, products, aliases. When an AI-generated overview exists the response includes a short preview; pass `include_overview: true` to inline the full briefing (with a stale warning if the content is older than 30 days since last write).",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "identifier": {
                  "description": "Organization identifier. Accepts an org_ id, slug, domain, name, or account handle.",
                  "type": "string"
                },
                "include_overview": {
                  "description": "When true, inline the full AI-generated overview instead of the default first-paragraph preview.",
                  "type": "boolean"
                }
              },
              "required": [
                "identifier"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Get organization"
            }
          },
          {
            "name": "lookup_domain",
            "title": "Lookup by domain",
            "description": "Resolve a domain to the org or product that owns it. The domain is normalized first (scheme, `www.`, path, and trailing slash stripped, lowercased), so `https://vercel.com/about` and `vercel.com` both look up the same row.\n\nReturns the matching org (with primary-vs-alias distinction) and any products whose alias targets the same domain. Pure resolution — does not probe the domain or materialize anything; unknown domains surface a 'no match' message. Use `lookup_domain` when you have a URL-shaped input; use `get_organization` when you already have a slug or id.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "domain": {
                  "description": "Domain to resolve. Any URL-shaped form is accepted; the server normalizes it.",
                  "type": "string"
                }
              },
              "required": [
                "domain"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Lookup by domain"
            }
          },
          {
            "name": "list_collections",
            "title": "List collections",
            "description": "List curated collections — named cross-org playlists (e.g. 'Frontier AI Labs') independent of the fixed category taxonomy.\n\nUse `get_collection` for a collection's full member list, or `get_collection_releases` for the interleaved cross-org release feed. Paginated: defaults to 50 entries per page; pass `page: 2` for the next slice.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "limit": {
                  "description": "Entries per page (1–200). Defaults to 50.",
                  "maximum": 200,
                  "minimum": 1,
                  "type": "integer"
                },
                "page": {
                  "description": "1-based page number. Defaults to 1.",
                  "maximum": 9007199254740991,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "List collections"
            }
          },
          {
            "name": "get_collection",
            "title": "Get collection",
            "description": "Detail for a single collection — name, description, and the ordered list of member organizations. Hidden / on-demand orgs never leak through; only publicly visible orgs appear in the member list.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "slug": {
                  "description": "Collection slug (e.g. 'frontier-ai-labs').",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Get collection"
            }
          },
          {
            "name": "get_collection_releases",
            "title": "Get collection releases",
            "description": "Interleaved cross-org release feed for a collection — same shape as `get_latest_releases` but scoped to the collection's member orgs.\n\nCursor-paginated: pass `limit` for slice size (default 20), `cursor` to continue from a prior call. The result's `_meta.pagination` carries `kind: 'cursor'`, `hasMore`, and `nextCursor` when more rows exist; the response text echoes `nextCursor` so an LLM caller can chain without parsing `_meta`. Cursors are stable under inserts.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "cursor": {
                  "description": "Opaque continuation token from a prior call's `_meta.pagination.nextCursor`. Stale cursors are silently ignored — the call returns a fresh head of the feed.",
                  "type": "string"
                },
                "include_prereleases": {
                  "description": "Include prerelease tags (alphas, betas, RCs). Defaults to false so the feed matches the public web view.",
                  "type": "boolean"
                },
                "limit": {
                  "description": "Slice size (1–200). Defaults to 20.",
                  "maximum": 200,
                  "minimum": 1,
                  "type": "integer"
                },
                "slug": {
                  "description": "Collection slug (e.g. 'frontier-ai-labs').",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Get collection releases"
            }
          },
          {
            "name": "get_release",
            "title": "Get release",
            "description": "Fetch the full content of a single release by id. Release ids are returned by search or get_latest_releases — pass them here to read the whole entry (e.g. to quote a specific Next.js release note). Accepts the full rel_\u003cnanoid\u003e form or the bare 21-char nanoid.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "id": {
                  "description": "Release id — 'rel_\u003cnanoid\u003e' or a bare 21-char nanoid",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Get release"
            }
          },
          {
            "name": "follow",
            "title": "Follow",
            "description": "Follow an organization or a product so it appears in your personalized feed (`get_personalized_feed`). Following an organization implicitly includes all of its products.\n\nRequires a signed-in user (a `relu_` user key or an OAuth token). `entity` is a typed id — an `org_…` id or a `prod_…` id — as returned by `search`, `get_organization`, or `get_catalog_entry`. Idempotent: following something you already follow is a no-op.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "entity": {
                  "description": "Entity to follow — an `org_…` or `prod_…` id (from search / get_* results).",
                  "type": "string"
                }
              },
              "required": [
                "entity"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": false,
              "title": "Follow"
            }
          },
          {
            "name": "unfollow",
            "title": "Unfollow",
            "description": "Stop following an organization or product. Requires a signed-in user. `entity` is an `org_…` or `prod_…` id. Idempotent: unfollowing something you don't follow is a no-op.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "entity": {
                  "description": "Entity to unfollow — an `org_…` or `prod_…` id.",
                  "type": "string"
                }
              },
              "required": [
                "entity"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": false,
              "title": "Unfollow"
            }
          },
          {
            "name": "list_follows",
            "title": "List follows",
            "description": "List the organizations and products you follow (newest first). Requires a signed-in user.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "List follows"
            }
          },
          {
            "name": "get_personalized_feed",
            "title": "Get personalized feed",
            "description": "Your personalized release feed — recent releases from the organizations and products you follow, newest first. Requires a signed-in user. Same item shape as `get_latest_releases`, scoped to your follows.\n\nCursor-paginated: pass `cursor` from a prior response's `_meta.pagination.nextCursor` and optional `limit` (1–100, default 30).",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "cursor": {
                  "description": "Opaque cursor from a previous page's `_meta.pagination.nextCursor`.",
                  "type": "string"
                },
                "limit": {
                  "description": "Entries per page (1–100). Defaults to 30.",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "Get personalized feed"
            }
          },
          {
            "name": "list_webhooks",
            "title": "List webhooks",
            "description": "List your outbound release webhooks, personal or workspace. Requires a signed-in user (a `relu_` user key or an OAuth token).\n\nWith no `workspace`, lists your personal webhooks (`GET /v1/me/webhooks`) and includes a short list of your workspaces (id, slug, role) so you can target one next. Pass `workspace` (an id or a slug) to list that workspace's webhooks instead. Pass `id` to see one webhook plus its 10 most recent deliveries. Pass `enabled` to filter by enabled/disabled state.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "enabled": {
                  "description": "Filter to enabled or disabled webhooks.",
                  "type": "boolean"
                },
                "id": {
                  "description": "Show one webhook (with recent deliveries) instead of the full list.",
                  "type": "string"
                },
                "workspace": {
                  "description": "Workspace id or slug. Omit for your personal webhooks.",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "List webhooks"
            }
          },
          {
            "name": "manage_webhook",
            "title": "Manage webhook",
            "description": "Create, update, delete, test, or rotate the signing key of an outbound release webhook — personal or workspace. Requires a signed-in user. This tool sends requests to an external URL you supply and can delete or disable delivery, so treat it as a write.\n\nPass `workspace` (an id or slug) to act on a workspace's webhooks instead of your personal ones; workspace webhooks are always org-scoped (`scope: \"follows\"` is personal-only and is rejected up front). Only workspace owners and admins can create, update, delete, or rotate a workspace webhook — any member can test one.\n\n`action: \"create\"` needs `url` and `format` (`json`, `slack`, or `discord`), plus either `scope: \"follows\"` (personal only — everything you follow) or an org-scoped target: `org` (an org slug or `org_…` id), optionally narrowed by `product` (slug or `prod_…` id) or `source` (slug or `src_…` id). `action: \"update\"` needs `id` plus any fields to change; pass `source: null` or `product: null` to clear a filter. `action: \"delete\"`, `action: \"test\"`, and `action: \"rotate_secret\"` need only `id`.\n\n`create` and `rotate_secret` return a one-time `signingKey` for `json`-format webhooks — store it now, it will not be shown again. `slack` and `discord` deliveries aren't signed, so those formats never return one.",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "action": {
                  "enum": [
                    "create",
                    "update",
                    "delete",
                    "test",
                    "rotate_secret"
                  ],
                  "type": "string"
                },
                "description": {
                  "description": "Freeform label for the webhook.",
                  "type": "string"
                },
                "enabled": {
                  "description": "Update only. Enable or disable delivery.",
                  "type": "boolean"
                },
                "format": {
                  "description": "Delivery format.",
                  "enum": [
                    "json",
                    "slack",
                    "discord"
                  ],
                  "type": "string"
                },
                "id": {
                  "description": "Webhook id — required for update, delete, test, and rotate_secret.",
                  "type": "string"
                },
                "org": {
                  "description": "Org slug or org_… id. Required for an org-scoped create.",
                  "type": "string"
                },
                "product": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Product slug or prod_… id to narrow an org-scoped webhook. null clears it on update."
                },
                "releaseType": {
                  "description": "Optional filter on release taxonomy type.",
                  "enum": [
                    "feature",
                    "rollup"
                  ],
                  "type": "string"
                },
                "scope": {
                  "description": "Create only. \"follows\" is personal-only and defaults org-scoped when omitted.",
                  "enum": [
                    "org",
                    "follows"
                  ],
                  "type": "string"
                },
                "source": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Source slug or src_… id to narrow an org-scoped webhook. null clears it on update."
                },
                "url": {
                  "description": "Delivery URL. Required for create.",
                  "type": "string"
                },
                "workspace": {
                  "description": "Workspace id or slug. Omit to act on your personal webhooks.",
                  "type": "string"
                }
              },
              "required": [
                "action"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "idempotentHint": false,
              "openWorldHint": true,
              "readOnlyHint": false,
              "title": "Manage webhook"
            }
          },
          {
            "name": "whats_changed",
            "title": "What's changed",
            "description": "Given a package and a `from`/`to` version, return the changelog entries between them — `(from, to]`, from exclusive, to inclusive — with summaries and breaking-change verdicts. One call instead of reading N changelog pages to plan an upgrade.\n\n`package` is a tracked source slug or a GitHub `owner/repo` coordinate (set `ecosystem: \"github\"` for a bare coordinate). Reads already-indexed releases only. If the package isn't in the catalog you'll get a clear 'not tracked' answer (npm/PyPI names may not be mapped to a source yet).",
            "inputSchema": {
              "$schema": "https://json-schema.org/draft/2020-12/schema",
              "properties": {
                "ecosystem": {
                  "description": "Optional resolution hint; \"github\" enables matching a bare owner/repo.",
                  "enum": [
                    "npm",
                    "pypi",
                    "github"
                  ],
                  "type": "string"
                },
                "from": {
                  "description": "Version you're upgrading FROM (exclusive).",
                  "type": "string"
                },
                "minImportance": {
                  "description": "Only include entries with an AI-scored `importance` \u003e= this value (1-5; 5=landmark, 1=housekeeping). Entries with no score (unscored) are excluded when this is set.",
                  "maximum": 5,
                  "minimum": 1,
                  "type": "integer"
                },
                "package": {
                  "description": "Package identifier — a source slug or a GitHub \"owner/repo\" coordinate.",
                  "type": "string"
                },
                "to": {
                  "description": "Version you're upgrading TO (inclusive).",
                  "type": "string"
                }
              },
              "required": [
                "package",
                "from",
                "to"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true,
              "title": "What's changed"
            }
          }
        ]
      },
      "name": "Release Notes Index",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": null,
      "pageJsonUrl": "https://www.anchorterminal.com/tools/releases-mcp.json",
      "popularity": {
        "githubStars": 7
      },
      "registryName": "sh.releases/mcp",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://agents.releases.sh/mcp"
        }
      ],
      "repository": "https://github.com/buildinternet/releases",
      "reviewed": false,
      "slug": "releases-mcp",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=sh.releases/mcp",
      "summary": "Release notes and changelogs from across the web, indexed for agents. Also via CLI and REST API.",
      "updatedAt": "2026-10-03T20:55:04Z",
      "url": "https://www.anchorterminal.com/tools/releases-mcp",
      "vendor": "releases.sh",
      "vendorUrl": "https://releases.sh",
      "version": "0.15.2",
      "websiteUrl": "",
      "where": "hosted",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/releases-mcp",
    "json": "https://www.anchorterminal.com/tools/releases-mcp.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/releases-mcp.md",
    "slim": "https://www.anchorterminal.com/tools/releases-mcp.min.md"
  },
  "markdown": "# Release Notes Index\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by releases.sh (https://releases.sh)\n- Category: Observability \u0026 incidents (https://www.anchorterminal.com/categories/observability.md)\n- Listed because: It's published in the registry under releases.sh, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: Release notes and changelogs from across the web, indexed for agents. Also via CLI and REST API.\n\n## Facts\n\n- MCP registry: `sh.releases/mcp` 0.15.2\n- Endpoint: https://agents.releases.sh/mcp (streamable HTTP)\n- Source: https://github.com/buildinternet/releases\n- GitHub stars: 7\n- Registry entry updated: 2026-10-03\n\n## Tools\n\n- Tools it lists (18, about 6,841 tokens of context, `tools/list` without credentials over MCP 2026-07-28, checked 2026-10-04 22:25 UTC):\n  - `search` (read-only): Unified search across the registry and release content. Returns up to four sections — organizations, catalog entries (products + standalone sources folded into…\n  - `get_latest_releases` (read-only): Get the most recent releases, optionally filtered by product or organization. Excludes prereleases (canaries / alphas / betas / RCs) by default — pass…\n  - `list_catalog` (read-only): List catalog entries — products and standalone sources combined into one list with an `entryType: 'product' | 'source'` discriminator per row. Orgs that group…\n  - `get_catalog_entry` (read-only): Detail for a single catalog entry — accepts a prod_ id, src_ id, or an org-scoped coordinate in the form orgSlug/slug (e.g. 'vercel/nextjs' or…\n  - `list_organizations` (read-only): List all indexed organizations, optionally filtered. Paginated: defaults to 50 entries per page; pass `page: 2` for the next slice. Orgs with zero indexed…\n  - `get_organization` (read-only): Get detailed information about a single organization — accounts, tags, sources, products, aliases. When an AI-generated overview exists the response includes a…\n  - `lookup_domain` (read-only): Resolve a domain to the org or product that owns it. The domain is normalized first (scheme, `www.`, path, and trailing slash stripped, lowercased), so…\n  - `list_collections` (read-only): List curated collections — named cross-org playlists (e.g. 'Frontier AI Labs') independent of the fixed category taxonomy. Use `get_collection` for a…\n  - `get_collection` (read-only): Detail for a single collection — name, description, and the ordered list of member organizations. Hidden / on-demand orgs never leak through; only publicly…\n  - `get_collection_releases` (read-only): Interleaved cross-org release feed for a collection — same shape as `get_latest_releases` but scoped to the collection's member orgs. Cursor-paginated: pass…\n  - `get_release` (read-only): Fetch the full content of a single release by id. Release ids are returned by search or get_latest_releases — pass them here to read the whole entry (e.g. to…\n  - `follow` (writes): Follow an organization or a product so it appears in your personalized feed (`get_personalized_feed`). Following an organization implicitly includes all of its…\n  - `unfollow` (writes): Stop following an organization or product. Requires a signed-in user. `entity` is an `org_…` or `prod_…` id. Idempotent: unfollowing something you don't follow…\n  - `list_follows` (read-only): List the organizations and products you follow (newest first). Requires a signed-in user.\n  - `get_personalized_feed` (read-only): Your personalized release feed — recent releases from the organizations and products you follow, newest first. Requires a signed-in user. Same item shape as…\n  - `list_webhooks` (read-only): List your outbound release webhooks, personal or workspace. Requires a signed-in user (a `relu_` user key or an OAuth token). With no `workspace`, lists your…\n  - `manage_webhook` (writes): Create, update, delete, test, or rotate the signing key of an outbound release webhook — personal or workspace. Requires a signed-in user. This tool sends…\n  - `whats_changed` (read-only): Given a package and a `from`/`to` version, return the changelog entries between them — `(from, to]`, from exclusive, to inclusive — with summaries and…\n- How its tools read to an agent (0 errors, 2 warnings, 2 notes, about 6,841 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC14 get_latest_releases: allowed values are in the description, not an enum: since\n  - warn TC14 search: allowed values are in the description, not an enum: product, since\n  - note TC11 manage_webhook: a parameter is documented in the description but not in the schema: action\n  - note TC24 server: 18 of 18 tools have no outputSchema\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/releases-mcp.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "Release Notes Index",
        "url": ""
      }
    ],
    "description": "Release Notes Index, an MCP server by releases.sh, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. Release notes and changelogs from across the web, indexed for agents. Also via CLI and REST API.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "Release Notes Index",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/releases-mcp",
    "published": "",
    "section": "indexed",
    "title": "Release Notes Index, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-04",
    "url": "https://www.anchorterminal.com/tools/releases-mcp"
  },
  "tokens": {
    "markdown": 1450,
    "slim": 1380
  },
  "version": 1
}
