{
  "name": "clouatre-ca",
  "version": "1.0.0",
  "description": "Browser-accessible WebMCP tools exposed via document.modelContext on clouatre.ca",
  "tools": [
    {
      "name": "search_posts",
      "description": "Search blog posts by topic or keyword. Returns matches with title, slug, description, pubDate.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Search query to find blog posts"
          },
          "after": {
            "type": "string",
            "description": "Only return posts published after this ISO 8601 date"
          },
          "limit": {
            "type": "integer",
            "description": "Max results (default 10)"
          },
          "offset": {
            "type": "integer",
            "description": "Results to skip (default 0)"
          }
        },
        "required": ["query"]
      }
    },
    {
      "name": "get_post_markdown",
      "description": "Fetch a post's Markdown source by slug. Paginated at ~2,000 tokens per page (page is 0-based; response includes totalPages). Use section for a single H2 section, capped by maxTokens.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "Post slug (URL path segment, e.g. 'my-post-title')"
          },
          "page": {
            "type": "integer",
            "description": "Zero-based page index (default 0)"
          },
          "section": {
            "type": "string",
            "description": "H2 anchor slug (GitHub-style) to fetch one section"
          },
          "maxTokens": {
            "type": "integer",
            "description": "Approximate token cap for the section (ceiling 8000)"
          }
        },
        "required": ["slug"]
      }
    },
    {
      "name": "get_related_posts",
      "description": "Return posts related to a slug, with edge type and evidence, from the static knowledge graph.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "The post slug to find related posts for"
          },
          "limit": {
            "type": "integer",
            "description": "Max related posts (default 5)"
          },
          "offset": {
            "type": "integer",
            "description": "Related posts to skip (default 0)"
          }
        },
        "required": ["slug"]
      }
    },
    {
      "name": "get_posts_by_concept",
      "description": "Return posts in named concept clusters. Accepts a cluster id/name (partial match) or a post slug (returns every cluster containing that post).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "concept": {
            "type": "string",
            "description": "Cluster id/name (partial match) or post slug"
          },
          "limit": {
            "type": "integer",
            "description": "Max clusters (default 10)"
          },
          "offset": {
            "type": "integer",
            "description": "Clusters to skip (default 0)"
          }
        },
        "required": ["concept"]
      }
    }
  ]
}
