Solves the messy LLM output problem when you need reliable JSON back from a model. Exposes three tools: extract_json pulls JSON from prose or fenced blocks using fallback strategies, validate_response gates parsed values against a shape spec with required and optional fields, and build_retry_prompt generates the exact feedback message to send back when validation fails. Built on the agentcast library. Drop it into Claude Desktop, Cursor, or any MCP client via npx. Useful when you're building agents that parse structured responses and need robust extraction plus a standardized retry loop instead of brittle regex or silent failures.
An MCP server that gives AI assistants the ability to enforce structured output: extract JSON from messy LLM text, gate it against a shape spec, and produce the retry feedback message when the model returns the wrong shape.
Built on top of
@mukundakatta/agentcast. Works
with Claude Desktop, Cursor, Cline, Windsurf, Zed, and any other MCP client.
extract_jsonPull a JSON value out of messy LLM output. Tries the whole text, then a
fenced ```json ``` block, then the largest balanced {...} / [...]
substring. Returns the parsed value plus which strategy succeeded.
{
"text": "Sure, here you go:\n```json\n{\"answer\": 42}\n```\nLet me know!"
}
→
{
"value": { "answer": 42 },
"found": true,
"source": "fenced_json"
}
source is one of whole, fenced_json, fenced_plain,
balanced_substring, or none.
validate_responseValidate a parsed JSON value against an agentcast shape spec. Spec maps field
name to type: string, number, boolean, array, object. Suffix with
? for optional.
{
"value": { "name": "ada" },
"shape": { "name": "string", "age": "number" }
}
→
{
"valid": false,
"error": "missing required field 'age'"
}
build_retry_promptGiven an attempt history, produce the validation-error feedback message agentcast appends to the conversation when the model returned the wrong shape. Codifies the "validation error as feedback" pattern for non-Node MCP clients that want to drive the same retry loop manually.
{
"attempts": [
{ "text": "{\"name\":\"ada\"}", "error": "missing required field 'age'" }
],
"expected_shape": { "name": "string", "age": "number" }
}
→
{
"feedback": "Your previous response did not match the required shape. Error: missing required field 'age'\n\nTry again. Respond with ONLY valid JSON that fixes the error above.\n\nExpected shape: {\"name\":\"string\",\"age\":\"number\"}"
}
Add to claude_desktop_config.json:
{
"mcpServers": {
"agentcast": {
"command": "npx",
"args": ["-y", "@mukundakatta/agentcast-mcp"]
}
}
}
Same shape, in the appropriate mcp.json for your client. Most clients
auto-discover via npx -y @mukundakatta/agentcast-mcp.
npm install -g @mukundakatta/agentcast-mcp
mcp-agentcast # listens on stdio
When an LLM is supposed to return structured data, it sometimes wraps the
JSON in prose, fences, or hallucinated fields. Standard JSON.parse throws.
Hand-rolled regex misses nested structure. This MCP server gives any model
driving an agent a real handle on (1) pulling JSON out of the response,
(2) checking it matches the expected shape, and (3) building the exact retry
prompt that nudges the model to fix it on the next turn.
MIT.
io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage
io.github.mikerawsonnz/llm-orchestration-agent
io.github.mikerawsonnz/authenticated-llm-agent
labforgedev/copilot-memory-mcp
csoai-org/agent-prompt-injection-firewall-mcp
io.github.mikerawsonnz/authenticated-multi-llm-agent