OpenAPI to MCP Server
mcp-use/mcp-use
Turns an OpenAPI or Swagger spec into an MCP server with the mcp-use TypeScript SDK, mapping each operation to a tool, wiring auth, testing and deploying.
Guide for exposing PostHog product endpoints as MCP tools. An agent skill from PostHog/posthog-foss.
$ npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install PostHog/posthog-foss implementing-mcp-tools --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/PostHog/posthog-foss.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/implementing-mcp-tools .claude/skills/implementing-mcp-tools && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "implementing-mcp-tools" agent skill from https://github.com/PostHog/posthog-foss/tree/master/.agents/skills/implementing-mcp-tools into .claude/skills/implementing-mcp-tools/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "implementing-mcp-tools", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/PostHog/posthog-foss/tree/master/.agents/skills/implementing-mcp-toolsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install PostHog/posthog-foss implementing-mcp-tools --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/PostHog/posthog-foss.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/implementing-mcp-tools .agents/skills/implementing-mcp-tools && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "implementing-mcp-tools" agent skill from https://github.com/PostHog/posthog-foss/tree/master/.agents/skills/implementing-mcp-tools into .agents/skills/implementing-mcp-tools/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "implementing-mcp-tools", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install PostHog/posthog-foss implementing-mcp-tools --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/PostHog/posthog-foss.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/implementing-mcp-tools .cursor/skills/implementing-mcp-tools && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "implementing-mcp-tools" agent skill from https://github.com/PostHog/posthog-foss/tree/master/.agents/skills/implementing-mcp-tools into .cursor/skills/implementing-mcp-tools/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "implementing-mcp-tools", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/PostHog/posthog-foss.git --path .agents/skills/implementing-mcp-tools--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install PostHog/posthog-foss implementing-mcp-tools --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/PostHog/posthog-foss.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/implementing-mcp-tools .gemini/skills/implementing-mcp-tools && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "implementing-mcp-tools" agent skill from https://github.com/PostHog/posthog-foss/tree/master/.agents/skills/implementing-mcp-tools into .gemini/skills/implementing-mcp-tools/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "implementing-mcp-tools", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install PostHog/posthog-foss implementing-mcp-toolsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/PostHog/posthog-foss.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/implementing-mcp-tools .github/skills/implementing-mcp-tools && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "implementing-mcp-tools" agent skill from https://github.com/PostHog/posthog-foss/tree/master/.agents/skills/implementing-mcp-tools into .github/skills/implementing-mcp-tools/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "implementing-mcp-tools", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install PostHog/posthog-foss implementing-mcp-tools --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/PostHog/posthog-foss.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/implementing-mcp-tools .opencode/skills/implementing-mcp-tools && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "implementing-mcp-tools" agent skill from https://github.com/PostHog/posthog-foss/tree/master/.agents/skills/implementing-mcp-tools into .opencode/skills/implementing-mcp-tools/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "implementing-mcp-tools", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
implementing-mcp-toolsGuide for exposing PostHog product endpoints as MCP tools. An agent skill from PostHog/posthog-foss.
Implementing MCP Tools is an agent skill from PostHog/posthog-foss, published by the product's own GitHub organization. Guide for exposing PostHog product endpoints as MCP tools. Use when creating new or updating API endpoints, adding MCP tool definitions, scaffolding YAML configs, or writing serializers with good descriptions. Covers the full pipeline from Django serializer to generated TypeScript tool handler.
Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering MCP servers, Project scaffolding and Backend development. It works with PostHog, Django and TypeScript. The repository describes itself as: PostHog FOSS is a read-only mirror of PostHog, with all proprietary code removed. NOTE: This repo is synced automatically from the main PostHog repo. Please raise any issues and… The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 2c48221. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Implementing MCP Tools loads about 3.7k tokens when it runs. Until then it costs about 80 tokens; SKILL.md has 1,471 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from PostHog/posthog-foss at commit 2c48221, republished under its MIT licence (© PostHog). 1,471 words, ~3,744 tokens.
.claude/skills/implementing-mcp-tools/SKILL.md (or your agent's skills folder).Read the full guide at docs/published/handbook/engineering/ai/implementing-mcp-tools.md.
# 1. Scaffold a starter YAML with all operations disabled.
# --product discovers endpoints via their x-product attribution.
# ViewSets in products/<name>/backend/ are auto-attributed via module
# path. ViewSets elsewhere need
# @extend_schema(extensions={"x-product": "<product>"}).
pnpm --filter=@posthog/mcp run scaffold-yaml -- --product your_product \
--output ../../products/your_product/mcp/tools.yaml
# 2. Configure the YAML — enable tools, add descriptions, and annotations for PATCH/POST/PUT
# (scopes come from the API when omitted)
# Place in products/<product>/mcp/*.yaml (preferred) or services/mcp/definitions/*.yaml
# 3. Add a HogQL system table in posthog/hogql/database/schema/system.py
# and a model reference in products/posthog_ai/skills/querying-posthog-data/references/
# 4. Generate handlers and schemas
hogli build:openapi
# 5. Refresh the tool input schema snapshots (CI unit tests fail on a stale snapshot)
pnpm --filter=@posthog/mcp exec vitest run tests/unit/tool-schema-snapshots.test.ts -u
# A tool behind a new `feature_flag` needs that flag in the test's `featureFlags` map, set to the value that shows the tool:
# true for a plain gate, the variant string for a variant gate, a non-true value for a `disable` gate.
# 6. Only when the YAML uses ui_apps: regenerate the UI apps (CI checks they are current)
pnpm --filter=@posthog/mcp run generate:ui-appsThe codegen pipeline can only generate correct tools if the Django backend exposes correct types. Read the type system guide for the full picture.
Before scaffolding YAML, verify:
help_text —
these flow all the way to Zod .describe() in the generated tool.
Missing descriptions = agents guessing at parameters.
Use ListField(child=serializers.CharField()) instead of bare ListField(),
and @extend_schema_field(PydanticModel) on JSONField subclasses to get typed Zod output
(see products/alerts/backend/presentation/views/alert.py for the pattern).ViewSet methods have @extend_schema(request=...) —
without it, drf-spectacular can't discover the request body
and the generated tool gets z.object({}) (zero parameters).
ModelViewSet with a serializer_class is fine; plain ViewSet with manual validation is not.@validated_request or @extend_schema with a query serializer —
otherwise boolean and array query params may produce type mismatches in the generated code.If a generated tool has an empty or wrong schema, the fix is almost always on the Django side,
not in the YAML config.
For a full audit checklist and before/after examples, use the improving-drf-endpoints skill.
When a product exposes API endpoints that agents should be able to call. MCP tools are atomic capabilities (list, get, create, update, delete) — not workflows.
If you're adding a new endpoint, check whether it should be agent-accessible. If yes, add a YAML definition and generate the tool.
Tools should be basic capabilities — atomic CRUD operations and simple actions. Agents compose these primitives into higher-level workflows.
Good: "List feature flags", "Get experiment by ID", "Create a survey". Bad: "Search for session recordings of an experiment" — bundles multiple concerns.
Tool names and feature identifiers are validated at build time and in CI. Violations fail the build.
[a-z0-9-], no leading/trailing hyphensdomain-action, e.g. cohorts-create, dashboard-get, feature-flags-listThe single-exec prompt builds its compact domain index with
ToolDomainExtractor. Large families can split at an intermediate segment.
Without action trimming, experiment-freeze-exposure can advertise the
redundant domain experiment-freeze instead of experiment.
Whenever you add or rename an action tool, check the
TRAILING_ACTIONS set in the
same change. If a rendered domain can end in an operation verb that is not
already present, add the verb. Cover it in
services/mcp/tests/unit/instructions.test.ts. This applies even when the verb
is not the final segment of the full tool name.
Add operation verbs such as freeze, publish, or emit. Do not add resource
or capability nouns such as config, logs, stats, or schedule merely to
make the prompt shorter; those remain useful discovery domains.
[a-z0-9*], must start with a lettererror_tracking, feature_flagsMCP clients enforce different limits on tool names. The 52-char limit is the safe zone that works across all known clients:
| Client | Limit | Notes |
|---|---|---|
| MCP spec (draft) | 1–128 chars, [A-Za-z0-9_\-.] | Official recommendation, not enforced |
| Claude Code | 64 chars | Hard limit; prefixes tool names with mcp____ |
| Cursor | 60 chars combined | server_name + tool_name; tools over this are silently filtered |
| OpenAI API | ^[a-zA-Z0-9_-]+$, 64 chars | No dots allowed |
With the server name "posthog" (7 chars) plus a separator, tool names must stay at or below 52 characters to fit within Cursor's 60-char combined limit.
pnpm --filter=@posthog/mcp lint-tool-names — validates length and pattern for YAML and JSON definitionsTOOL_MAP and GENERATED_TOOL_MAP entriesYAML files configure which operations are exposed as MCP tools. See existing definitions for patterns:
products/<product>/mcp/*.yaml — preferred, keeps config close to the codeservices/mcp/definitions/*.yaml — fallback for functionality without a product folderThe build pipeline discovers YAML files from both paths.
category: Human readable name
feature: snake_case_name # should match the product folder name (used for runtime filtering)
url_prefix: /path # frontend app route, used for enrich_url links
tools:
your-tool-name: # kebab-case
operation: operationId_from_openapi
enabled: true
# Optional:
scopes: # defaults to the scopes the API requires (from the OpenAPI spec)
- your_product:read
annotations: # defaults for GET and DELETE; required for PATCH, POST and PUT
readOnly: true
destructive: false
idempotent: true
title: List things
description: >
Human-friendly description for the LLM.
list: true
enrich_url: '{id}'
param_overrides:
name:
description: Custom description for the LLM
response: # filter response fields (applied per-item on list endpoints)
include: [id, key, name] # keep only these fields (dot-path wildcards supported)
exclude: [filters.groups.*.properties] # remove these fields
# include and exclude are mutually exclusive
selectable: true # add optional `fields` param so the agent picks a subset of `include` per call
# (constrained to the allowlist); omit `fields` to return the full set. Requires `include`.
strip_nulls: true # remove keys whose value is `null`, applied after include/exclude
# Use it on tools that echo a nested serializer schema, where the unset optional fields
# dominate the payload. Rejected with `list: true`, where per-row null removal makes the
# TOON table larger. Use `exclude` to drop the fields on a list tool instead.
feature_flag: my-flag-key # gate this tool behind a PostHog feature flag
feature_flag_behavior: enable # 'enable' (default) or 'disable'When scopes is omitted, the generator uses the scopes the API requires, so the tool cannot drift from the endpoint.
Set scopes by hand only when the API computes them per request (the generator fails and says so) or to gate a tool more tightly.
A scopes list that misses a scope the API requires fails codegen, with a GitHub annotation on CI.
When the API picks the scopes per request, list the action in the viewset's request_dependent_scope_actions.
The spec then marks the operation with x-request-dependent-scopes, codegen skips the check for it, and its tools must declare scopes.
annotations default to the HTTP method for GET (read-only) and DELETE (destructive).
PATCH, POST and PUT vary too much (a PATCH can be a soft delete or non-idempotent), so declare annotations for them.
When a tool needs custom logic around the request, set hooks: <path under src/tools/> and default-export an object with beforeRequest, afterResponse or onError from that module, written export default { onError } satisfies ToolHooks<Params> so a typo fails typecheck (see ToolHooks in src/tools/tool-hooks.ts).
Use it to read state before a write or to turn a known error into a result, rather than shadowing the generated tool with a hand-written one.
Unknown keys are rejected at build time (Zod .strict()).
Add feature_flag to any tool (standard or query wrapper) to gate its exposure on a PostHog feature flag evaluated at MCP init time for the current user.
feature_flag_behavior: enable (default) — tool is shown only when the flag is on. Use for rolling out new tools.feature_flag_behavior: disable — tool is hidden when the flag is on. Use for sunsetting old tools.Reusing the same flag key with both behaviors performs an atomic swap: flag on → new tool visible, old tool hidden; flag off → old tool visible, new tool hidden. Useful for A/B testing tool variations.
Flags are evaluated in parallel at init via evaluateFeatureFlags. If a flag can't be evaluated (service error, missing flag), enable-gated tools are excluded and disable-gated tools are included — fail-closed for new tools, fail-open for existing ones.
The MCP server and Django deploy separately. A tool that reaches clients before its route lands returns 404 on every call until the Django deploy catches up. That hits a whole agent fleet at once.
enabled: true in the same commit as a brand-new route is live in clients as soon as the MCP
server deploys.feature_flag with feature_flag_behavior: enable and turn the flag on once
the route is serving.feature_flag_behavior: disable on the same flag key, which swaps the two atomically.A rename or a removal has two stages. Do not stop after the first one.
_deprecation_notice to the response. The call still succeeds, and the agent
learns the new name. See services/mcp/src/tools/skills/deprecatedAliases.ts, spread into
TOOL_MAP in services/mcp/src/tools/index.ts. Use an alias only when the replacement accepts
the same arguments.DEPRECATED_TOOL_REDIRECTS in services/mcp/src/tools/exec.ts. The call then fails with a
deprecated_tool error that names the replacement, instead of the generic Unknown tool: "...".
State any argument changes in the text — see the self-driving-inbox-get entry.Go directly to stage 2 when the replacement is not a drop-in. An alias that quietly drops renamed parameters is worse than a call that fails.
Keep the redirect entry until the old name stops receiving traffic. isRecordableToolName records
$mcp_exec_target_tool only for a name the server owns: a live tool, or a
DEPRECATED_TOOL_REDIRECTS key. If you delete the entry too early, the remaining calls become
unattributable in MCP analytics, and you can no longer tell whether anything still uses the old name.
A tool that a feature flag removes is a different case. It keeps its definition, declares
superseded_by in the YAML, and flagGatedToolMessage answers the call.
pnpm --filter=@posthog/mcp run scaffold-yaml -- --sync-allIdempotent and non-destructive — adds new operations as enabled: false, removes stale ones.
Descriptions flow through the entire pipeline:
Django serializer field → OpenAPI spec → Zod schema → MCP tool descriptionThese descriptions are what agents read to understand tool parameters.
help_text on serializer fields — it becomes the OpenAPI description.param_overrides in YAML to override generated descriptions with imperative instructions.Every list/get endpoint should have a corresponding HogQL system table
in posthog/hogql/database/schema/system.py.
This lets agents query data via SQL.
Each system table must include a team_id column for data isolation.
When adding a system table, also add a model reference file
(models-<domain>.md) in products/posthog_ai/skills/querying-posthog-data/references/
and register it in products/posthog_ai/skills/querying-posthog-data/SKILL.md under Data Schema.
© PostHog, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/implementing-mcp-tools of PostHog/posthog-foss.
Open the folder on GitHubat commit 2c48221
Implementing MCP Tools next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Implementing MCP Tools this skillPostHog/posthog-foss | 721 | — | ~3.7k | Automated safety check: Pass | MIT | |
| OpenAPI to MCP Servermcp-use/mcp-use | 11k | — | ~5.2k | Automated safety check: Pass | Apache-2.0 | |
| Tandem Browserhydro13/tandem-browser | 616 | — | ~9.1k | Automated safety check: Pass | MIT | |
| FastAPI Project Templateswshobson/agents | 40k | 11 repos | ~901 | Automated safety check: Pass | MIT | |
| Migration CodegenAHS12/thoth-blueprint | 626 | — | ~425 | Automated safety check: Pass | GPL-3.0 | |
| Spring ExploreAmplicode/spring-skills | 126 | — | ~4.1k | Automated safety check: Pass | None |
mcp-use/mcp-use
Turns an OpenAPI or Swagger spec into an MCP server with the mcp-use TypeScript SDK, mapping each operation to a tool, wiring auth, testing and deploying.
hydro13/tandem-browser
Use Tandem Browser's MCP server (local and remote agents) or HTTP API (local and remote agents) to inspect, browse, and interact with the user's shared browser safely.
wshobson/agents
Scaffolds FastAPI projects with a layered app layout, dependency injection through Depends, async handlers and database access, middleware and pytest setup.
AHS12/thoth-blueprint
Change Laravel, TypeORM, or Django migration generation and generated SQL parsing.
Amplicode/spring-skills
Explores a Spring Boot application and builds primary context: tech stack, module structure, domain entities, REST endpoints.
Jeffallan/claude-skills
Builds Django apps and Django REST Framework APIs: models with indexes, ORM query optimization, serializers, viewsets and JWT authentication, with tests.
PostHog/posthog-foss
Author useful, low-noise log alerts on services in a PostHog project.
PostHog/posthog-foss
Operating procedure for the conflict-autoresolver agent: sweep open PostHog/posthog PRs that conflict with master, resolve the trivial conflicts (generated artifacts deterministically, source…
PostHog/posthog-foss
Help users debug PostHog Error Tracking stack-trace symbolication for any supported platform — JavaScript/TypeScript web, React Native (Hermes), Android (Proguard / R8), or iOS / macOS (dSYM).
PostHog/posthog-foss
Investigates distributed application performance using PostHog APM (OpenTelemetry span) data via MCP.
PostHog/posthog-foss
Debug and inspect LLM/AI agent traces using PostHog's MCP tools.
PostHog/posthog-foss
Diagnose why a product metric changed (dropped, spiked, or plateaued) by orchestrating breakdowns, actors, paths, lifecycle, retention, and annotations queries.
Works with
Categories
Guide for exposing PostHog product endpoints as MCP tools. An agent skill from PostHog/posthog-foss. Implementing MCP Tools is an agent skill from PostHog/posthog-foss, published by the product's own GitHub organization. Guide for exposing PostHog product endpoints as MCP tools.
Implementing MCP Tools fits situations like: updating API endpoints; adding MCP tool definitions; scaffolding YAML configs; writing serializers with good descriptions.
Run `npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a claude-code`. Or copy the skill folder (.agents/skills/implementing-mcp-tools in PostHog/posthog-foss) into .claude/skills/implementing-mcp-tools in your project. Claude Code loads it when a task matches its description.
Run `npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a codex`. Or copy the skill folder (.agents/skills/implementing-mcp-tools in PostHog/posthog-foss) into .agents/skills/implementing-mcp-tools in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add PostHog/posthog-foss --skill implementing-mcp-tools -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/implementing-mcp-tools, .gemini/skills/implementing-mcp-tools, .github/skills/implementing-mcp-tools and .opencode/skills/implementing-mcp-tools in your project.
Going by SKILL.md and its folder, Implementing MCP Tools needs the command-line tools its instructions call (pnpm).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Implementing MCP Tools is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.7k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Implementing MCP Tools: OpenAPI to MCP Server (mcp-use/mcp-use, 11k stars), Tandem Browser (hydro13/tandem-browser, 616 stars), FastAPI Project Templates (wshobson/agents, 40k stars) and Migration Codegen (AHS12/thoth-blueprint, 626 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
PostHog (a GitHub organization, an official publisher) maintains it in PostHog/posthog-foss, which has 721 GitHub stars. The repository holds 213 skills in this directory. The repository was last updated on October 7, 2026.
Source: PostHog/posthog-foss on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.