Answers who can see or change what in a PostHog project, and why — reading the permission settings the way PostHog actually enforces them.
WHEN TO USE
SCOPE
USE FOR
Check whether a particular teammate can edit feature flags in a project.
Find out why a colleague can't open one specific dashboard.
List everyone in the project who has no access to experiments.
See which person or event fields are hidden from the support team's role.
Explain whether someone's access comes from their own rule, a role or the project default.
NOT FOR
Changing who has access — it only reads the rules; they are edited on PostHog's settings page.
This is a saved copy of the skill's SKILL.md instructions. It may differ from the upstream file or the version you install.
Checking member access
Use this skill to answer "what can this person do here?" from the access control tools. The tools return
the enforced level and where it comes from. This skill is for reading them correctly.
When to use this skill
"What can this member do in this project?" / "Can this member edit feature flags?"
"Who can edit dashboards?" / "Who has no access to experiments?"
"Why can't this member open this dashboard?" / "Which tables is this role restricted from?"
"Which properties are hidden from the support role?"
"What does the analyst role grant?" / "What is the default access in this project?"
Not for changing rules. The read tools cannot write, and the settings page is where rules are edited.
Plan availability
Free and pay-as-you-go plans have no access control, and the access control tools are not offered to
them. If the tools are missing from the catalog, say that the plan does not include access control and
suggest upgrading to the Boost plan. Link the plan comparison: https://posthog.com/platform-packages.
Boost and Scale include the default levels and rules for single members on the project, on tools, on
objects and on properties.
Roles exist on every plan, but role rules are an Enterprise feature: they can be set and are enforced
only there, and the three role access tools are offered only there. If the tools are missing, say that
role-based access control needs the Enterprise plan, with the same link. On other plans a member's
roles never change the enforced level.
The tools do not say which plan the organization is on. A source_subject of role anywhere in a
members-list result proves that role rules are enforced. Without that, ask the user whether the organization
is on Enterprise before walking roles in step 4 of the workflow.
How access resolves
Scopes. The project itself, then each tool (dashboard, insight, feature_flag, notebook,
experiment, warehouse_objects, and so on), then single objects inside a tool, then person and event
properties. The tool names are the keys of resources in a members-list entry.
Project levels.member can view and edit the resources their other rules permit. admin can also
edit project settings, manage the project's access rules, and delete the project.
Tool and object levels.none cannot view. viewer can view but not change. editor can view and
change. manager can also manage the access rules of the tool or object. Order: none < viewer <
editor < manager.
Property levels.none hides the property. read shows it. read_write also allows edits. Every
property is read_write unless a rule exists.
Bounds.minimum and maximum per tool, on defaults-get, are the levels a rule can set. A tool
with minimumviewer can never be set to none.
Subjects. A rule belongs to one member, one role, or everyone in the project (the default).
Organization admins and owners have full access to everything in every project. No rule applies to
them. organization_level is a number: 1 member, 8 admin, 15 owner.
Creators have full access to the objects they created, and only those. A member with viewer on
dashboards can still edit the dashboard they created, and cannot edit the others.
Two resolution modes. Organizations resolve rules either most-specific-first (member rule, then
role rules, then default, and object rule before tool rule) or legacy (the highest of the member's own
rule and role rules wins). The tools do not say which mode applies. The server already applied it. So
trust effective_access_level and never recompute it from the stored rules. If the user asks why,
explain from inherited_access, not from your own precedence.
Available tools
Tool
Returns
posthog:access-control-members-list
Every member's enforced access to the project and to each tool. member_id narrows to a member.
posthog:access-control-roles-list
The same per role. role_id narrows to a role.
posthog:access-control-defaults-get
The project baseline, and which tools accept rules on single objects.
posthog:access-control-member-objects-list
The object rules set for a member: every object with a rule for that member.
posthog:access-control-member-properties-list
The property rules set for a member.
posthog:access-control-role-objects-list
The object rules set for a role.
posthog:access-control-role-properties-list
The property rules set for a role.
posthog:access-control-default-objects-list
The object rules that apply to everyone in the project.
posthog:access-control-default-properties-list
The property rules that apply to everyone in the project.
posthog:org-members-list
Membership ids, names and organization levels. No project access details.
posthog:roles-list, posthog:role-members-list
Role names by id, and who is in a role.
All access control tools take an optional project id and default to the active project.
Workflow
Find the subject id.member_id is the organization membership id: the id from
org-members-list, or organization_membership_id from members-list. It is not the user id and not
the user uuid. role_id is the id from roles-list.
Tool-level questions need one call. "Can this member view dashboards?" or "What access to feature
flags does this member have?" is members-list with member_id. effective_access_level for that tool
is the complete answer. It already includes the member's roles, the project default and the bypasses.
Explain the level from inherited_access. See the table below. Only mention the stored
access_level when it differs from the enforced level.
Object questions need the object and its rules. "Can this member open dashboard 42?" cannot be
answered from the tool level alone. Check in this order, and stop at the first hit:
organization_level is 8 or 15 on the member's entry: full access, no rule applies.
The member created the object: full access, no rule applies. The rule tools do not say who created
an object, so fetch it with its own get tool, for example dashboard-get or insight-get, and
compare created_by.uuid with user.uuid on the member's entry.
A rule on that object. The member tools return only the rules set for that member, so collect
member-objects-list, role-objects-list for each id in the member's role_ids, and
default-objects-list, and pick out the rows for this object. Tell the user how many roles you
would walk and ask before doing it for a member in many roles.
No rule on the object: the tool-level answer from step 2 applies.
Several rules on one object. When the member, a role and the default each set a level on the
same object, the server picks one by the organization's resolution mode, and no tool returns that
pick for another member. Report every rule you found with its subject, say the enforced one depends
on the mode, and do not guess. Property questions work like step 4 with the properties tools, minus
the creator check, since properties have no creator.
"Who can ..." questions are members-list without member_id, filtered on
resources.<tool>.effective_access_level. The response is every member times every tool and has no
pagination. For a large organization, ask which people the user cares about first, or answer per
member.
Reading one entry
Field
Meaning
access_level
The subject's own stored rule for this scope. null means no rule of its own.
effective_access_level
What is enforced. null means nothing resolves for this scope. It is not "no access".
inherited_access
The level the subject falls back to without a rule of its own, and where it comes from. null when nothing supplies one.
inherited_access.source
resource or parent_resource for a tool rule, object or parent_object for an object rule, system_default for the PostHog default. org_admin and creator are the bypasses described above. org_membership appears only when the object is the organization itself.
inherited_access.source_subject
member, role or default: whose rule supplied it. null when a bypass or the PostHog default did.
How to phrase the answer:
source is org_admin: "This member is an organization admin and has full access to everything." The
stored rules do not apply to them.
access_level is set and equals effective_access_level: "This member has an explicit rule: editor."
access_level is null and source_subject is role: "This member has editor access, based on a role."
The role's name is not in the entry; roles-list has it if the user wants it.
access_level is null and source_subject is default: "This member has viewer access, based on the
project default."
source is system_default: "No rule is set anywhere, so the PostHog default applies."
effective_access_level is null: "Nothing resolves for this tool here." Do not read it as no access.
Gotchas
An empty object or property list means no rules of that kind, not no access. The tool-level entry
still applies.
A member missing from members-list is not proof of no access. A caller who is not an organization
admin, in an organization where members cannot see each other, only sees members with project-scoped
access.
can_edit on the members and roles lists describes the caller, not the subject: whether the person
running the tool may change rules.
available_project_levels and available_resource_levels are the vocabulary, lowest first. Use them
to compare levels instead of assuming an order.
object_rule_resources on defaults-get lists the tools that accept rules on single objects. A tool
not in that list has no object rules to look for.
MCP connection required
2 FOR YOU
All items below are required.
01
Connect the PostHog MCP server
Connect the PostHog MCP server so the assistant can call the posthog:access-control-* tools, posthog:org-members-list, posthog:roles-list and posthog:role-members-list.
02
Be on PostHog's Boost or Scale plan, or Enterprise for roles
Free and pay-as-you-go plans have no access control and the tools are not offered. Boost and Scale include member, tool, object and property rules; role rules and the three role access tools need the Enterprise plan.
🔌 This skill ships inside the PostHog AI Plugin. Listed package contents include 3 slash commands, 1 agent, hooks and an MCP server. Installed components and skill versions may vary by AI tool.
Install just this skill
Run this outside your AI tool, using Node.js 22.20.0 or newer. Skills CLI 1.7.2 skips skill selection; prompts cancel installation without an interactive terminal. If choosing Project when asked about installation scope, open your project's folder before running this.
Install checklist
Check selected tools if a picker appears; Claude Code may be unchecked under Additional agents. ↑/↓ moves, Space toggles selections, Enter confirms.
Without a tool picker, check Installing to: for your intended tool. Stop if it names a different tool.
If asked, choose Symlink (Recommended) for shared files or Copy to all agents for separate copies; review the summary before confirming installation.
Install the find-skills skill? defaults to Yes, adding another skill for all projects. Choose No if you don't want that extra installation.
Skills CLI 1.7.2 sends install data to skills.sh by default, including the source, skill names, target tools and file details; GitHub sources are reported only when GitHub confirms the repository is public, while other remote sources can also be reported. Confirmed-public GitHub sources also trigger a security-audit request. Before installing, set the environment variable DO_NOT_TRACK=1 or DISABLE_TELEMETRY=1 to disable both.
After installing for Claude Code, open it in the installation project if you chose Project; Global makes the skill available across projects on this computer. Once Claude Code loads the skill, its description helps Claude decide when to use it.
If installation created a top-level skills folder that did not exist when your Claude Code session started, run /reload-skills in that session. Run it again after later changes in that folder.
MCP server required
The skill's steps call for tools from the PostHog MCP server. Installing just this skill doesn't add that connection; set it up in your AI tool if it isn't there yet: PostHog MCP setup. Installing the whole plugin instead includes the connection settings.
Requirements for the PostHog MCP server
Connecting is free; sign in with your PostHog account.
Some tools use AI internally and may incur PostHog AI charges. Those tools require AI data processing to be enabled in your organization settings.
Install the whole plugin
This route installs the posthog plugin package selected for your AI tool.
Claude Code
Add PostHog's marketplace, then install the plugin
Run both lines in a terminal. They install PostHog's posthog plugin: this skill, PostHog's other skills, and a connection to PostHog's hosted MCP server.
01
claude plugin marketplace add PostHog/ai-plugin
02
claude plugin install posthog@posthog
Installation and loading
The plugin installs for you in every project and loads the next time you start Claude Code, or after /reload-plugins in an open session.
To connect your PostHog account, start claude, type /mcp, select plugin:posthog:posthog and follow the browser prompts.
Good to know
The plugin includes PostHog's session-capture hook; PostHog's README says it sends sessions to LLM Analytics only when POSTHOG_LLMA_CC_ENABLED=true and POSTHOG_API_KEY are both set.
If you use the separate posthog-telemetry plugin, PostHog says to keep only one of the two, because both register the same hook.
On a self-hosted PostHog, this route's MCP connection won't reach your instance: the plugin's config is fixed to https://mcp.posthog.com/mcp, which routes to PostHog's US or EU region. POSTHOG_MCP_URL works only for the Gemini CLI extension.
Sync columns from a synced data warehouse table onto PostHog person or group properties, so warehouse data becomes usable anywhere person and group properties already work: feature flag targeting, cohorts, insight filters and breakdowns, surveys, session replay filters, workflows, and the person profile. Use when the user wants to "add a person property from my warehouse", "enrich people with Stripe/Postgres/Salesforce data", "put ARR or plan tier on my persons", "target a feature flag by a warehouse column", "sync warehouse columns onto groups or organizations", or wants to inspect, backfill, disable, or debug an existing warehouse-backed person or group property.Read full description
Analyze the most expensive users in AI observability and explain why they cost so much. Use when the user asks about top spenders, expensive users, per-user LLM cost, user-level cost drivers, or patterns behind high AI observability spend.Read full description
Analyze session replay patterns across experiment variants to understand user behavior differences. Use when the user wants to see how users interact with different experiment variants, identify usability issues, compare behavior patterns between control and test groups, or get qualitative insights to complement quantitative experiment results. Also covers pairing the observed behavior with a linked survey when the user wants qualitative feedback beyond what recordings show.Read full description
Assesses what a page's heatmap is telling you and recommends concrete changes. Pulls click / rageclick / scroll-depth data for a URL, names the hot elements by cross-referencing autocapture events on the same page, and can create a saved heatmap the user opens in PostHog, then summarizes the behavior and proposes improvements.
TRIGGER when: user asks what a heatmap shows, why people aren't clicking something, where users rage-click, how far they scroll, what to change on a page based on heatmap/click data, or to 'analyze/assess/review the heatmap' for a URL.
DO NOT TRIGGER when: the user only wants to create a saved heatmap screenshot with no analysis (use heatmaps-saved-create directly), or is asking about session replay in general (use investigating-replay).Read full description
Audit every endpoint in a PostHog project for staleness, failed materialisations, and unused materialised versions. Use when the user asks "what endpoints can I clean up?", "are any of my endpoints broken?", "which materialised versions are still being called?", or wants a one-shot cleanup pass over the Endpoints product. Produces a prioritised report grouped by issue type, with recommended actions but does not modify anything without explicit confirmation.Read full description
Audit PostHog experiments and feature flags for configuration issues, staleness, and best-practice violations. Read when the user asks to audit, health-check, or review experiments or feature flags, check flag hygiene, or verify experiment setup.Read full description