create-mcp-tool

create-mcp-tool is a skill for Claude Code, Codex from jmrplens/gitlab-mcp-server. It costs 52 tokens per session (2,881 once invoked), scanned A, original, MIT.

A development workflow for adding a new MCP tool, an interface that lets an AI client call a server function backed by a GitLab API endpoint.

In plain words
What is it for?
Use it when adding a new GitLab REST or GraphQL operation to a Go MCP server.
Why use it?
It provides the project-specific pieces needed for a complete tool, including the handler, metadata, output formatting, tests, and documentation.

Skill for Claude CodeCodex

Install

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.

agentmods
npx agentmods add skills/jmrplens/gitlab-mcp-server/create-mcp-tool
Any agent
npx skills add jmrplens/gitlab-mcp-server --skill create-mcp-tool
Clone the repo
git clone --depth 1 https://github.com/jmrplens/gitlab-mcp-server

Made for: Claude Code, Codex.

Wrote 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.

agentmods badge for create-mcp-tool

README.md
[![agentmods](https://agentmods.dev/badge/skills/jmrplens/gitlab-mcp-server/create-mcp-tool.svg)](https://agentmods.dev/skills/jmrplens/gitlab-mcp-server/create-mcp-tool)
Your own site
<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>
Per session 52 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 2,881 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured yesterday against content hash 2db90cd1a0a4, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

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.

.github/skills/create-mcp-tool/SKILL.md · 345 lines

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-go library supports the endpoint — if not, consider the upstream-contribution skill
  • 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.HintableOutput as first field (enables next_steps in JSON)
  • Embed toolutil.PaginationInput for list operations
  • Use toolutil.StringOrInt for 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
}

Read the full file on GitHub · 345 lines

Changes

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.

  1. yesterday Changed 2db90cd1a0a4
  2. 5d ago First seen · 345 lines · 52 tokens per session scan A 82b8d238666e

Subscribe to this mod's changes

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.

Related

Other skills, from other repositories

browser-use

Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work.

browser-use/browser-use · 26 tokens

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…

browser-use/browser-use · 137 tokens

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-ai/agentic-context-engine · 74 tokens

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.

kayba-ai/agentic-context-engine · 64 tokens

playwright-screen-recording

Record browser test videos with Playwright for PR review and bug fix verification.

liaohch3/claude-tap · 20 tokens

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…

kayba-ai/agentic-context-engine · 93 tokens