Skip to content
Agentmart
Submit a tool

json-schema-from-python-signature

Generate a JSON Schema for an LLM tool's input from a Python function signature using inspect + get_type_hints, mapping str→string, int→integer, list→array…

Skill by kjuhwa

IndexedMIT
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/kjuhwa-json-schema-from-python-signature

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Generate a JSON Schema for an LLM tool's input from a Python function signature using inspect + get_type_hints, mapping str→string, int→integer, list→array, with Optional→nullable handling.

Use cases: ml, agent-building

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/json-schema-from-python-signature

What's inside

Skill name
json-schema-from-python-signature
Description
Generate a JSON Schema for an LLM tool's input from a Python function signature using inspect + get_type_hints, mapping str→string, int→integer, list→array, with Optional→nullable handling.
License
MIT
Instructions
58 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

# JSON Schema from Python Function Signature

## When to use
You're auto-registering function tools for an LLM (Anthropic tool-use, OpenAI function-calling) and don't want users to hand-write a JSON Schema for every tool. The function's annotated signature already describes the inputs.

## How it works
- `_strip_optional(annotation)` peels `Optional[T]` / `T | None` and remembers whether the field is nullable.
- `_annotation_to_json_schema` maps Python types to JSON Schema primitives.
- `infer_input_schema(func)` walks the signature, skips `*args`/`**kwargs` and underscore-prefixed params, computes each property's schema, and marks the param required if it has no default and isn't optional.

## Example
```python
def _strip_optional(annotation):
    origin = get_origin(annotation)
    if origin is None:
        return annotation, False
    args = tuple(a for a in get_args(annotation) if a is not NoneType)
    if len(args) != len(get_args(annotation)):
        if len(args) == 1: return args[0], True
        return args, True
    return annotation, False

def _annotation_to_json_schema(annotation):
    base, is_optional = _strip_optional(annotation)
    origin = get_origin(base)
    if base in (inspect.Signature.empty, Any):  schema = {}
    elif base is str:    schema = {"type": "string"}
    elif base is int:    schema = {"type": "integer"}
    elif base is float:  schema = {"type": "number"}
    elif base is bool:   schema = {"type": "boolean"}
    elif base is dict or origin is dict:  schema = {"type": "object"}
    elif base is list or origin in (list, set, tuple): schema = {"type": "array"}
    else: schema = {"type": "string"}
    if is_optional: schema["nullable"] = True
    return schema

def infer_input_schema(func):
    properties, required = {}, []
    type_hints = get_type_hints(func)
    for param in inspect.signature(func).parameters.values():
        if param.kind in (inspect.Parameter.VAR_POSITIONAL,
                          inspect.Parameter.VAR_KEYWORD): continue
        if param.name.startswith("_"): continue
        ann = type_hints.get(param.name, param.annotation)
        properties[param.name] = _annotation_to_json_schema(ann)
        _, is_optional = _strip_optional(ann)
        if param.default is inspect.Signature.empty and not is_optional:
            required.append(param.name)
    return {"type": "object", "properties": properties, "required": required}
```

## Gotchas
- Use `get_type_hints(func)` instead of reading `param.annotation` directly so forward references and `from __future__ import annotations` strings are resolved.
- Skip underscore-prefixed params — they're convention for "internal, do not pass" (e.g. `_sources` injected by the framework).
- The fallback type is `"string"` because LLMs handle string inputs gracefully when in doubt; using `"object"` would cause more hallucinations.
- Add `nullable: true` for Optional fields; some providers respect it (Anthropic, NIM) and OpenAI ignores extra fields.

From kjuhwa/skills-hub, MIT.

More from kjuhwa/skills-hub

Signals

Stars
0
Forks
0
Open issues
17
Last commit (this folder)
Apr 25, 2026 (6 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from kjuhwa

Cite this page

json-schema-from-python-signature skill. Agent Mart. https://agentmart.dev/skills/kjuhwa-json-schema-from-python-signature (last updated 2026-10-24)