{"protocolVersion":"0.2.0","name":"Leed","description":"Keep your customers AI up-to-date, with no extra work.","url":"https://leed.ai","version":"a34ecc787604e129387e3ea569c4fa01aa615bc5","capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"defaultInputModes":["text/plain"],"defaultOutputModes":["application/json","text/plain"],"skills":[{"id":"search_site","name":"search_site","description":"Full-text and semantic search across this site's published blog posts and articles. Returns ranked results with title, path, url, and a snippet — cherry-pick the returned pageIds into get_pages_by_id (or the paths into get_pages_by_path) to read full post content. Call list_post_types first to see which post types (blog, news, etc.) are available to search. Does NOT search developer documentation or API references — those are served via the authenticated Docs MCP at /mcp.","tags":["read-only","content"],"outputSchema":{"type":"object","description":"Ranked search hits over published posts.","properties":{"mode":{"type":"string","description":"Search strategy actually used: freetext | vector | hybrid."},"results":{"type":"array","description":"Ranked hits, best first.","items":{"type":"object","description":"A search hit (no full content — use get_pages_by_id to read it).","properties":{"pageId":{"type":"string","description":"Internal page id — pass to get_pages_by_id."},"title":{"type":"string","description":"Post title."},"path":{"type":"string","description":"Site path the post lives under."},"url":{"type":"string","description":"Canonical absolute URL of the post."},"snippet":{"type":"string","description":"Short text excerpt around the match."},"score":{"type":"number","description":"Relevance score (hybrid/vector score or FTS rank)."}},"additionalProperties":false}}},"required":["mode","results"],"additionalProperties":false}},{"id":"get_site_overview","name":"get_site_overview","description":"Get a high-level overview of this site: its name, description, primary url, and the count of published posts available to search. Call list_post_types to enumerate those post types (blog, news, etc.) with their base paths and per-type published counts.","tags":["read-only","content"],"outputSchema":{"type":"object","description":"High-level site identity + content availability.","properties":{"name":{"type":"string","description":"Display name of the site."},"description":{"type":"string","description":"Short site description."},"url":{"type":"string","description":"Primary site origin."},"publishedPostTypes":{"type":"integer","description":"Number of published post page-types."},"publishedPostsCount":{"type":"integer","description":"Number of published posts available to search."},"protectedContent":{"type":"object","description":"Developer docs/API served via the authenticated Docs MCP (not this surface).","properties":{"kinds":{"type":"array","description":"The protected content kinds.","items":{"type":"string"}},"available":{"type":"boolean","description":"Whether any published docs/api content exists."},"accessVia":{"type":"string","description":"Where to reach it (`/mcp`)."},"discovery":{"type":"string","description":"OAuth protected-resource discovery path."}},"required":["kinds","available","accessVia","discovery"],"additionalProperties":false}},"required":["name","description","url","publishedPostTypes","publishedPostsCount","protectedContent"],"additionalProperties":false}},{"id":"list_post_types","name":"list_post_types","description":"List this site's published post types (blog, news, etc.): name, base path, and published post count — the content categories available to search and read.","tags":["read-only","content"],"outputSchema":{"type":"object","description":"The site's published post types.","properties":{"postTypes":{"type":"array","description":"Published post types.","items":{"type":"object","description":"A published post type — a content category available to search and read.","properties":{"pageTypeId":{"type":"string","description":"Stable page-type id of the post type."},"name":{"type":"string","description":"Display name of the post type (e.g. Blog, News)."},"basePath":{"type":"string","description":"Base site path the post type's content lives under."},"publishedCount":{"type":"integer","description":"Number of published posts of this type."}},"required":["pageTypeId","name","basePath","publishedCount"],"additionalProperties":false}}},"required":["postTypes"],"additionalProperties":false}},{"id":"get_pages_by_id","name":"get_pages_by_id","description":"Fetch full content for one or more published posts by their pageIds (cherry-pick the pageIds returned by search_site). Returns, per id, the post's title, path, url, and Leed Markdown content. A docs/api page yields a per-item protected_resource marker pointing at the authenticated Docs MCP at /mcp; a missing or unpublished page yields a per-item not_found marker.","tags":["read-only","content"],"outputSchema":{"type":"object","description":"One resource entry per requested id/path, in input order.","properties":{"resources":{"type":"array","description":"The resolved post resources.","items":{"type":"object","description":"A published post (content present) OR a per-item not_found / protected_resource marker.","properties":{"pageId":{"type":"string","description":"Internal page id of the post, when resolved."},"title":{"type":"string","description":"Post title, when resolved."},"path":{"type":"string","description":"Site path the post lives under."},"url":{"type":"string","description":"Canonical absolute URL of the post."},"content":{"type":"string","description":"The post's Leed Markdown source (present only on a hit)."},"publishedAt":{"type":"string","description":"ISO publish timestamp, when known."},"error":{"type":"string","description":"Per-item marker: `not_found` (missing/unpublished) or `protected_resource` (docs/api via /mcp)."},"accessVia":{"type":"string","description":"Protected-resource pointer (`/mcp`), present only on protected items."},"discovery":{"type":"string","description":"Protected-resource OAuth discovery path, present only on protected items."}},"additionalProperties":false}}},"required":["resources"],"additionalProperties":false}},{"id":"get_pages_by_path","name":"get_pages_by_path","description":"Fetch full content for one or more published posts by their site paths (from search_site or list_recent_posts). Returns, per path, the post's title, pageId, url, and Leed Markdown content. A docs/api path yields a per-item protected_resource marker pointing at the authenticated Docs MCP at /mcp; a missing, unpublished, or invalid path yields a per-item not_found marker.","tags":["read-only","content"],"outputSchema":{"type":"object","description":"One resource entry per requested id/path, in input order.","properties":{"resources":{"type":"array","description":"The resolved post resources.","items":{"type":"object","description":"A published post (content present) OR a per-item not_found / protected_resource marker.","properties":{"pageId":{"type":"string","description":"Internal page id of the post, when resolved."},"title":{"type":"string","description":"Post title, when resolved."},"path":{"type":"string","description":"Site path the post lives under."},"url":{"type":"string","description":"Canonical absolute URL of the post."},"content":{"type":"string","description":"The post's Leed Markdown source (present only on a hit)."},"publishedAt":{"type":"string","description":"ISO publish timestamp, when known."},"error":{"type":"string","description":"Per-item marker: `not_found` (missing/unpublished) or `protected_resource` (docs/api via /mcp)."},"accessVia":{"type":"string","description":"Protected-resource pointer (`/mcp`), present only on protected items."},"discovery":{"type":"string","description":"Protected-resource OAuth discovery path, present only on protected items."}},"additionalProperties":false}}},"required":["resources"],"additionalProperties":false}},{"id":"list_recent_posts","name":"list_recent_posts","description":"List the most recently published blog posts, newest first. Returns title, path, url, and published date for each — cherry-pick paths or pageIds into get_pages_by_path / get_pages_by_id to read full content.","tags":["read-only","content"],"outputSchema":{"type":"object","description":"Most recently published posts, newest first.","properties":{"posts":{"type":"array","description":"Recent post pointers.","items":{"type":"object","description":"A lightweight published-post pointer (no content).","properties":{"pageId":{"type":"string","description":"Internal page id of the post."},"title":{"type":"string","description":"Post title."},"path":{"type":"string","description":"Site path the post lives under."},"url":{"type":"string","description":"Canonical absolute URL of the post."},"publishedAt":{"type":"string","description":"ISO publish timestamp, when known."}},"additionalProperties":false}}},"required":["posts"],"additionalProperties":false}}]}