---
title: "Search Templates"
description: "Search the public Charming Template directory by keyword."
sidebar:
  order: 19
---

<!-- Generated by apps/docs/scripts/generate-mcp-reference.mjs. -->

MCP name: `search_templates`

## Tool contract

```json
{
  "annotations": {
    "destructiveHint": false,
    "openWorldHint": false,
    "readOnlyHint": true,
    "title": "Search Templates"
  },
  "description": "Search the public Charming Template directory by keyword. Use this to check for an existing Template before calling create_app, or when the user asks what Templates exist. Returns the resolved listing title, summary, Markdown detail, category, cover, starter prompt, creator, builder count, canonical Template page, and browser copy URL. The copy URL starts browser navigation where the user chooses to copy and signs in before owned creation; it is not an MCP or REST write. After browser creation, find the copy with list_apps or GET /app and read it with get_app_source or GET /app/:id/source.",
  "execution": {
    "taskSupport": "forbidden"
  },
  "inputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "properties": {
      "limit": {
        "description": "Max templates to return (1-100).",
        "maximum": 100,
        "minimum": 1,
        "type": "integer"
      },
      "query": {
        "description": "Case-insensitive match against listing title, summary, detail, category, and starter prompt.",
        "type": "string"
      },
      "sort": {
        "description": "`builders` ranks by builders reached; `recent` (default) is newest-listed first.",
        "enum": [
          "builders",
          "recent"
        ],
        "type": "string"
      }
    },
    "type": "object"
  },
  "name": "search_templates",
  "outputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "properties": {
      "advisories": {
        "description": "Structured non-fatal advisories, including authoring issues and unread staff feedback responses. Each advisory.summary is also appended to the text content for the LLM path.",
        "items": {
          "additionalProperties": false,
          "properties": {
            "data": {
              "additionalProperties": {},
              "description": "Kind-specific structured payload. Shape varies per advisory kind.",
              "propertyNames": {
                "type": "string"
              },
              "type": "object"
            },
            "doc_url": {
              "description": "Optional docs pointer for this advisory kind.",
              "type": "string"
            },
            "kind": {
              "description": "Stable advisory identifier (e.g. \"legacy-bridge\").",
              "type": "string"
            },
            "severity": {
              "description": "Severity; omitted advisories are treated as 'info'.",
              "enum": [
                "info",
                "warn"
              ],
              "type": "string"
            },
            "summary": {
              "description": "Agent-facing summary. Self-sufficient; no extra context required.",
              "type": "string"
            },
            "userSummary": {
              "description": "End-user-facing summary. Set when the advisory should render in-app.",
              "type": "string"
            }
          },
          "required": [
            "kind",
            "summary"
          ],
          "type": "object"
        },
        "type": "array"
      },
      "ok": {
        "const": true,
        "description": "Indicates success. Errors arrive as content with isError:true.",
        "type": "boolean"
      },
      "templates": {
        "description": "Listed templates matching the query, most relevant first per `sort`.",
        "items": {
          "additionalProperties": false,
          "properties": {
            "builders": {
              "description": "Distinct accounts that own a copy of this template.",
              "maximum": 9007199254740991,
              "minimum": -9007199254740991,
              "type": "integer"
            },
            "category": {
              "description": "The Template's category, when set.",
              "type": [
                "string",
                "null"
              ]
            },
            "contentMarkdown": {
              "description": "The creator's longer Template detail in safe-subset Markdown.",
              "type": [
                "string",
                "null"
              ]
            },
            "copyUrl": {
              "description": "The app's own live URL. It starts browser navigation where a non-owner can choose to copy and must sign in before Charming creates the owned App. It is not an MCP or REST write. After creation, use list_apps or GET /app to find the copy, then get_app_source or GET /app/<id>/source to read it. Free of write-capable `?t=` tokens.",
              "type": "string"
            },
            "cover": {
              "anyOf": [
                {
                  "additionalProperties": false,
                  "properties": {
                    "alt": {
                      "type": "string"
                    },
                    "caption": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "url": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "url",
                    "alt",
                    "caption"
                  ],
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The Template's structured cover image, when set."
            },
            "creatorHandle": {
              "description": "The template's creator handle.",
              "type": "string"
            },
            "description": {
              "description": "The creator's search-friendly summary.",
              "type": [
                "string",
                "null"
              ]
            },
            "displayName": {
              "description": "Human-readable name.",
              "type": "string"
            },
            "starterPrompt": {
              "description": "The prompt a fresh copy starts with, if the creator set one.",
              "type": [
                "string",
                "null"
              ]
            },
            "templatePageUrl": {
              "description": "The indexable `/templates/<handle>/<app-name>` page for this template.",
              "type": "string"
            }
          },
          "required": [
            "displayName",
            "description",
            "contentMarkdown",
            "category",
            "cover",
            "starterPrompt",
            "copyUrl",
            "templatePageUrl",
            "builders",
            "creatorHandle"
          ],
          "type": "object"
        },
        "type": "array"
      }
    },
    "required": [
      "ok",
      "templates"
    ],
    "type": "object"
  }
}
```

Found a bug or need a feature? [Tell us](/docs/capabilities/feedback) with `submit_feedback` or `POST /app/{id}/feedback`. Your feedback shapes what we build next.
