Borrowing it
Nothing to install: this file belongs to jmrplens/gitlab-mcp-server. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/jmrplens/gitlab-mcp-server/main/.github/skills/create-mcp-tool/SKILL.mdgit clone --depth 1 https://github.com/jmrplens/gitlab-mcp-serverWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/jmrplens/gitlab-mcp-server/create-mcp-tool)<a href="https://agentmods.dev/skills/jmrplens/gitlab-mcp-server/create-mcp-tool"><img src="https://agentmods.dev/badge/skills/jmrplens/gitlab-mcp-server/create-mcp-tool/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/jmrplens/gitlab-mcp-server/create-mcp-tool"><img src="https://agentmods.dev/badge/skills/jmrplens/gitlab-mcp-server/create-mcp-tool.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 1 finding, up to medium
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- medium MCP Rug Pull · line 377 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00052 | $0.05584 |
| Opus 5.5 | $0.00021 | $0.02234 |
| Sonnet 5.5 | $0.00010 | $0.01117 |
| Haiku 4.5 | $0.00005 | $0.00558 |
Grade A, and why
create-mcp-tool scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 422 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Create MCP Tool — GitLab
Step-by-step workflow for creating a new MCP tool that wraps a GitLab REST/GraphQL API endpoint.
Prerequisites
- Identify the GitLab API endpoint(s) (REST v4 or GraphQL)
- Confirm the
client-golibrary supports the endpoint — if not, consider theupstream-contributionskill - Decide the domain name (e.g.,
tags,branches,pipelines)
File Structure
Create a new sub-package under internal/tools/{domain}/:
{domain}/
├── doc.go # Package comment (the one `// Package {domain} ...` comment)
├── {domain}.go # Input/Output structs + handler logic
├── action_specs.go # Canonical ActionSpec route metadata
├── markdown.go # Markdown formatters + init() registry
├── shapes.go # Optional: nested output shapes mirrored from client-go sub-objects
└── {domain}_test.go # Tests with httptest (plus action_specs_test.go, markdown_test.go as needed)
A multi-word domain separates the words with underscores in its file names
only: merge_requests.go and merge_requests_test.go in package mergerequests.
Go's convention and the stylecheck/revive naming rules refuse underscores in
a package identifier, and the directory follows the package.
Step 1: Define Input/Output Structs
In {domain}.go:
package {domain}
import "github.com/jmrplens/gitlab-mcp-server/v3/internal/toolutil"
type ListInput struct {
toolutil.PaginationInput
toolutil.KeysetPaginationInput // only when the endpoint supports keyset pagination
ProjectID toolutil.StringOrInt `json:"project_id" jsonschema:"Project ID or URL-encoded path,required"`
}
type Output struct {
toolutil.HintableOutput
ID int `json:"id"`
Name string `json:"name"`
WebURL string `json:"web_url"`
}
type ListOutput struct {
toolutil.HintableOutput
Items []Output `json:"items"`
Pagination toolutil.PaginationOutput `json:"pagination"`
}
Rules:
- Embed
toolutil.HintableOutputas first field (enablesnext_stepsin JSON) - Embed
toolutil.PaginationInputfor list operations, andtoolutil.KeysetPaginationInputbeside it when the GitLab endpoint supports keyset pagination; such a list also passestoolutil.KeysetContinuation(input.KeysetPaginationInput)on its SDK call, last, aftergl.WithContext(ctx)(it makes the token the whole query, so an option after it would add to GitLab's link), or thenext_page_tokenits keyset pages publish cannot be followed (testutil.KeysetListingandtestutil.FollowKeysettest it) - Use
toolutil.StringOrIntfor project/group IDs - Tag fields that only exist at a higher GitLab tier with
tier:"premium"ortier:"ultimate"; the catalog prunes them from the schema below that tier - Use
jsonschema:"description,required"for a field GitLab requires on the route the action sends, and only for that: the marker is the one required list all three surfaces serve (omitemptyno longer decides it), andmake audit-1to1-requiredfails on a marker the live record disagrees with unlesscmd/audit_1to1/internal/required/declarations.gosays why. A choice between fields GitLab states asat_least_one_oforexactly_one_ofis ananyOfthroughtoolutil.SchemaAnyOfRequiredin the spec'sInputSchemaOverrides, with neither field marked - Use
json:",omitempty"for optional fields - No domain prefix on type names — the package provides namespace
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today Changed · +1 lines 5d85b4c76623
- 9d ago Changed 99b8b9cfa0b6
- 11d ago Changed 41dde3b4a77e
- 16d ago Changed · +2 lines eca0e596ea2f
- 25d ago Changed · +1 lines d1b9286dd5a2
- 27d ago Changed · +5 lines 75083231ed2c
- 1mo ago Changed · +16 lines eaa7e2646567
- 1mo ago Changed 43ba3733aee7
- 1mo ago Changed · +47 lines 640286f42ec0
- 1mo ago First seen · 350 lines · 52 tokens per session scan A 60842c2d4263
create-mcp-tool is a skill published in the GitHub repository jmrplens/gitlab-mcp-server (46 stars, last pushed today), licensed MIT. It adds 52 tokens to every session and 5,584 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
x402
Set up Browser Use Cloud payments with x402 — pay per request from a crypto wallet (USDC on Base mainnet), no signup or API key. Two setups it works out up front — "just use it" (set up a wallet so you or Claude Code can run cloud browser tasks paid from the wallet — Claude writes and runs throwaway scripts, nothing…
cloud
Documentation reference for using Browser Use Cloud — the hosted API and SDK for browser automation. Use this skill whenever the user needs help with the Cloud REST API (v2, v3, or v4), browser-use-sdk (Python or TypeScript), X-Browser-Use-API-Key authentication, cloud sessions, browser profiles, profile sync, CDP…
open-source
Documentation reference for writing Python code using the browser-use open-source library. Use this skill whenever the user needs help with Agent, Browser, or Tools configuration, is writing code that imports from browseruse, asks about @sandbox deployment, supported LLM models, Actor API, custom tools, lifecycle…
manifold-api
Use when an agent needs to inspect or call the local Manifold HTTP API. Provides guidelines and scripts to filter specs before reading and handle payloads safely.
go-expert
Expert-level Go development with Go 1.22+ features, concurrency, standard library, and production-grade best practices. Use when the user mentions concurrency, microservices, or backend, or when the task involves idiomatic Go, goroutines and channels, context-based cancellation, or writing an HTTP server.
nornweave-api
Give AI agents their own email inboxes using the NornWeave API. Use when building email agents, sending/receiving emails programmatically, managing inboxes, retrieving threads, searching messages, or integrating with email providers (Mailgun, SES, SendGrid, Resend). NornWeave provides LLM-ready markdown parsing and…