Borrowing it
Nothing to install: this file belongs to atomantic/UEMCP. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/atomantic/UEMCP/main/.claude/skills/uemcp-manifest-type-hints/SKILL.mdgit clone --depth 1 https://github.com/atomantic/UEMCPWrote 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/atomantic/uemcp/uemcp-manifest-type-hints)<a href="https://agentmods.dev/skills/atomantic/uemcp/uemcp-manifest-type-hints"><img src="https://agentmods.dev/badge/skills/atomantic/uemcp/uemcp-manifest-type-hints/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/atomantic/uemcp/uemcp-manifest-type-hints"><img src="https://agentmods.dev/badge/skills/atomantic/uemcp/uemcp-manifest-type-hints.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
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.00118 | $0.00833 |
| Opus 5 | $0.00059 | $0.00417 |
| Sonnet 5 | $0.00024 | $0.00167 |
| Haiku 4.5 | $0.00012 | $0.00083 |
Grade A, and why
uemcp-manifest-type-hints 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 10d 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 — 83 lines — stays where its author put it; the contents beside it link to each section on GitHub.
UEMCP Manifest Generator Type Hint Compatibility
Problem
The UEMCP dynamic tool manifest generator (plugin/Content/Python/ops/tool_manifest.py)
uses typing.get_origin() to detect Optional[T] parameters and generate correct JSON
Schema. Python 3.10+ introduced str | None as shorthand for Optional[str], but these
produce types.UnionType — which typing.get_origin() does NOT recognize as Union.
This means parameters typed as str | None silently fall through to the default
{"type": "string"} without being detected as optional, causing them to appear as
required in the MCP tool schema.
Context / Trigger Conditions
- Adding new ops modules to UEMCP with Python 3.10+ type hints
- Parameters using
X | Noneinstead ofOptional[X] - Tools appear in manifest but optional parameters show as required
- No error is raised — the failure is completely silent
Solution
For PARAMETER type hints (processed by the manifest generator): Always use
Optional[X] from typing, never X | None:
from typing import Any, Optional
def my_tool(
required_param: str, # Required - no default
optional_param: Optional[str] = None, # Correctly detected as optional
# NOT: optional_param: str | None = None # BROKEN - silently treated as required string
) -> dict[str, Any]: # Return types are fine with modern syntax
...
For RETURN type hints (not processed by the manifest generator): Modern syntax
is fine — use dict[str, Any], list[str], etc.
Why This Happens
# tool_manifest.py line 79-80
origin = get_origin(python_type)
if origin is Union: # Only matches typing.Union, NOT types.UnionType
get_origin(Optional[str])returnstyping.Union(match)get_origin(str | None)returnstypes.UnionType(no match)
The parameter falls through all checks and hits the default: return {"type": "string"}
Verification
After adding a new ops module, check the manifest output:
from ops.tool_manifest import get_tool_manifest
manifest = get_tool_manifest()
# Find your tool and verify optional params are NOT in the "required" array
tool = next(t for t in manifest['tools'] if t['name'] == 'your_tool_name')
print(tool['inputSchema']['required']) # Should not include optional params
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.
- 10d ago First seen · 83 lines · 118 tokens per session scan A 4346937900c9
uemcp-manifest-type-hints is a skill published in the GitHub repository atomantic/UEMCP (18 stars, last pushed today), licensed MIT. It adds 118 tokens to every session and 833 once invoked, about $0.0006 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.
Other skills, from other repositories
chrome-devtools-cli
Use this skill to write shell scripts or run shell commands to automate tasks in the browser or otherwise use Chrome DevTools via CLI.
a11y-debugging
Uses Chrome DevTools MCP for accessibility (a11y) debugging and auditing based on web.dev guidelines. Use when testing semantic HTML, ARIA labels, focus states, keyboard navigation, tap targets, and color contrast.
chrome-devtools
Uses Chrome DevTools via MCP for efficient debugging, troubleshooting and browser automation. Use when debugging web pages, automating browser interactions, analyzing performance, or inspecting network requests. This skill does not apply to --slim mode (MCP configuration).
n8n-validation-expert
Interpret validation errors and guide fixing them. Use when encountering validation errors, validation warnings, false positives, operator structure issues, or need help understanding validation results. Also use when asking about validation profiles, error types, the validation loop process, or auto-fix capabilities.…
n8n-error-handling
Wire n8n error handling so failures are loud, structured, and recoverable. Use when building any webhook/API workflow, a scheduled or unattended workflow, or any path where a silent failure would drop user-visible work — and whenever the user mentions error handling, onError, continueErrorOutput, error…
agentcore-investigation
Investigate Bedrock AgentCore runtime sessions via CloudWatch Logs Insights — resolve session/trace IDs, query OTEL spans, filter noise, build timelines. Use when debugging AgentCore agent sessions, tracing tool calls, or analyzing latency.