Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/jmrplens/gitlab-mcp-server/create-mcp-toolnpx skills add jmrplens/gitlab-mcp-server --skill create-mcp-toolgit 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.svg" alt="Measured on agentmods" height="20"></a>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 | $0.00052 | $0.02881 |
| Opus 5 | $0.00026 | $0.01440 |
| Sonnet 5 | $0.00010 | $0.00576 |
| Haiku 4.5 | $0.00005 | $0.00288 |
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 yesterday.
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 — 345 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}/
├── {domain}.go # Input/Output structs + handler logic
├── action_specs.go # Canonical ActionSpec route metadata
├── markdown.go # Markdown formatters + init() registry
└── {domain}_test.go # Table-driven tests with httptest
Step 1: Define Input/Output Structs
In {domain}.go:
package {domain}
import "github.com/jmrplens/gitlab-mcp-server/v2/internal/toolutil"
type ListInput struct {
toolutil.PaginationInput
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"`
}
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 - Use
toolutil.StringOrIntfor project/group IDs - Use
jsonschema:"description,required"for required fields - Use
json:",omitempty"for optional fields - No domain prefix on type names — the package provides namespace
Step 2: Implement Handler Functions
In {domain}.go:
func List(ctx context.Context, client *gitlabclient.Client, input ListInput) (ListOutput, error) {
opts := &gl.ListXxxOptions{
ListOptions: gl.ListOptions{
Page: input.Page(),
PerPage: input.PerPage(),
},
}
items, resp, err := client.GL().Xxx.ListXxx(input.ProjectID.String(), opts, gl.WithContext(ctx))
if err != nil {
return ListOutput{}, toolutil.WrapErrWithMessage("xxxList", err)
}
out := ListOutput{
Items: convertItems(items),
Pagination: toolutil.BuildPagination(resp),
}
return out, nil
}
func Create(ctx context.Context, client *gitlabclient.Client, input CreateInput) (Output, error) {
opts := &gl.CreateXxxOptions{
Name: gl.Ptr(input.Name),
}
item, _, err := client.GL().Xxx.CreateXxx(input.ProjectID.String(), opts, gl.WithContext(ctx))
if err != nil {
switch {
case toolutil.ContainsAny(err, "already exists"):
return Output{}, toolutil.WrapErrWithHint("xxxCreate", err,
"a resource with this name already exists")
default:
return Output{}, toolutil.WrapErrWithMessage("xxxCreate", err)
}
}
return convertItem(item), nil
}
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.
- yesterday Changed 2db90cd1a0a4
- 5d ago First seen · 345 lines · 52 tokens per session scan A 82b8d238666e
create-mcp-tool is a skill published in the GitHub repository jmrplens/gitlab-mcp-server (33 stars, last pushed yesterday), licensed MIT. It adds 52 tokens to every session and 2,881 once invoked, about $0.0003 per session on Opus 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
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work.
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…
kayba-stage-5-action-plan
Triage each insight into discard/code-fix/prompt-fix and produce a prioritized action plan with specific recommendations. Trigger when the user says "run stage 5", "make action plan", "triage skills", or when invoked by the kayba-pipeline orchestrator. Requires eval outputs from stages 1-4.
kayba-stage-2-domain-context
Gather domain context about the repository and agent — system prompt, tool definitions, domain docs, and behavior patterns from traces. Trigger when the user says "run stage 2", "gather context", "domain context", or when invoked by the kayba-pipeline orchestrator.
playwright-screen-recording
Record browser test videos with Playwright for PR review and bug fix verification.
kayba-stage-1-api-analysis
Fetch pre-computed insights from the Kayba API and build a structured summary. Does NOT upload traces or trigger generation — analysis is assumed to already exist. Trigger when the user says "run stage 1", "get insights", "fetch skills", "kayba analyze", or when invoked by the kayba-pipeline orchestrator. Requires the…