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 Utopia5327/claude-plugin-for-revit-bim --skill validate-parametersgit clone --depth 1 https://github.com/Utopia5327/claude-plugin-for-revit-bimWrote 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/utopia5327/claude-plugin-for-revit-bim/validate-parameters)<a href="https://agentmods.dev/skills/utopia5327/claude-plugin-for-revit-bim/validate-parameters"><img src="https://agentmods.dev/badge/skills/utopia5327/claude-plugin-for-revit-bim/validate-parameters.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.1 | $0.00149 | $0.01658 |
| Opus 5 | $0.00075 | $0.00829 |
| Sonnet 5 | $0.00030 | $0.00332 |
| Haiku 4.5 | $0.00015 | $0.00166 |
Grade A, and why
validate-parameters 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 8d 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 — 217 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Validate Revit Parameters
Run a BIM data completeness check for:
"$ARGUMENTS"
Before writing code
Ask (one question if ambiguous):
- Which category and which parameters must be filled? (e.g. all Rooms must have Name, Number, Department, Occupancy)
- What counts as valid? Non-empty? A value from a specific list? A number above zero?
- Output format? Dynamo OUT list, or also export to CSV?
Read-only — no model modifications.
Script: Required parameter completeness check
import clr
clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
import csv, os
doc = DocumentManager.Instance.CurrentDBDocument
# ── Configuration ────────────────────────────────────────────────────────────
# Define which categories and which parameters are REQUIRED
VALIDATION_RULES = {
BuiltInCategory.OST_Rooms: [
"Name", "Number", "Department", "Occupancy"
],
BuiltInCategory.OST_Doors: [
"Mark", "Fire Rating", "Width", "Height"
],
BuiltInCategory.OST_Windows: [
"Mark", "Width", "Height"
],
}
# Optional: allowed value lists (leave empty dict {} to skip)
ALLOWED_VALUES = {
# "Fire Rating": ["30", "60", "90", "120", "FD30", "FD60", "FD90"],
# "Occupancy": ["Office", "Meeting", "Circulation", "WC", "Stair"],
}
# Export report to CSV? Set to None to skip file export.
OUTPUT_CSV = r"C:\Exports\parameter_validation_report.csv"
# ─────────────────────────────────────────────────────────────────────────────
def get_str_value(el, param_name):
"""Return parameter value as string, or None if missing/unset."""
param = el.LookupParameter(param_name)
if not param:
return None # Parameter doesn't exist on this element
st = param.StorageType
if st == StorageType.String:
v = param.AsString()
return v if v else ""
elif st == StorageType.Double:
v = param.AsDouble()
return str(round(v, 4)) if v is not None else ""
elif st == StorageType.Integer:
return str(param.AsInteger())
elif st == StorageType.ElementId:
eid = param.AsElementId()
ref = doc.GetElement(eid)
return ref.Name if ref else ""
return ""
try:
all_issues = []
summary = {}
for category, required_params in VALIDATION_RULES.items():
elements = list(FilteredElementCollector(doc)
.OfCategory(category)
.WhereElementIsNotElementType()
.ToElements())
cat_name = doc.Settings.Categories.get_Item(category).Name
issues = []
passed = 0
for el in elements:
el_issues = []
el_id = str(el.Id.IntegerValue)
# Try to get a display name for the element
name_param = el.LookupParameter("Name") or el.LookupParameter("Mark")
el_name = (name_param.AsString() if name_param else None) or el_id
for param_name in required_params:
value = get_str_value(el, param_name)
if value is None:
el_issues.append(param_name + ": PARAMETER NOT FOUND")
elif value.strip() == "":
el_issues.append(param_name + ": EMPTY")
elif param_name in ALLOWED_VALUES:
allowed = ALLOWED_VALUES[param_name]
if value not in allowed:
el_issues.append(param_name + ": '" + value +
"' not in allowed list " + str(allowed))
if el_issues:
issues.append({
"Category": cat_name,
"ElementId": el_id,
"Element": el_name,
"Issues": " | ".join(el_issues)
})
else:
passed += 1
summary[cat_name] = {
"Total": len(elements),
"Passed": passed,
"Failed": len(issues),
"Pass Rate": (str(round(100 * passed / len(elements))) + "%") if elements else "N/A"
}
all_issues.extend(issues)
# Write CSV report
if OUTPUT_CSV and all_issues:
os.makedirs(os.path.dirname(OUTPUT_CSV), exist_ok=True)
with open(OUTPUT_CSV, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=["Category", "ElementId", "Element", "Issues"])
writer.writeheader()
writer.writerows(all_issues)
OUT = {
"Summary": summary,
"Total Issues": len(all_issues),
"Issues": all_issues[:50], # show first 50 in Dynamo
"Report": OUTPUT_CSV if OUTPUT_CSV else "No file export configured"
}
except Exception as e:
import traceback
OUT = "ERROR: " + str(e) + "\n" + traceback.format_exc()
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.
- 8d ago First seen · 217 lines · 149 tokens per session scan A 731d06d5408e
validate-parameters is a skill published in the GitHub repository Utopia5327/claude-plugin-for-revit-bim (6 stars, last pushed 6mo ago), licensed MIT. It adds 149 tokens to every session and 1,658 once invoked, about $0.0007 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-31.
Other skills, from other repositories
systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.
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…
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…
next-cache-components-optimizer
Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components / PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next/playwright instant() e2e and work it to green, one verified route at a time; the shipped test then…
next-partial-prefetching-adoption
Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the partialPrefetching flag, opt routes in with export const prefetch = 'partial', audit Link prefetch={true} behavior, preserve existing prefetched UI with…
chronicle
Analyze Copilot session history for standup reports, usage tips, session search, and session reindexing. Use when the user asks for a standup, daily summary, usage tips, workflow recommendations, wants to search or find past sessions by keyword/file/PR, wants to reindex their session store, or asks about deleting…