Agent skill
output-parsers
Generate output parsers for mcptools with unstructured return types. Use when a tool returns raw strings or Result models with single str fields and needs structured ParseResult output. Covers testing tools, identifying parseable structures, extending modules with ParseResult models, and creating parser implementations.
Install this agent skill to your Project
npx add-skill https://github.com/gradion-ai/freeact/tree/main/freeact/agent/config/templates/skills/output-parsers
SKILL.md
Output Parsers for mcptools
Generate output parsers for Python tools in the mcptools package that have unstructured return types.
Identifying Unstructured Return Types
A tool has an unstructured return type when its run() function returns:
- A
strdirectly - A
Resultmodel with a singlestrfield (namedresult,content,output, etc.) plus onlymodel_config
A Result model with multiple fields (beyond model_config) has a structured return type and does not need a parser.
Workflow
1. Test the Python tool
Run the Python tool with ipybox_execute_ipython_cell tool using 2-3 example inputs to observe return value patterns:
from mcptools.<category>.<tool> import run, Params
result = run(Params(...))
print(result) # or print(result.result) for Result types
2. Identify structure
Examine the output for parseable structure (JSON, JSONL, XML, delimited text, etc.). If no consistent structure exists, a parser cannot be generated.
3. Extend the Python tool module
Preservation rules when extending tool modules:
- Never modify existing
Paramsclass or other existing model definitions - Never remove or modify existing imports (they may be used by existing code)
- Only add new imports, models, and functions
Docstring guidelines:
- Derive docstrings from the original
run()function docstring ParseResultdocstring should describe the parsed data structurerun_parsed()docstring must be exactly the same as therun()docstring- Field descriptions should explain what each field contains
Add to {generated_rel_dir}/mcptools/<category>/<tool>.py:
- A
ParseResultmodel:
class ParseResult(BaseModel):
"""<Describe parsed data, derived from run() docstring>."""
model_config = ConfigDict(
use_enum_values=True,
)
<field_name>: <field_type> = Field(..., title="<Title>", description="<What this field contains>")
- A
run_parsed()function:
def run_parsed(params: Params) -> ParseResult:
"""<Copy exact docstring from run() function>."""
from mcpparse.<category>.<tool> import parse
result = run(params)
# For str return: return parse(result)
# For Result return: return parse(result.result)
return parse(result)
4. Create parser module
Create {generated_rel_dir}/mcpparse/<category>/<tool>.py with:
from mcptools.<category>.<tool> import ParseResult
class <Tool>ParseError(Exception):
"""Exception raised when parsing <tool> results fails."""
pass
def parse(result: str) -> ParseResult:
"""Parse <tool> result into structured data.
Args:
result: Raw string result from the tool
Returns:
ParseResult with structured data
Raises:
<Tool>ParseError: If parsing fails
"""
# Implementation based on observed output structure
...
return ParseResult(...)
5. Test run_parsed()
Call the ipybox_reset tool to restart the IPython kernel so the next import loads the modified module.
Then test with ipybox_execute_ipython_cell using the same example inputs from step 1:
from mcptools.<category>.<tool> import run_parsed, Params
result = run_parsed(Params(...))
print(result)
Verify that the ParseResult fields are correctly populated.
Examples
str return type (web_search)
Original: run(params: Params) -> str returns JSONL
Extended with:
SearchResultmodel for individual itemsParseResultwithresults: list[SearchResult]run_parsed()that parses JSONL into structured objects
Result return type (search_abstracts)
Original: run(params: Params) -> Result where Result.result: str
Extended with:
Articlemodel for individual itemsParseResultwitharticles: list[Article]run_parsed()that parsesresult.resultinto structured objects
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
freeact-interaction
Interact with freeact agent via tmux for testing
saving-codeacts
Save executed Python code as reusable tools in the gentools package. Use when preserving successful code executions for later reuse. Covers creating package structure (api.py, impl.py), defining Pydantic output models, and implementing the run() interface.
task-planning
Structured task planning workflow with user feedback loops. Use when the user explicitly requests planning (e.g., "make a plan", "plan first", "create a plan"). Covers creating plans with actionable steps, iterating based on feedback, saving confirmed plans, and executing step-by-step with progress tracking.
codeact
Generate and execute code for acting with Python tools. Activate when user explicitly requests to "use the codeact skill" or similar phrases.
Ethical Hacking Methodology
This skill should be used when the user asks to "learn ethical hacking", "understand penetration testing lifecycle", "perform reconnaissance", "conduct security scanning", "exploit vulnerabilities", or "write penetration test reports". It provides comprehensive ethical hacking methodology and techniques.
Red Team Tools and Methodology
This skill should be used when the user asks to "follow red team methodology", "perform bug bounty hunting", "automate reconnaissance", "hunt for XSS vulnerabilities", "enumerate subdomains", or needs security researcher techniques and tool configurations from top bug bounty hunters.
Didn't find tool you were looking for?