Skip to main content
Glama

run_flow_autotest

Read-only

Runs deterministic behavioural tests against flows that are ALREADY applied (compiles them to an AST and simulates a user). Call after apply_actions to verify a build; read summary and the failed checks, patch with apply_actions, re-run. Mutates nothing. The smoke layer runs on its own with no input: it walks every entry, taps every button, answers every input step, and reports crashes, dead buttons, unresolved placeholders, and values the bot failed to store. Pass scenarios to also replay specific user journeys (at most 6) — that is the only way to assert exact texts or exact stored values. Returns { passed, smoke, scenarios, summary }. passed is false when any scenario fails or is unverified. Harness gaps are reported separately and never mean the bot is broken. A summary saying coverage is "none" means nothing was testable. Nothing is sent to real users and no state is written.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
flowIdsYesRequired. Ids of the ALREADY-APPLIED flows to test — normally the flows apply_actions just created or changed, taken from its idRemap. Flows they link into are compiled too but are not crawled as entries.
scenariosNoOptional user journeys to replay on top of the smoke crawl. Omit to run the smoke layer alone.
applicationIdNoApplication (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUIRED. Call list_applications to get the id.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / scenarios / items / properties / assume / properties / actors / description
      Previous value: -"actors: who the people of this scenario are when it starts, as a list of { id, workspaceOwner?, tags? }. id is the as_contact id of the person, or \"$SELF\" for the default one. workspaceOwner: true makes that person an owner of the workspace, so {{sysvar|isWorkspaceOwner}} is true for them and false for everyone else; tags are the tag NAMES they carry, as {{sysvar|tags}} lists them. Without it nobody is the owner and nobody has a tag, so an owner-only or tag-only step can only refuse. A tag or an owner is never set with seed_var."New value: +"actors: who the people of this scenario are when it starts, as a list of { id, platformId?, workspaceOwner?, tags? }. id is the as_contact id of the person, or \"$SELF\" for the default one. platformId is an exact numeric Telegram user id for bots that compare a literal id; omit it to derive a stable test id. workspaceOwner: true makes that person an owner of the workspace, so {{sysvar|isWorkspaceOwner}} is true for them and false for everyone else; tags are the tag NAMES they carry, as {{sysvar|tags}} lists them. A tag or an owner is never set with seed_var."
    • addedInput schema / properties / scenarios / items / properties / assume / properties / actors / items / properties / platformId
      Added value: +{
      +  "description": "Exact numeric Telegram user id, for example the id a legacy admin gate compares against.",
      +  "pattern": "^[1-9]\\d{0,15}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / scenarios / items / properties / assume / properties / actors / items / properties / telegramMembership
      Added value: +{
      +  "description": "What getChatMember reports for this actor; overrides the scenario-wide membership.",
      +  "enum": [
      +    "member",
      +    "not_member"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / scenarios / items / properties / assume / properties / httpResponses
      Added value: +{
      +  "description": "Mock outside HTTP calls for this scenario. These are local responses; no request is sent to the service.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "body": {
      +        "description": "JSON body returned to the bot code."
      +      },
      +      "method": {
      +        "description": "Optional uppercase HTTP method to match.",
      +        "type": "string"
      +      },
      +      "networkError": {
      +        "description": "Reject the request with this transport error instead of returning an HTTP response.",
      +        "type": "string"
      +      },
      +      "requestBodyContains": {
      +        "description": "Optional literal substring required in the outgoing request body.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "status": {
      +        "maximum": 599,
      +        "minimum": 100,
      +        "type": "integer"
      +      },
      +      "times": {
      +        "description": "Answer at most this many matching calls, then use the next fixture.",
      +        "exclusiveMinimum": 0,
      +        "type": "integer"
      +      },
      +      "urlPattern": {
      +        "description": "Substring of the outgoing URL to match.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "urlPattern"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 12,
      +  "type": "array"
      +}
    • changedInput schema / properties / scenarios / items / properties / steps / description
      Previous value: -"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. When accepted checks are supplied, use {\"do\":\"expect_check\",\"checkId\":\"<accepted id>\"} for their outcomes; the server selects the observation channel. Optional contains:[\"literal journey value\"] strengthens message/notification checks only. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for a gate that compares the user id with a stored owner-id variable; a workspace-owner or tag gate is opened with assume.actors, never with seed_var), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it; after the switch that person sees what the bot sent them earlier and can tap its buttons, and cannot tap a button on another person's screen), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\"}. A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed steps are dropped rather than failing the run."New value: +"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. When accepted checks are supplied, use {\"do\":\"expect_check\",\"checkId\":\"<accepted id>\"} for their outcomes; the server selects the observation channel. Optional contains:[\"literal journey value\"] strengthens message/notification checks only. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for a gate that compares the user id with a stored owner-id variable; a workspace-owner or tag gate is opened with assume.actors, never with seed_var), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it; after the switch that person sees what the bot sent them earlier and can tap its buttons, and cannot tap a button on another person's screen), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\",\"mediaType\":\"IMAGE\"} (mediaType is optional; assert proof photos/files on the same peer message), {\"do\":\"expect_http_request\",\"urlContains\":\"/orders\",\"method\":\"POST\",\"bodyContains\":\"orderId\",\"count\":1} (assert the outgoing request; method, bodyContains and count are optional). A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed or truncated steps make the scenario an invalid test, never a pass."
  2. Changed2 schema fields changed
    • addedInput schema / properties / scenarios / items / properties / assume / properties / actors
      Added value: +{
      +  "description": "actors: who the people of this scenario are when it starts, as a list of { id, workspaceOwner?, tags? }. id is the as_contact id of the person, or \"$SELF\" for the default one. workspaceOwner: true makes that person an owner of the workspace, so {{sysvar|isWorkspaceOwner}} is true for them and false for everyone else; tags are the tag NAMES they carry, as {{sysvar|tags}} lists them. Without it nobody is the owner and nobody has a tag, so an owner-only or tag-only step can only refuse. A tag or an owner is never set with seed_var.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "description": "The as_contact id of the person, or \"$SELF\" for the default one.",
      +        "type": "string"
      +      },
      +      "tags": {
      +        "description": "Tag NAMES this person carries when the scenario starts.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "workspaceOwner": {
      +        "description": "true: this person is an owner of the workspace ({{sysvar|isWorkspaceOwner}} is true for them only).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / scenarios / items / properties / steps / description
      Previous value: -"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. When accepted checks are supplied, use {\"do\":\"expect_check\",\"checkId\":\"<accepted id>\"} for their outcomes; the server selects the observation channel. Optional contains:[\"literal journey value\"] strengthens message/notification checks only. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for owner/admin gates), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it; after the switch that person sees what the bot sent them earlier and can tap its buttons, and cannot tap a button on another person's screen), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\"}. A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed steps are dropped rather than failing the run."New value: +"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. When accepted checks are supplied, use {\"do\":\"expect_check\",\"checkId\":\"<accepted id>\"} for their outcomes; the server selects the observation channel. Optional contains:[\"literal journey value\"] strengthens message/notification checks only. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for a gate that compares the user id with a stored owner-id variable; a workspace-owner or tag gate is opened with assume.actors, never with seed_var), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it; after the switch that person sees what the bot sent them earlier and can tap its buttons, and cannot tap a button on another person's screen), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\"}. A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed steps are dropped rather than failing the run."
  3. Changed1 schema field changed
    • changedInput schema / properties / scenarios / items / properties / steps / description
      Previous value: -"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for owner/admin gates), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it; after the switch that person sees what the bot sent them earlier and can tap its buttons, and cannot tap a button on another person's screen), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\"}. A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed steps are dropped rather than failing the run."New value: +"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. When accepted checks are supplied, use {\"do\":\"expect_check\",\"checkId\":\"<accepted id>\"} for their outcomes; the server selects the observation channel. Optional contains:[\"literal journey value\"] strengthens message/notification checks only. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for owner/admin gates), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it; after the switch that person sees what the bot sent them earlier and can tap its buttons, and cannot tap a button on another person's screen), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\"}. A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed steps are dropped rather than failing the run."
  4. Changed1 schema field changed
    • changedInput schema / properties / scenarios / items / properties / steps / description
      Previous value: -"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for owner/admin gates), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\"}. A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed steps are dropped rather than failing the run."New value: +"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for owner/admin gates), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it; after the switch that person sees what the bot sent them earlier and can tap its buttons, and cannot tap a button on another person's screen), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\"}. A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed steps are dropped rather than failing the run."
  5. Changed1 schema field changed
    • changedInput schema / properties / scenarios / items / properties / assume / properties / aiOutput / description
      Previous value: -"The exact text EVERY AI step answers in this scenario. No AI runs in the simulator: unset, AI steps answer \"[AI output]\", so a condition comparing the AI-written variable takes its NO branch and a failure behind it is reported as inconclusive. Pin the value the branch under test compares against (e.g. \"hot\")."New value: +"The exact text EVERY AI step answers in this scenario. No AI runs in the simulator: unset, AI steps answer \"[AI output]\", so a condition comparing the AI-written variable takes its NO branch and a failure behind it is reported as inconclusive. Pin the value the branch under test compares against (e.g. \"hot\"). It does NOT steer an AI assistant block (AI_TOOL_ROUTER): its intent and tool branches cannot be reached in a test, pinned or not."
  6. Changed1 schema field changed
    • changedInput schema / properties / scenarios / items / properties / steps / description
      Previous value: -"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for owner/admin gates). At most 15 steps; malformed steps are dropped rather than failing the run."New value: +"Ordered steps, alternating an ACTION with an ASSERTION about the reply to the action right before it. Each step is one object keyed by `do`: {\"do\":\"start\",\"command\":\"/start\"}, {\"do\":\"send\",\"text\":\"...\"}, {\"do\":\"send_media\",\"kind\":\"photo\"|\"video\"|\"audio\"|\"document\",\"caption\":\"...\"}, {\"do\":\"tap\",\"button\":\"<substring of the label>\"}, {\"do\":\"pay\"}, {\"do\":\"abandon_payment\",\"text\":\"...\"}, {\"do\":\"resume_delays\"}, {\"do\":\"simulate_event\",\"event\":\"member_join\"}, {\"do\":\"expect\",\"anyOf\":[\"verbatim fragment the bot really sends\"],\"not\":[\"text that must NOT appear\"]}, {\"do\":\"expect_var\",\"name\":\"<variable handle>\",\"contains\":\"...\",\"changed\":true}, {\"do\":\"seed_var\",\"name\":\"...\",\"value\":\"...\"} (seed_var value \"$SELF\" becomes the simulated user id, for owner/admin gates), {\"do\":\"as_contact\",\"id\":\"user_b\"} (every later step acts as a SECOND person — for anything two people do together: one builds or sends, the other sees it), {\"do\":\"expect_peer_message\",\"to\":\"user_b\",\"contains\":\"...\"}. A scenario with no expect / expect_var / expect_peer_message step asserts nothing. At most 15 steps; malformed steps are dropped rather than failing the run."
  7. Changed1 schema field changed
    • addedInput schema / properties / scenarios / items / properties / assume
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Simulator assumptions this journey runs under.",
      +  "properties": {
      +    "aiOutput": {
      +      "description": "The exact text EVERY AI step answers in this scenario. No AI runs in the simulator: unset, AI steps answer \"[AI output]\", so a condition comparing the AI-written variable takes its NO branch and a failure behind it is reported as inconclusive. Pin the value the branch under test compares against (e.g. \"hot\").",
      +      "type": "string"
      +    },
      +    "telegramMembership": {
      +      "description": "What a Telegram membership gate reports. Default \"member\".",
      +      "enum": [
      +        "member",
      +        "not_member"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  8. Added

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.