This release includes 4 security fixes for security teams reviewing exposed deployments.
Topics
Affected surfaces
ReleasePort's take
Moderate signalThread reads no longer beacon to attacker‑chosen hosts and SSRF private‑range coverage is fully corrected.
Why it matters: Fixes security vulnerabilities in cross‑origin thread read handling (severity 90) and corrects SSRF filtering for IPv4/IPv6 reserved ranges (severity 85), reducing risk of data exfiltration and unauthorized network requests.
Summary
AI summaryThread reads no longer beacon to attacker‑chosen hosts and SSRF private‑range coverage is fully corrected.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Critical |
Thread reads no longer beacon to attacker-chosen hosts. Thread reads no longer beacon to attacker-chosen hosts. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Security | High |
SSRF private-range coverage corrected for IPv4 and IPv6 reserved ranges. SSRF private-range coverage corrected for IPv4 and IPv6 reserved ranges. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Security | High |
Mastodon read adapter hardened to parity with Misskey against unbounded data. Mastodon read adapter hardened to parity with Misskey against unbounded data. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Security | High |
`install.ps1` no longer wipes other MCP servers on Windows PowerShell 5.1. `install.ps1` no longer wipes other MCP servers on Windows PowerShell 5.1. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Security | High |
Release supply chain tightened by pinning builder dependencies and dropping write permissions. Release supply chain tightened by pinning builder dependencies and dropping write permissions. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Bugfix | Medium |
`fetch-timeline` now renders real post content instead of empty wrappers. `fetch-timeline` now renders real post content instead of empty wrappers. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Bugfix | Medium |
Subsystem logs are no longer silently dropped due to array‑based logger configuration. Subsystem logs are no longer silently dropped due to array‑based logger configuration. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Bugfix | Medium |
Read timeouts now cover response body in addition to headers. Read timeouts now cover response body in addition to headers. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Bugfix | Medium |
`get-scheduled-posts` works without `ACTIVITYPUB_ENABLE_WRITES` flag. `get-scheduled-posts` works without `ACTIVITYPUB_ENABLE_WRITES` flag. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Bugfix | Medium |
Windows `login` opens OAuth URL correctly using FileProtocolHandler. Windows `login` opens OAuth URL correctly using FileProtocolHandler. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Bugfix | Low |
'post-thread' resource resolves the real ActivityPub URI and validates statusId. 'post-thread' resource resolves the real ActivityPub URI and validates statusId. Source: granite4.1:30b@2026-06-11-audit Confidence: low |
— |
Full changelog
[3.1.4] - 2026-06-10
Security, correctness, and distribution patch from a second end-to-end review.
Fixed
fetch-timelineshows real post content again. Outbox items are activities
(Create/Announce), so readingcontentstraight off the wrapper rendered every
post as[Create] (empty)against real Mastodon/Pleroma/Misskey servers. The
formatter now unwraps the nested object (and renders boosts by their URL).- Subsystem logs are no longer silently dropped. logtape categories are
array-based, sogetLogger("activitypub-mcp:http")was a sibling of the configured
logger with no sink — about 13 subsystems (including the operator security and audit
warnings) emitted nothing. All call sites now use the array-child form, with a
regression test guarding against the colon form returning. - Read timeouts now cover the response body, not just the headers. A hostile
instance could send headers promptly then trickle the body forever, evading
REQUEST_TIMEOUTand pinning the tool call. The request deadline now spans the
body read across every AP-native read. get-scheduled-postsworks withoutACTIVITYPUB_ENABLE_WRITES. It is an
authenticated read (readOnlyHint), but was registered inside the write-gated block,
contradicting the docs. It now ships with the other authenticated reads.post-threadresource resolves the real ActivityPub URI. It built a
/web/statuses/{id}SPA URL that modern Mastodon does not serve as ActivityPub (it
302s to HTML), so the resource timed out and retried. It now resolves the canonical
urivia the REST API and validates{statusId}against path-segment injection.- Windows
loginopens the browser correctly.cmd /c starttreated the OAuth
URL's&separators as command separators, truncating the URL and breaking login on
every Windows machine. It now uses rundll32's FileProtocolHandler (no shell parsing).
Security
- Thread reads no longer beacon to attacker-chosen hosts. The cross-origin gate
added in 3.1.3 covered ancestors and reply items but not the root post's
replies-collection URL; withTHREAD_CROSS_ORIGIN_FETCHoff (the default) that URL
is now skipped when off-origin. - SSRF private-range coverage corrected. The IPv4 multicast (
224.0.0.0/4) and
reserved (240.0.0.0/4) blocks, and the IPv6 multicast (ff00::/8) and Teredo
(2001::/32) blocks, matched only a fraction of each CIDR; they now cover the full
ranges. - Mastodon read adapter hardened to parity with Misskey. Public timeline, trending,
and search results from a (default-adapter) hostile server are now structurally
validated, count-coerced, and capped at the requested limit instead of passed through
unbounded. install.ps1no longer wipes other MCP servers on Windows PowerShell 5.1. The
ConvertFrom-Json -AsHashtablepath is PowerShell 6+ only; on 5.1 it threw and the
fallback overwrote the user's config with only our entry. Install/uninstall now
delegate to the shared Node merge helper, which preserves existing servers and
refuses to clobber unparseable configs.- Release supply chain tightened. The
.mcpbbuilder (@anthropic-ai/mcpb) is now
version-pinned and installed with--ignore-scripts; the release/auto-release jobs
drop workflow-level write permissions to least privilege and check out with
persist-credentials: false, so the full dependency tree and tests never run with a
push-capable token.
Changed
- CI now enforces the per-directory coverage thresholds (a dedicated coverage job runs
vitest --coverage); previously the matrix ran tests without coverage so the floors
were never checked. - The README "Add to Cursor" one-click button uses Cursor's
https://cursor.com/install-mcp
wrapper; GitHub strips the rawcursor://href, leaving a dead button.
Security Fixes
- Thread reads no longer beacon to attacker‑chosen hosts when THREAD_CROSS_ORIGIN_FETCH is off (default)
- SSRF private‑range coverage corrected: full IPv4 multicast (224.0.0.0/4), reserved (240.0.0.0/4), IPv6 multicast (ff00::/8) and Teredo (2001::/32) ranges are now blocked
- `install.ps1` no longer wipes other MCP servers on Windows PowerShell 5.1
- Release supply chain tightened: .mcpb builder version‑pinned, install with --ignore-scripts; CI jobs drop write permissions to least privilege
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About cameronrye/activitypub-mcp
A comprehensive MCP server that enables LLMs to explore and interact with the Fediverse through ActivityPub protocol. Features WebFinger discovery, timeline fetching, instance exploration, and cross-platform support for Mastodon, Pleroma, Misskey, and other ActivityPub servers.
Related context
Related tools
Earlier breaking changes
- v2.1.0 `activitypub://instance-info/{domain}` `software` field now an object instead of a string.
- v2.1.0 Removed `activitypub://post-thread/{postUrl}` URI form; use `{domain}/{statusId}` instead.
- v2.0.0 'get-relationship' no longer accepts legacy `accountIds` array; requires single `acct` string.
- v2.0.0 `MCP_HTTP_CORS_ORIGINS` no longer defaults to '*'; must be set explicitly.
- v2.0.0 `scheduledId` renamed to `scheduledPostId` in scheduling tools.
Beta — feedback welcome: [email protected]