{"$id":"https://porch.tools/schema/manifest.v1.json","$schema":"https://json-schema.org/draft/2020-12/schema","title":"Porch site manifest, version 1","description":"Declares named, read-only MCP tools for a website. Served by the site at /.well-known/mcp.json.","type":"object","required":["version"],"additionalProperties":false,"properties":{"$schema":{"type":"string"},"version":{"const":1,"description":"Manifest format version. Only 1 is supported."},"name":{"type":"string","minLength":1,"maxLength":200,"description":"Human-readable name of the site."},"description":{"type":"string","maxLength":2000,"description":"One or two sentences describing the site; used as the MCP server instructions."},"includeGenericTools":{"type":"boolean","default":true,"description":"Also expose fetch_page and list_pages. Defaults to true."},"renderPaths":{"type":"array","maxItems":50,"description":"Path prefixes that need headless rendering (verified sites only).","items":{"type":"string","pattern":"^/(?!/)","maxLength":500}},"tools":{"type":"array","maxItems":50,"items":{"$ref":"#/$defs/tool"}}},"$defs":{"tool":{"type":"object","required":["name","description","source"],"additionalProperties":false,"properties":{"name":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_-]{0,63}$","description":"Tool name, as in MCP's tool schema."},"title":{"type":"string","maxLength":200},"description":{"type":"string","minLength":1,"maxLength":2000},"inputSchema":{"type":"object","description":"JSON Schema for the tool's arguments, as in MCP's tool schema. Must describe an object.","properties":{"type":{"const":"object"}}},"source":{"type":"string","pattern":"^/(?!/)","maxLength":500,"description":"Same-site path to read. {placeholders} are filled from the tool's arguments."},"filter":{"$ref":"#/$defs/filter"},"render":{"type":"boolean","description":"Render the source with a headless browser (verified sites only)."}}},"filter":{"type":"object","description":"Keep only the items of a JSON array that match. No code is ever executed.","required":["field"],"additionalProperties":false,"properties":{"from":{"type":"string","maxLength":200,"description":"Dot path to the array inside the JSON document; omit if the document is the array."},"field":{"type":"string","minLength":1,"maxLength":200,"description":"Dot path of the field to compare on each item."},"equals":{"type":["string","number","boolean"],"description":"Keep items whose field equals this (case-insensitive for strings). May contain {placeholders}."},"contains":{"type":"string","description":"Keep items whose field contains this text (case-insensitive). May contain {placeholders}."}},"oneOf":[{"required":["equals"]},{"required":["contains"]}]}}}