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 skills add nezolder/civil3d-mcp-roslyn --skill create_offset_alignmentsgit clone --depth 1 https://github.com/nezolder/civil3d-mcp-roslynWrote 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/nezolder/civil3d-mcp-roslyn/create_offset_alignments)<a href="https://agentmods.dev/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments"><img src="https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments/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/nezolder/civil3d-mcp-roslyn/create_offset_alignments"><img src="https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_offset_alignments.svg" alt="Reviewed on agentmods" width="80" 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.1 | $0.00022 | $0.01962 |
| Opus 5.5 | $0.00009 | $0.00785 |
| Sonnet 5.5 | $0.00004 | $0.00392 |
| Haiku 4.5 | $0.00002 | $0.00196 |
Grade A, and why
create_offset_alignments 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 19d ago.
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 — 193 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Code Template
var parentAlignmentHandle = "PARENT_ALIGNMENT_HANDLE";
var offsets = new (string name, double offset)[] { };
var alignmentStyleName = "";
var fullLength = true;
var startStation = 0.0;
var endStation = 0.0;
var lockToStations = false;
var isName = new Func<string, bool>(value =>
!string.IsNullOrWhiteSpace(value) && value == value.Trim() && value.Length <= 255
&& !value.Any(char.IsControl));
if (string.IsNullOrWhiteSpace(parentAlignmentHandle)
|| !System.Text.RegularExpressions.Regex.IsMatch(parentAlignmentHandle, "^[0-9A-Fa-f]{1,16}$"))
{
return new { success = false, error = "parentAlignmentHandle must be a hexadecimal handle." };
}
if (offsets == null || offsets.Length < 1 || offsets.Length > 20)
{
return new { success = false, error = "offsets must contain 1 to 20 rows." };
}
if (offsets.Any(o => !isName(o.name) || !double.IsFinite(o.offset) || Math.Abs(o.offset) < 1e-6 || Math.Abs(o.offset) > 10000)
|| offsets.Select(o => o.name.ToUpperInvariant()).Distinct().Count() != offsets.Length)
{
return new { success = false, error = "Each row needs a distinct trimmed name and a nonzero finite offset of at most 10000." };
}
if (alignmentStyleName != "" && !isName(alignmentStyleName))
{
return new { success = false, error = "alignmentStyleName must be empty or a trimmed style name." };
}
Alignment parent = null;
try
{
var parentId = Database.GetObjectId(false, new Handle(System.Convert.ToInt64(parentAlignmentHandle, 16)), 0);
parent = Transaction.GetObject(parentId, OpenMode.ForRead) as Alignment;
}
catch
{
parent = null;
}
if (parent == null || parent.IsErased)
{
return new { success = false, error = "parentAlignmentHandle must identify an existing alignment.", parentAlignmentHandle };
}
if (!fullLength
&& (!double.IsFinite(startStation) || !double.IsFinite(endStation)
|| startStation < parent.StartingStation - 1e-6 || endStation > parent.EndingStation + 1e-6
|| endStation - startStation <= 1e-6))
{
return new {
success = false,
error = "startStation and endStation must lie inside the parent's station range with startStation before endStation.",
parentStartStation = parent.StartingStation,
parentEndStation = parent.EndingStation
};
}
var existingNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (ObjectId existingId in CivilDoc.GetAlignmentIds())
{
if (Transaction.GetObject(existingId, OpenMode.ForRead) is Alignment existing) existingNames.Add(existing.Name);
}
var taken = offsets.Where(o => existingNames.Contains(o.name)).Select(o => o.name).ToList();
if (taken.Count > 0)
{
return new { success = false, error = "Alignments with these names already exist.", names = taken };
}
ObjectId styleId = parent.StyleId;
if (alignmentStyleName != "")
{
try
{
styleId = CivilDoc.Styles.AlignmentStyles[alignmentStyleName];
}
catch
{
styleId = ObjectId.Null;
}
if (styleId.IsNull)
{
return new { success = false, error = "The named alignment style does not exist.", alignmentStyleName };
}
}
// Any failure throws, so either every offset alignment is created or none.
var created = new List<object>();
foreach (var row in offsets)
{
var id = fullLength
? Alignment.CreateOffsetAlignment(row.name, parent.ObjectId, row.offset, styleId)
: Alignment.CreateOffsetAlignment(row.name, parent.ObjectId, row.offset, styleId, startStation, endStation);
if (id.IsNull)
{
throw new InvalidOperationException($"Offset alignment '{row.name}' creation returned an invalid object ID.");
}
var alignment = (Alignment)Transaction.GetObject(id, OpenMode.ForWrite);
if (alignment.AlignmentType.ToString() != "Offset")
{
throw new InvalidOperationException($"'{row.name}' was not created as an offset alignment.");
}
var info = alignment.OffsetAlignmentInfo;
if (lockToStations)
{
info.LockMode = AlignmentLockModeType.Station;
if (info.LockMode != AlignmentLockModeType.Station)
{
throw new InvalidOperationException($"'{row.name}' did not accept the Station lock mode.");
}
}
created.Add(new {
name = alignment.Name,
handle = alignment.Handle.ToString(),
row.offset,
side = row.offset < 0 ? "left" : "right",
style = alignment.StyleName,
layer = alignment.Layer,
updateMode = info.UpdateMode.ToString(),
lockMode = info.LockMode.ToString(),
lockToStartStation = info.LockToStartStation,
lockToEndStation = info.LockToEndStation,
startStation = alignment.StartingStation,
endStation = alignment.EndingStation,
length = alignment.Length
});
}
return new {
success = true,
parent = new {
name = parent.Name,
handle = parent.Handle.ToString(),
type = parent.AlignmentType.ToString(),
isReference = parent.IsReferenceObject,
startStation = parent.StartingStation,
endStation = parent.EndingStation
},
created
};
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.
- 19d ago First seen · 193 lines · 22 tokens per session scan A ce73fbdb2792
create_offset_alignments is a skill published in the GitHub repository nezolder/civil3d-mcp-roslyn (3 stars, last pushed 16d ago), licensed MIT. It adds 22 tokens to every session and 1,962 once invoked, about $0.0001 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-10-09.
Other skills, from other repositories
local-ai-agents
Build local-first AI agents that run entirely on a developer workstation with Microsoft Foundry Local and Qwen function-calling models. Covers Small Language Models (SLMs), the OpenAI-compatible local endpoint, sandboxed local tools, local RAG with Chroma, local MCP servers, hybrid cloud/local routing, and the…
systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.
next-cache-components-adoption
Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the cacheComponents flag, work through a flood of blocking-prerender / instant validation errors, run the cache-components-instant-false codemod, or…
chat-pet-sprite-creation
Use when creating or changing VS Code chat pet sprite art, sprite sheets, state animations, eye treatments, Stable/Insiders variants, or pet transitions under src/vs/workbench/contrib/chat/browser/widget/media/chatPet.
cpu-profile-analysis
Analyze V8/Chrome CPU profiles (.cpuprofile) and DevTools trace files (Trace-.json). Use when: profiling performance, investigating slow functions, comparing code paths, finding bottlenecks, analyzing timeToRequest, understanding call trees from sampling profiler data, analyzing layout/paint/rendering, investigating…
insight-error-page
Write or audit an insight-kind error page for the Next.js dev overlay. Use when creating a new errors/ .mdx page, auditing an existing one, or checking that a page matches the framework fix cards. Covers page structure, title alignment, FixCard cards with Copy prompt button, code snippets, terminology verification…