
Company News
Free Business Plan Upgrades for Open Source Maintainers
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.
@posthog/mcp
Advanced tools
PostHog SDK for Model Context Protocol (MCP) servers — tracks tool usage, intent, and identity
Please see the main PostHog docs.
SDK usage examples and code snippets live in the official documentation so they stay up to date.
On stateless deployments the SDK mints the Mcp-Session-Id response header at initialize
as a token carrying the session id and client name/version. Clients replay the header on
every request, so any pod keeps $session_id and $mcp_client_name/$mcp_client_version
stable with no server-side store.
A standalone $identify event fires at most once per session — at initialize (or, on a
long-lived server, when the identity first appears or materially changes). Tool calls on other
pods reuse the identity to stamp distinct_id/$set on every event without re-publishing
$identify, so person properties are never lost. (Edge case: if identity isn't resolvable
until after initialize, the first $identify is suppressed too, so pre-identify anonymous
events aren't aliased onto the user — see docs/ARCHITECTURE.md §4.) To drop $identify
entirely, return null from beforeSend when event === '$identify'.
enableJsonResponse: trueThe token is minted onto the Mcp-Session-Id response header from inside the initialize
handler, so it only reaches the client when the transport builds the response after the
handler runs — i.e. JSON mode. In SSE (streaming) mode StreamableHTTPServerTransport
flushes the response headers before the handler runs, so the minted header never lands and
behavior silently falls back to a session-per-request. This is a property of the transport, so
it applies to every Streamable-HTTP host — set enableJsonResponse: true (and use a fresh
transport per request):
// @modelcontextprotocol/sdk
new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true })
// Cloudflare agents / createMcpHandler (SSE is the default)
createMcpHandler(server, { enableJsonResponse: true })
// @rekog/mcp-nest
McpModule.forRoot({ streamableHttp: { enableJsonResponse: true } })
Set the header yourself at the HTTP layer with the exported encodeSessionId (read clientInfo
from the initialize body) — the SDK decodes it either way:
import { MCP_SESSION_HEADER, encodeSessionId, newSessionId } from '@posthog/mcp'
// after parsing the POST body, before flushing headers:
if (body?.method === 'initialize' && !req.headers[MCP_SESSION_HEADER]) {
res.setHeader(
MCP_SESSION_HEADER,
encodeSessionId({
sessionId: newSessionId(),
clientName: body.params?.clientInfo?.name,
clientVersion: body.params?.clientInfo?.version,
})
)
}
Details: docs/ARCHITECTURE.md §4.
To test local changes in a consumer app (e.g. a dummy MCP server), symlink both
@posthog/mcp and its posthog-node peer from this monorepo into the app — run from the
app's directory:
mkdir -p node_modules/@posthog # in case the app has no other @posthog/-scoped deps yet
ln -s /absolute/path/to/posthog-js/packages/mcp node_modules/@posthog/mcp
ln -s /absolute/path/to/posthog-js/packages/node node_modules/posthog-node
Then keep a watch build running and restart the app after each change:
cd /absolute/path/to/posthog-js/packages/mcp && pnpm dev # rebuilds dist/ on save
# in the app (e.g. dummy mcp), after each rebuild:
npm start # Node caches dist/ at startup, so restart to pick it up
npm install in the app replaces both symlinks with published copies — re-create them if you run it.cd packages/mcp && pnpm test:unit
FAQs
PostHog SDK for Model Context Protocol (MCP) servers — tracks tool usage, intent, and identity
The npm package @posthog/mcp receives a total of 48,135 weekly downloads. As such, @posthog/mcp popularity was classified as popular.
We found that @posthog/mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 22 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.

Security News
The supply chain control that delays freshly published gems now covers lockfile generation and gem vendoring in Ruby projects.

Security News
During a UK cyber test, a Mythos 5 agent used sockpuppets, social engineering, and prompt injection to try to get a maintainer to merge malware.