Skip to main content
Glama

Add an app

create_app

Add an app. Pass its URL; scenarios, limits, notes and test logins are optional and can be changed later with update_app. Give scenarios as a list with expects — what must be seen, one sentence each — and every check answers each of them (seen, shows otherwise, not seen); the answer returns them as they were understood. test_email/test_password is the default test user — pass the password you already hold (the project's .env or seeds); test_accounts adds named ones ("admin", "free user"), and a scenario that names one ("As admin: refunds work") is checked signed in as it. Passwords are write-only: stored encrypted, never returned (list_apps says has_password). An app that runs inside another product's page (a Shopify embedded app) needs allowed_origins: the host page's origin and the app's own. For a password-protected store (Shopify's "Enter store password" page), pass store_password and every check enters it. A website gets a recurring check (daily by default) within the team's plan; each check spends the team's balance, so the first one runs automatically when the balance covers it and otherwise waits for a top-up (or, on a paid plan, the next monthly credit) (the result's hint says which, with buy_url and upgrade_url). isError with code plan_limit when the plan does not allow it.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "url": "<url>"
    },
    "name": "create_app"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlYesThe deployed app's address, e.g. https://your-app.com (or a Chrome Web Store link)
teamNoAct in another of your teams, by its name or id (whoami lists them). Omitted: the key's own team
notesNoContext for every check, e.g. 'Do not delete the test account.'
limitsNoWhat a check may never do, one rule per line, e.g. 'Do not touch /admin.'
frequencyNoHow often it is checked; default daily
scenariosNoWhat must keep working — each becomes a scenario of the app, watched from the first check. Best as a list that says what must be seen: [{ "title": "Pay with a card", "description": "Add the test product and pay with the test card.", "expects": ["The page reads «Order confirmed»."] }]. Or plain words, one scenario per line (or per sentence), e.g. 'Checkout: pay with the test card; the page reads «Order confirmed».'
test_emailNoSign-in email of a test user of the app (the "default" account)
test_accountsNoMore test users, each a different kind of user, e.g. [{label:'admin', …}, {label:'free user', …}]. A scenario that names one ('As admin: refunds work') is checked signed in as it
test_passwordNoThat test user's password, e.g. from the project's .env or seeds. Write-only: stored encrypted, never returned (list_apps says has_password)
store_passwordNoFor a password-protected store (Shopify's 'Enter store password' page): the store password. Stored encrypted and never returned
allowed_originsNoOther https origins the check may open and act on besides the app's own — for an app that runs inside another product's page, e.g. ['https://admin.shopify.com', 'https://your-app.example.com'] for a Shopify embedded app
test_totp_secretNoFor a login whose app asks for a code from an authenticator app: the secret shown under the QR code when 2FA was set up, or the otpauth:// address in it. The check types {{TEST_TOTP}} codes from it. Write-only (list_apps says has_authenticator); "" removes it

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / scenarios / anyOf
      Added value: +[
      +  {
      +    "maxLength": 2000,
      +    "type": "string"
      +  },
      +  {
      +    "items": {
      +      "properties": {
      +        "description": {
      +          "description": "What a user does, in order",
      +          "maxLength": 1000,
      +          "type": "string"
      +        },
      +        "expects": {
      +          "description": "What must be SEEN for this to count as working, one sentence each, in words the product itself shows — e.g. [\"The heading reads «Account settings».\", \"The page has no «Delete workspace» section.\"]. Start each with a capital letter. The check answers every one with a step: seen, shows otherwise, or not seen",
      +          "items": {
      +            "maxLength": 200,
      +            "minLength": 8,
      +            "type": "string"
      +          },
      +          "maxItems": 12,
      +          "minItems": 1,
      +          "type": "array"
      +        },
      +        "title": {
      +          "description": "What the scenario is, as a person would name it",
      +          "maxLength": 120,
      +          "minLength": 3,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "title"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 10,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / scenarios / description
      Previous value: -"What must keep working, in plain words, one per line (or one per sentence) — each becomes a scenario of the app, watched from the first check, e.g. 'Checkout must never break.'"New value: +"What must keep working — each becomes a scenario of the app, watched from the first check. Best as a list that says what must be seen: [{ \"title\": \"Pay with a card\", \"description\": \"Add the test product and pay with the test card.\", \"expects\": [\"The page reads «Order confirmed».\"] }]. Or plain words, one scenario per line (or per sentence), e.g. 'Checkout: pay with the test card; the page reads «Order confirmed».'"
    • removedInput schema / properties / scenarios / maxLength
      Removed value: -2000
    • removedInput schema / properties / scenarios / type
      Removed value: -"string"
  2. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, openWorldHint=true and destructiveHint=false; the description adds substantial behavior the annotations cannot carry: passwords are write-only and encrypted and never returned, the first check spends the team's balance and may wait for a top-up or the next monthly credit, the result's hint carries buy_url and upgrade_url, and plan refusals surface as isError with code plan_limit. That is exactly the safety, cost and failure-mode context an agent needs before triggering a metered open-world action.

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

Conciseness3/5

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

The lead ("Add an app. Pass its URL") is well front-loaded, but the body is a dense run-on with stacked parentheticals and a nested billing aside that takes several readings to parse. Nearly every clause carries real information, so it is not padding, but the lack of sentence or list structure costs it clarity for a 12-parameter tool.

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?

For a 12-parameter mutating tool with no output schema, it covers the hard parts: credential handling, embedded-app origins, store passwords, cost and payment gating, and the plan_limit error path. What is left thin is the success contract — it never says what create_app returns (app identifier, initial check status) beyond an oblique "the answer returns them as they were understood", leaving the agent to guess how to follow up with get_check_status or start_check.

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 already 100%, so the baseline is 3, but the description adds cross-parameter meaning: test_email/test_password form the 'default' account while test_accounts supplies named ones, and a scenario title that names a label ("As admin: refunds work") is executed signed in as that account. It also explains that each expect is answered as seen / shows otherwise / not seen and echoed back as understood, which clarifies the shape of the scenarios argument. Much of the per-field wording duplicates the schema, so it stops short of a 5.

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

Purpose5/5

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

The description opens with a specific verb and resource ("Add an app") and immediately states the required input ("Pass its URL"), then separates it from update_app ("can be changed later with update_app") and add_scenario (scenarios are attached to the app being created). An agent can tell this apart from the sibling app/scenario management tools without opening any schema.

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

Usage Guidelines4/5

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

It gives concrete when-to-use conditions for the conditional fields: allowed_origins for an app running inside another product's page, store_password for Shopify's password page, test_accounts for distinct kinds of user. It also names update_app as the later-mutation path, so optional fields need not be agonized over now. It does not state any exclusion or when-not-to-use case (e.g. for an already-registered URL), which keeps it short of a 5.

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.