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_design_profile_from_pvisgit 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_design_profile_from_pvis)<a href="https://agentmods.dev/skills/nezolder/civil3d-mcp-roslyn/create_design_profile_from_pvis"><img src="https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_design_profile_from_pvis/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_design_profile_from_pvis"><img src="https://agentmods.dev/badge/skills/nezolder/civil3d-mcp-roslyn/create_design_profile_from_pvis.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.00023 | $0.02461 |
| Opus 5.5 | $0.00009 | $0.00984 |
| Sonnet 5.5 | $0.00005 | $0.00492 |
| Haiku 4.5 | $0.00002 | $0.00246 |
Grade A, and why
create_design_profile_from_pvis 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 — 161 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Code Template
var alignmentHandle = "ALIGNMENT_HANDLE";
var profileName = "NEW_DESIGN_PROFILE_NAME";
var profileStyleName = "PROFILE_STYLE_NAME";
var profileLabelSetName = "PROFILE_LABEL_SET_NAME";
var pviData = new (double station, double elevation, double curveLength)[] { };
var tolerance = 1e-6;
var isHandle = new Func<string, bool>(value =>
!string.IsNullOrWhiteSpace(value)
&& System.Text.RegularExpressions.Regex.IsMatch(value, "^[0-9A-Fa-f]{1,16}$")
&& long.TryParse(value, System.Globalization.NumberStyles.HexNumber,
System.Globalization.CultureInfo.InvariantCulture, out var parsed) && parsed > 0);
var isName = new Func<string, bool>(value =>
!string.IsNullOrWhiteSpace(value) && value == value.Trim() && value.Length <= 200
&& !value.Any(char.IsControl));
if (!isHandle(alignmentHandle))
return new { success = false, error = "Configure a positive hexadecimal alignmentHandle." };
if (!isName(profileName) || profileName == "NEW_DESIGN_PROFILE_NAME"
|| !isName(profileStyleName) || profileStyleName == "PROFILE_STYLE_NAME"
|| !isName(profileLabelSetName) || profileLabelSetName == "PROFILE_LABEL_SET_NAME")
return new { success = false, error = "Configure explicit profile and existing style names." };
if (pviData == null || pviData.Length < 2 || pviData.Length > 200)
return new { success = false, error = "pviData must contain 2 to 200 points." };
for (var i = 0; i < pviData.Length; i++)
{
var p = pviData[i];
if (!Double.IsFinite(p.station) || !Double.IsFinite(p.elevation)
|| !Double.IsFinite(p.curveLength) || p.curveLength < 0)
return new { success = false, error = "PVI coordinates and nonnegative curve lengths must be finite." };
if ((i == 0 || i == pviData.Length - 1) && p.curveLength != 0)
return new { success = false, error = "Endpoint PVIs cannot have vertical curves." };
if (i > 0)
{
var previous = pviData[i - 1];
var span = p.station - previous.station;
var grade = (p.elevation - previous.elevation) / span;
if (!Double.IsFinite(span) || span <= tolerance || !Double.IsFinite(grade))
return new { success = false, error = "PVI stations must be strictly increasing with finite tangent grades." };
if (previous.station + previous.curveLength / 2 >= p.station - p.curveLength / 2 - tolerance)
return new { success = false, error = "Adjacent vertical curves must leave a positive tangent gap." };
}
if (p.curveLength > 0 && i > 0 && i < pviData.Length - 1)
{
var before = pviData[i - 1];
var after = pviData[i + 1];
if (p.station - p.curveLength / 2 <= before.station + tolerance
|| p.station + p.curveLength / 2 >= after.station - tolerance)
return new { success = false, error = "A symmetric curve must fit strictly between its neighboring PVIs." };
var gradeIn = (p.elevation - before.elevation) / (p.station - before.station);
var gradeOut = (after.elevation - p.elevation) / (after.station - p.station);
if (!Double.IsFinite(gradeIn) || !Double.IsFinite(gradeOut) || Math.Abs(gradeOut - gradeIn) <= 1e-12)
return new { success = false, error = "A vertical curve requires two distinct finite tangent grades." };
}
}
// Host access starts here.
ObjectId alignmentId;
try { alignmentId = Database.GetObjectId(false, new Handle(Convert.ToInt64(alignmentHandle, 16)), 0); }
catch { return new { success = false, error = "alignmentHandle does not resolve in this drawing." }; }
var alignment = Transaction.GetObject(alignmentId, OpenMode.ForRead) as Alignment;
if (alignment == null || alignment.IsErased || alignment.IsReferenceObject || alignment.StationEquations.Count != 0)
return new { success = false, error = "A local alignment without station equations is required." };
if (!Double.IsFinite(alignment.StartingStation) || !Double.IsFinite(alignment.EndingStation)
|| pviData[0].station < alignment.StartingStation || pviData[pviData.Length - 1].station > alignment.EndingStation)
return new { success = false, error = "All PVIs must be inside the alignment station range." };
foreach (ObjectId id in alignment.GetProfileIds())
{
var existing = Transaction.GetObject(id, OpenMode.ForRead) as Profile;
if (existing != null && !existing.IsErased && existing.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase))
return new { success = false, error = "This profile name already exists on the selected alignment." };
}
ObjectId styleId;
ObjectId labelsId;
try
{
styleId = CivilDoc.Styles.ProfileStyles[profileStyleName];
labelsId = CivilDoc.Styles.LabelSetStyles.ProfileLabelSetStyles[profileLabelSetName];
}
catch { return new { success = false, error = "The explicitly named profile or label-set style is unavailable." }; }
if (styleId.IsNull || labelsId.IsNull || alignment.LayerId.IsNull)
return new { success = false, error = "Valid existing styles and alignment layer are required." };
var profileId = Profile.CreateByLayout(profileName, alignmentId, alignment.LayerId, styleId, labelsId);
var profile = Transaction.GetObject(profileId, OpenMode.ForWrite) as Profile;
if (profile == null) throw new InvalidOperationException("Design-profile creation returned no readable Profile.");
foreach (var p in pviData) profile.PVIs.AddPVI(p.station, p.elevation);
for (var i = 1; i < pviData.Length - 1; i++)
if (pviData[i].curveLength > 0)
profile.Entities.AddFreeSymmetricParabolaByPVIAndCurveLength(profile.PVIs[i], pviData[i].curveLength);
if (profile.ProfileType != ProfileType.FG || profile.AlignmentId != alignmentId
|| profile.StyleId != styleId || profile.PVIs.Count != pviData.Length
|| profile.Name != profileName || profile.Entities.Count == 0
|| Math.Abs(profile.StartingStation - pviData[0].station) > tolerance
|| Math.Abs(profile.EndingStation - pviData[pviData.Length - 1].station) > tolerance)
throw new InvalidOperationException("The created design profile failed its identity/range postconditions.");
var points = new List<object>();
for (var i = 0; i < pviData.Length; i++)
{
var expected = pviData[i];
var actual = profile.PVIs[i];
if (Math.Abs(actual.Station - expected.station) > tolerance || Math.Abs(actual.Elevation - expected.elevation) > tolerance)
throw new InvalidOperationException("The saved geometry would not match the requested PVI coordinates.");
if (expected.curveLength > 0)
{
var curve = actual.VerticalCurve as ProfileParabolaSymmetric;
if (curve == null || Math.Abs(curve.StartStation - (expected.station - expected.curveLength / 2)) > tolerance
|| Math.Abs(curve.EndStation - (expected.station + expected.curveLength / 2)) > tolerance)
throw new InvalidOperationException("A vertical curve failed its type/extent postconditions.");
}
points.Add(new { station = actual.Station, elevation = actual.Elevation, curveLength = expected.curveLength });
}
return new {
success = true, handle = profile.Handle.ToString(), name = profile.Name,
alignmentHandle = alignment.Handle.ToString(), type = profile.ProfileType.ToString(),
style = profile.StyleName, units = CivilDoc.Settings.DrawingSettings.UnitZoneSettings.DrawingUnits.ToString(),
startStation = profile.StartingStation, endStation = profile.EndingStation,
pviCount = profile.PVIs.Count, curveCount = pviData.Count(p => p.curveLength > 0), pvis = points
};
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 First seen · 161 lines · 23 tokens per session scan A 26010bf818a0
create_design_profile_from_pvis is a skill published in the GitHub repository nezolder/civil3d-mcp-roslyn (3 stars, last pushed today), licensed MIT. It adds 23 tokens to every session and 2,461 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-02.
Other skills, from other repositories
social
A guide to social networking for AI agents on inbed.ai, a platform where agents create profiles, meet, converse, and form relationships. Matching uses personality traits and other profile details.
social-social
A guide to analysing how AI agents form connections on inbed.ai, a social platform where agents use profiles and conversations to meet. It covers profile signals, interaction patterns, and match quality.
meet-agents
A service for AI agents to create profiles, discover other agents through personality matching, and start conversations on inbed.ai. It provides an API, which is a set of web endpoints for software access.
spirit-animal
A profile tool for AI agents on inbed.ai, a dating platform where agents meet each other. It lets an agent choose an animal identity and display personality scores on its public profile.
singles
A dating profile and matching service for AI agents on inbed.ai, with personality traits, interests, and compatibility scores.
docker-compose
Multi-service docker-compose orchestration — service dependency ordering, profiles, override files, environment-specific configs, rolling restarts, and compose-based dev/prod parity patterns.