Skip to main content
Glama

Create App

app.create

Create a custom app: a named page holding existing views, forms, pages and dashboards, in order. It starts as a draft; app.publish (asks first) makes it live.

Input Schema

NameRequiredDescriptionDefault
iconNoA Bootstrap icon classbi-grid
nameYes
itemsYesWhat the app shows, in order
descriptionNo

Output Schema

NameRequiredDescriptionDefault
urlYesPath of the app, on the org's panel domain
nameYes
appIdYes
statusYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / items / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "kind": {
      -        "const": "view",
      -        "type": "string"
      -      },
      -      "viewId": {
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "viewId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "kind": {
      -        "const": "form",
      -        "type": "string"
      -      },
      -      "peekId": {
      -        "description": "The form's id (from sheet.schema peeks)",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "peekId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "kind": {
      -        "const": "page",
      -        "type": "string"
      -      },
      -      "pageId": {
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "pageId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "dashboardId": {
      -        "exclusiveMinimum": 0,
      -        "maximum": 9007199254740991,
      -        "type": "integer"
      -      },
      -      "kind": {
      -        "const": "dashboard",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "dashboardId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "kind": {
      +        "const": "view",
      +        "type": "string"
      +      },
      +      "viewId": {
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "viewId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "kind": {
      +        "const": "form",
      +        "type": "string"
      +      },
      +      "peekId": {
      +        "description": "The form's id (a sheet.schema peek of kind form; a record layout is refused)",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "peekId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "kind": {
      +        "const": "page",
      +        "type": "string"
      +      },
      +      "pageId": {
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "pageId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "dashboardId": {
      +        "exclusiveMinimum": 0,
      +        "maximum": 9007199254740991,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "const": "dashboard",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "dashboardId"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Added

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readonly, non-destructive, non-idempotent, closed-world. The description adds real value beyond them by disclosing the draft-state behavior (the app is not live on creation) and that publishing is a separate, confirmation-gated step ("asks first"). It does not cover permissions, naming uniqueness, or what happens on duplicate items, so the disclosure is useful but partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler. The identity of the resource comes first and the lifecycle note follows, so the most important framing is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value description is correctly omitted, and the annotations carry the safety profile. The draft/publish model is covered. What is missing is smaller but real: required-vs-optional framing for icon/description, uniqueness or naming conflicts, and any permission requirement for creating an app.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, and the description compensates well: "existing views, forms, pages and dashboards" enumerates the four item kinds the oneOf accepts, and "in order" conveys that array position is semantically meaningful. It also flags that the referenced items must already exist, which the schema only hints at. It leaves the 30-item cap and the 120-character name limit to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create a custom app") and then defines what an app actually is — a named page holding existing views, forms, pages and dashboards, in order. That definitional gloss is genuinely useful in a namespace full of similar container tools (folder.create, page.create, dashboard.create). It does not explicitly distinguish itself from those siblings, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence provides lifecycle guidance: the app is created as a draft and app.publish makes it live, which tells the agent what to do next and names the follow-up tool. However, it gives no when-not-to-use guidance and does not address the obvious confusion with folder.create / page.create / dashboard.create, so usage context is implied rather than fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources