{"id":2570225,"recorded_at":"2026-11-03T11:16:58.231145Z","observed_at":"2026-11-03T11:16:58.231093Z","subject_kind":"endpoint","subject":"5a02c420-0b6f-4cee-b274-a8d6a1a837ef","kind":"mcp.tools","method":"probe.mcp/1","body":{"count":17,"tools":[{"description":"Add a conditional response to a route: when the request matches the conditions (query, header, path param, body field), the mock answers with this status, body and latency. Rules are evaluated in order, the first match wins; x-loutre-* headers keep priority.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"body":{"description":"JSON body of the response"},"latencyMs":{"maximum":30000,"minimum":0,"type":"number"},"name":{"description":"Human-readable label of the rule","maxLength":60,"type":"string"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"route":{"description":"Route identifier, lowercase method: \"get:/users/{id}\"","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"},"status":{"maximum":599,"minimum":100,"type":"integer"},"when":{"additionalProperties":false,"description":"Every condition must hold","properties":{"body":{"additionalProperties":{},"description":"Expected JSON body fields, by dotted path (customer.email)","propertyNames":{"type":"string"},"type":"object"},"header":{"additionalProperties":{"type":"string"},"description":"Expected headers","propertyNames":{"type":"string"},"type":"object"},"param":{"additionalProperties":{"type":"string"},"description":"Expected path parameters ({id})","propertyNames":{"type":"string"},"type":"object"},"query":{"additionalProperties":{"type":"string"},"description":"Expected query parameters","propertyNames":{"type":"string"},"type":"object"}},"type":"object"}},"required":["slug","route","when"],"type":"object"},"name":"add_rule"},{"description":"Call a route of the mock like an HTTP client would and return the status, the x-loutre-* headers and the body. The headers x-loutre-status, x-loutre-delay, x-loutre-count, x-loutre-message and x-loutre-seed are honoured; latency is not awaited, it is reported in delayMs. Writes (POST, PUT, PATCH, DELETE) are persisted when persistent state is on. For a GraphQL mock, POST to its GraphQL path with the body { \"query\": \"…\", \"variables\": { … } }; mutations are persisted the same way.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"accessKey":{"description":"Access key (lk_…) of a private mock you do not own","type":"string"},"body":{"description":"JSON body for POST, PUT, PATCH"},"headers":{"additionalProperties":{"type":"string"},"description":"Request headers, including x-loutre-*","propertyNames":{"type":"string"},"type":"object"},"method":{"default":"GET","enum":["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS","QUERY"],"type":"string"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"path":{"description":"Path with its query string: \"/users/42?expand=orders\"","minLength":1,"type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug","method","path"],"type":"object"},"name":"call_mock"},{"description":"Empty the mock's request log.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"clear_requests"},{"description":"Remove every conditional rule of a route.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"route":{"description":"Route identifier, lowercase method: \"get:/users/{id}\"","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug","route"],"type":"object"},"name":"clear_rules"},{"description":"Create a hosted mock from an OpenAPI 3.0/3.1 or Swagger 2.0 document (YAML or JSON), from TypeScript types (interfaces, types, enums: CRUD routes derived, or a route map type keyed like \"GET /users\") or from a Postman v2 collection, an Insomnia export (v4 JSON or v5 YAML), a Bruno collection (JSON export, or .bru files one after the other), a HAR file (headers and cookies are dropped, data is generated), a json-server db.json (records served as they are), curl commands, or a GraphQL schema (SDL or introspection JSON; Pro plan: queries, mutations and introspection answered on POST /graphql). OpenAPI 3.2 is read too. Give the document in `spec`, or its public address in `url` (then the mock re-reads it every six hours and follows changes). Returns the URL, the route list and an ownerToken to keep for later changes. Data is realistic and coherent, generated once. Without an account the mock lives seven days.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"auto":{"description":"With url: re-read every six hours (default true)","type":"boolean"},"locale":{"description":"Language of names, addresses, texts and error messages (default: the request's language, else English)","enum":["en","fr"],"type":"string"},"seed":{"description":"Data seed, for reproducible data sets","maxLength":64,"type":"string"},"slug":{"description":"Desired subdomain (Pro plan)","maxLength":63,"type":"string"},"spec":{"description":"The full document, verbatim: OpenAPI, Swagger, TypeScript types, a Postman, Insomnia or Bruno collection, a HAR file, a db.json or curl commands","minLength":1,"type":"string"},"url":{"description":"Public URL of the document, instead of spec","format":"uri","type":"string"}},"type":"object"},"name":"create_mock"},{"description":"Permanently delete a mock and its kept schema.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"delete_mock"},{"description":"Details of a mock: routes with identifiers, behaviour, lock, sample generated bodies per route.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"get_mock"},{"description":"The latest requests received by the mock, most recent first: method, path, query, status, headers and body as received (body cut at 8 KB), where the answer came from, latency. Each entry has an id for replay_request.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"limit":{"maximum":50,"minimum":1,"type":"integer"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"get_requests"},{"description":"List the connected account's mocks (API token required), with their URL, routes and expiry.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{},"type":"object"},"name":"list_mocks"},{"description":"Generate a new data set (new seed), for the whole mock or for one route and the routes sharing its collection. A full new set forgets persisted writes.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"locale":{"description":"Switch the data language (whole mock only)","enum":["en","fr"],"type":"string"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"routeId":{"description":"Route identifier, lowercase method: \"get:/users/{id}\"","type":"string"},"seed":{"maxLength":64,"type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"regenerate_mock"},{"description":"Replay a request from the log exactly as it was received (same method, path, headers and body) against the mock as it is now, and return the answer. Useful after changing a rule, a body or a scenario.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"id":{"description":"Entry id from get_requests","minLength":1,"type":"string"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug","id"],"type":"object"},"name":"replay_request"},{"description":"Forget persisted writes (POST, PUT, PATCH, DELETE): the generated collections come back as they were.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"reset_state"},{"description":"Lock a mock with a token (private) and/or restrict the allowed browser origins. Pro plan.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"origins":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"description":"Allowed origins (https://app.example.com); null to allow all"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"private":{"type":"boolean"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"set_access"},{"description":"Change a mock's behaviour: default status, latency, jitter, error rate, persistent writes, and per route status, latency, hand-written bodies, rules. Merge semantics: missing keys are kept, null clears.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"patch":{"additionalProperties":false,"description":"Same fields as PATCH /mocks/:slug/behavior: a missing key is kept, null clears","properties":{"activeScenario":{"description":"Scenario applied to every request without an x-loutre-scenario header; null deactivates","type":["string","null"]},"errorRate":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}],"description":"Share of requests that return an error"},"graphqlPath":{"description":"GraphQL mocks only: the path the endpoint answers on, /graphql by default (e.g. /api/graphql); null restores /graphql","type":["string","null"]},"jitter":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}],"description":"Random latency variation (0.3 = ± 30 %)"},"latencyMs":{"anyOf":[{"maximum":30000,"minimum":0,"type":"number"},{"type":"null"}]},"proxy":{"description":"Base URL of a real backend: routes the schema does not describe are forwarded there; null removes","type":["string","null"]},"routes":{"anyOf":[{"additionalProperties":{"anyOf":[{"additionalProperties":false,"properties":{"bodies":{"anyOf":[{"additionalProperties":{},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}],"description":"Status → hand-written JSON body; null removes"},"errorRate":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}]},"latencyMs":{"anyOf":[{"maximum":30000,"minimum":0,"type":"number"},{"type":"null"}]},"rules":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"description":"Conditional rules (see add_rule); the list replaces the existing one"},"status":{"anyOf":[{"maximum":599,"minimum":100,"type":"integer"},{"type":"null"}]}},"type":"object"},{"type":"null"}]},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}],"description":"Settings per route identifier"},"scenarios":{"anyOf":[{"additionalProperties":{"anyOf":[{},{"type":"null"}]},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}],"description":"Named bundles of settings (same fields as this patch minus scenarios and proxy), applied per request with the x-loutre-scenario header or with activeScenario; null removes"},"stateful":{"description":"Persistent writes (true by default)","type":["boolean","null"]},"status":{"anyOf":[{"maximum":599,"minimum":100,"type":"integer"},{"type":"null"}],"description":"Forced status for the whole mock; null to remove"}},"type":"object"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug","patch"],"type":"object"},"name":"set_behavior"},{"description":"Serve the mock under the account's own hostname (Pro): declares it at Cloudflare and returns the CNAME to create (hostname → target) plus the current status; call again without hostname to re-check, or with hostname null to remove it.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"hostname":{"anyOf":[{"maxLength":253,"type":"string"},{"type":"null"}],"description":"e.g. mock.acme.com; null removes; omitted re-checks the status"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"set_domain"},{"description":"Set the JSON body a route returns for a given status (hand-written response); a null body restores the generated response.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"body":{"description":"JSON body, or null to go back to the generated response"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"route":{"description":"Route identifier, lowercase method: \"get:/users/{id}\"","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"},"status":{"maximum":599,"minimum":100,"type":"integer"}},"required":["slug","route","status","body"],"type":"object"},"name":"set_response"},{"description":"Re-read the schema at the mock's source URL now and update the mock if it changed (routes, fields; settings kept, persisted writes forgotten). force regenerates even when the document is unchanged.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"properties":{"force":{"type":"boolean"},"ownerToken":{"description":"Owner token received at creation (not needed when the account is connected with an API token)","type":"string"},"slug":{"description":"Subdomain of the mock, e.g. \"brisk-otter\"","pattern":"^[a-z0-9-]{1,63}$","type":"string"}},"required":["slug"],"type":"object"},"name":"sync_mock"}]},"body_sha256":"8ea67c2dae6a131521a392e674551a3e07c39df352bc35e9fab4ee1a9dbd74ac","prev_id":null,"leaf":"0x66db5c6c25767f9a76f8a7cb7836f0cdb3dd383a13743e66ec99a20dfd3d02ad","leaf_text":"{\"body\":\"8ea67c2dae6a131521a392e674551a3e07c39df352bc35e9fab4ee1a9dbd74ac\",\"id\":2570225,\"kind\":\"mcp.tools\",\"method\":\"probe.mcp/1\",\"observed_us\":1793704618231093,\"prev\":null,\"subject\":\"5a02c420-0b6f-4cee-b274-a8d6a1a837ef\",\"subject_kind\":\"endpoint\"}","day":{"day":"2026-11-03","leaves":425475,"root":"0xb646ffa569e24bf8336b0a15a9d98d0a2f1239f58e10c2b18a9d22e43343566a","chained":"0x35e926359fd19031c6b5e08fb3b44f2524386a57c8fdd353336c185603f53d43","anchor_chain":"eip155:5042002","anchor_tx":"0xa5f9dadba13cde129126b950e64b815e6833cb8ff53b75026c9dbe769c3768c7","anchor_block":70601990},"proof":["0x66db43128feb5b3d64dfbcae9e8479c9e3cbf5cbcc801ee45f1794c47831d77d","0xdfc4dd5e7953fc41f038e1c62515a617806bc3e85e415003f377a8627b6d8f5e","0x8c6a20f11f7c5942c89149d1da8b90ef54fa01d531df99f347975ea72e86bb4d","0xc6e46f3c9bcf3b6915da12a72d7028e715ec5dda60f0efbb06510fd46ffecdfc","0x3ec9c9f25db31c283ca1bae1497336f6167cddb84d5765670f853078f0504442","0x8983f725eef502000ae29497bf6008b7a394d4f6b027d6635961eef3de68f928","0x6ffa1e5188e8fce82c1dbc66a1b8144c49f8db3c8a852bcf4f59b24847f7398c","0x37a940779c7f12bdaa5aaf7860064587a66bd903338c4b5677e9a893d09a8c76","0xc8edf5e593241e05a19ee435f78336ee828d4945774d213e55219abaed057e46","0x91be1f0cb1cf36e97e2e62c9b28c3432907a02fed3ec2741ff35f1ab31fdcecc","0x81e532ae2d0a24fe1b441de7cd567d33f321d6727dfe66837e725529c1cf9d8a","0x1afcffac07889ff89c585e14a13281f7d2d378e1248a75f06d54029a2885d90c","0x52c189e90e4b72108116f47d43eb5a8d0a5079c20090bfabc8c2e23ac7ec8019","0x7888f4af6f2ce9e8a2789d6262f3507d19501a0a365770aaf709515f60b6e8f2","0xa8458bc8c8ab1d4945ab9da0d4203ddba2468a0fef808e9febae01e3e86bcd40","0x4f2735e4d41cb2a5d48f6769cc066ea1066bbcd0623dd42fe7bc81e54092cd64","0x3ef2d6c56d2bc5990e646c07605e90ed24d1c642cbcca8f60a35422b8b7981ee","0x717b5d7cbc24826c5b1f7b7433bf30b76e9ba1370476af4e1b494a5211897cc3","0xe35032d4b064b015fe60638756eeb0bc24e7c7943586468d33349341ee0ed3d6"]}