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_surface_profile_viewgit 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_surface_profile_view)<a href="https://agentmods.dev/skills/nezolder/civil3d-mcp-roslyn/create_surface_profile_view"><img src="https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_surface_profile_view/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_surface_profile_view"><img src="https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_surface_profile_view.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.00024 | $0.02812 |
| Opus 5.5 | $0.00010 | $0.01125 |
| Sonnet 5.5 | $0.00005 | $0.00562 |
| Haiku 4.5 | $0.00002 | $0.00281 |
Grade A, and why
create_surface_profile_view 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 3d 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 — 243 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Code Template
var alignmentHandle = "ALIGNMENT_HANDLE";
var surfaceHandle = "SURFACE_HANDLE";
var profileName = "NEW_SURFACE_PROFILE_NAME";
var profileViewName = "NEW_PROFILE_VIEW_NAME";
var insertionX = 0.0;
var insertionY = 0.0;
var profileStyleName = "Terep";
var profileViewStyleName = "Út";
var profileLabelSetName = "PROFILE_LABEL_SET_NAME";
var bandSetStyleName = "PROFILE_VIEW_BAND_SET_STYLE_NAME";
var isHexHandle = new Func<string, bool>(value =>
!string.IsNullOrWhiteSpace(value)
&& System.Text.RegularExpressions.Regex.IsMatch(value, "^[0-9A-Fa-f]{1,16}$"));
var isName = new Func<string, bool>(value =>
!string.IsNullOrWhiteSpace(value)
&& value == value.Trim()
&& value.Length <= 255
&& !value.Any(char.IsControl));
var isConfiguredName = new Func<string, bool>(value =>
isName(value)
&& value != "NEW_SURFACE_PROFILE_NAME"
&& value != "NEW_PROFILE_VIEW_NAME"
&& value != "PROFILE_LABEL_SET_NAME"
&& value != "PROFILE_VIEW_BAND_SET_STYLE_NAME");
if (!isHexHandle(alignmentHandle))
return new { success = false, error = "alignmentHandle must be a non-empty hexadecimal handle." };
if (!isHexHandle(surfaceHandle))
return new { success = false, error = "surfaceHandle must be a non-empty hexadecimal handle." };
if (!isConfiguredName(profileName) || !isConfiguredName(profileViewName))
return new { success = false, error = "profileName and profileViewName must be configured trimmed non-empty names of at most 255 characters without control characters." };
if (!Double.IsFinite(insertionX) || !Double.IsFinite(insertionY))
return new { success = false, error = "insertionX and insertionY must be finite numbers." };
if (!isName(profileStyleName) || !isName(profileViewStyleName))
return new { success = false, error = "profileStyleName and profileViewStyleName must be trimmed non-empty names of at most 255 characters without control characters." };
if (!isConfiguredName(profileLabelSetName) || !isConfiguredName(bandSetStyleName))
return new { success = false, error = "profileLabelSetName and bandSetStyleName must be explicitly configured trimmed non-empty names." };
// Host access starts here.
ObjectId alignmentId;
ObjectId surfaceId;
try
{
alignmentId = Database.GetObjectId(false, new Handle(System.Convert.ToInt64(alignmentHandle, 16)), 0);
surfaceId = Database.GetObjectId(false, new Handle(System.Convert.ToInt64(surfaceHandle, 16)), 0);
}
catch
{
return new { success = false, error = "alignmentHandle or surfaceHandle does not resolve to an object in this drawing." };
}
var alignment = Transaction.GetObject(alignmentId, OpenMode.ForRead) as Alignment;
if (alignment == null || alignment.IsErased)
return new { success = false, error = "alignmentHandle must identify an existing Alignment." };
if (alignment.IsReferenceObject)
return new { success = false, error = "alignmentHandle must identify a local, non-reference Alignment." };
if (alignment.IsReferenceStale)
return new { success = false, error = "alignmentHandle identifies a stale Alignment reference and is refused." };
var surface = Transaction.GetObject(surfaceId, OpenMode.ForRead) as TinSurface;
if (surface == null || surface.IsErased || surface is TinVolumeSurface)
return new { success = false, error = "surfaceHandle must identify an existing TinSurface (not a grid or volume surface)." };
if (surface.IsReferenceObject)
return new { success = false, error = "surfaceHandle must identify a local, non-reference TinSurface." };
if (surface.IsReferenceStale)
return new { success = false, error = "surfaceHandle identifies a stale TinSurface reference and is refused." };
var rangeTolerance = 1e-6;
if (!Double.IsFinite(alignment.StartingStation)
|| !Double.IsFinite(alignment.EndingStation)
|| alignment.EndingStation - alignment.StartingStation <= rangeTolerance)
return new { success = false, error = "The alignment must have a finite, positive parent station range." };
if (alignment.LayerId.IsNull)
return new { success = false, error = "The alignment has no usable layer to reuse for the new profile." };
foreach (ObjectId existingProfileId in alignment.GetProfileIds())
{
var existingProfile = Transaction.GetObject(existingProfileId, OpenMode.ForRead) as Profile;
if (existingProfile != null && !existingProfile.IsErased
&& existingProfile.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase))
return new { success = false, error = "A profile with this name already exists on the selected alignment.", profileName };
}
foreach (ObjectId existingViewId in alignment.GetProfileViewIds())
{
var existingView = Transaction.GetObject(existingViewId, OpenMode.ForRead) as ProfileView;
if (existingView != null && !existingView.IsErased
&& existingView.Name.Equals(profileViewName, StringComparison.OrdinalIgnoreCase))
return new { success = false, error = "A profile view with this name already exists on the selected alignment.", profileViewName };
}
ObjectId profileStyleId;
ObjectId profileLabelSetId;
ObjectId profileViewStyleId;
ObjectId bandSetStyleId;
try
{
profileStyleId = CivilDoc.Styles.ProfileStyles[profileStyleName];
profileLabelSetId = CivilDoc.Styles.LabelSetStyles.ProfileLabelSetStyles[profileLabelSetName];
profileViewStyleId = CivilDoc.Styles.ProfileViewStyles[profileViewStyleName];
bandSetStyleId = CivilDoc.Styles.ProfileViewBandSetStyles[bandSetStyleName];
}
catch
{
return new { success = false, error = "One or more explicitly named profile, profile-label-set, profile-view, or profile-view-band-set styles are unavailable." };
}
if (profileStyleId.IsNull || profileLabelSetId.IsNull || profileViewStyleId.IsNull || bandSetStyleId.IsNull)
return new { success = false, error = "One or more explicitly named styles resolved to an invalid object ID." };
var profileId = Profile.CreateFromSurface(
profileName,
alignmentId,
surfaceId,
alignment.LayerId,
profileStyleId,
profileLabelSetId
);
if (profileId.IsNull)
throw new InvalidOperationException("Surface-profile creation returned an invalid object ID.");
var profile = Transaction.GetObject(profileId, OpenMode.ForWrite) as Profile;
if (profile == null || profile.IsErased)
throw new InvalidOperationException("Surface-profile creation did not return a readable profile.");
profile.UpdateMode = ProfileUpdateType.Dynamic;
if (!profile.Name.Equals(profileName, StringComparison.Ordinal)
|| profile.AlignmentId != alignmentId
|| profile.StyleId != profileStyleId
|| profile.ProfileType != ProfileType.EG
|| profile.UpdateMode != ProfileUpdateType.Dynamic
|| profile.Entities.Count == 0
|| !Double.IsFinite(profile.StartingStation)
|| !Double.IsFinite(profile.EndingStation)
|| Math.Abs(profile.StartingStation - alignment.StartingStation) > rangeTolerance
|| Math.Abs(profile.EndingStation - alignment.EndingStation) > rangeTolerance)
throw new InvalidOperationException("The created dynamic surface profile did not satisfy its postconditions.");
var startElevation = profile.ElevationAt(profile.StartingStation);
var endElevation = profile.ElevationAt(profile.EndingStation);
if (!Double.IsFinite(startElevation) || !Double.IsFinite(endElevation))
throw new InvalidOperationException("The created dynamic surface profile does not return finite endpoint elevations.");
// Civil 3D 2025 API lookup proves this overload orders band-set style, then profile-view style.
var viewId = ProfileView.Create(
alignmentId,
new Point3d(insertionX, insertionY, 0.0),
profileViewName,
profileViewBandSetId: bandSetStyleId,
profileViewStyleId: profileViewStyleId
);
if (viewId.IsNull)
throw new InvalidOperationException("Profile-view creation returned an invalid object ID.");
var view = Transaction.GetObject(viewId, OpenMode.ForRead) as ProfileView;
if (view == null || view.IsErased
|| !view.Name.Equals(profileViewName, StringComparison.Ordinal)
|| view.AlignmentId != alignmentId
|| view.StyleId != profileViewStyleId)
throw new InvalidOperationException("The created profile view did not satisfy its postconditions.");
return new {
success = true,
profile = new {
handle = profile.Handle.ToString(),
name = profile.Name,
alignmentHandle = alignment.Handle.ToString(),
surfaceHandle = surface.Handle.ToString(),
layer = profile.Layer,
style = profile.StyleName,
type = profile.ProfileType.ToString(),
updateMode = profile.UpdateMode.ToString(),
startStation = profile.StartingStation,
endStation = profile.EndingStation,
startElevation,
endElevation
},
profileView = new {
handle = view.Handle.ToString(),
name = view.Name,
style = view.StyleName,
requestedInsertion = new { x = insertionX, y = insertionY, z = 0.0 }
}
};
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.
- 3d ago First seen · 243 lines · 24 tokens per session scan A 379ae420c650
create_surface_profile_view is a skill published in the GitHub repository nezolder/civil3d-mcp-roslyn (3 stars, last pushed today), licensed MIT. It adds 24 tokens to every session and 2,812 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-09-29.
Other skills, from other repositories
webgl-holographic-foil
A self-contained WebGL2 hero: thin-film interference over a crushed-foil surface whose palette shifts with the viewing angle; move the cursor to tilt the film.
html-ppt-hermes-cyber-terminal
OpenDesign + BYOK: choosing and wiring your own model, hands-on — cost, quality, and the routing decision. Built as a decision-grade AI literacy deck for engineers, IT, applied-AI teams.
html-ppt-taste-brutalist
16:9 HTML deck in tactical-telemetry / CRT-terminal taste. Deactivated-CRT charcoal slides, white-phosphor monospace, hazard-red accent, scanline overlay, ASCII syntax, density over decoration. Distilled from Leonxlnx/taste-skill brutalist-skill (Tactical Telemetry mode).
visual-ralph
Visual Ralph orchestration for frontend UI from generated references, static references, or live URL targets, using $ultragoal with built-in visual verdict and pixel-diff evidence until the implementation matches and leaves a reproducible design system.
accessibility
Consolidated accessibility skill entrypoint for WCAG 2.2, ARIA Authoring Practices, cognitive accessibility, Section 508, EN 301 549, design intent verification, and the Accessibility Planner workflow.
make-resume
A Chinese-language tool for creating editable HTML resumes that can be changed in a browser and printed to PDF. It uses available resume templates when they are installed and otherwise provides a simpler fallback.