@chainpatrol/mcp 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/prompts.ts","../src/resources.ts","../src/invoker.ts","../src/server.ts","../src/generated/tools.json","../src/http-invoker.ts","../src/tools-filter.ts","../src/version.ts"],"sourcesContent":["/**\n * Workflow prompts.\n *\n * These carry over the guides that live in the CLI skill file today — the\n * organization healthcheck and the trend search. There they are always resident\n * in the model's context; here a client fetches one only when the user is\n * actually doing that job.\n *\n * The procedure is the same, restated in tool vocabulary rather than shell\n * commands.\n */\n\nexport interface PromptArgument {\n name: string;\n description: string;\n required?: boolean;\n}\n\nexport interface PromptDefinition {\n name: string;\n title: string;\n description: string;\n arguments: PromptArgument[];\n /**\n * Every tool the workflow tells the agent to call, by name.\n *\n * A prompt is only advertised when all of them are exposed: narrowing the\n * tool surface with `only` / `CHAINPATROL_MCP_TOOLS` would otherwise leave a\n * prompt instructing the agent to call tools that are not there.\n *\n * `tests/prompts.unit.test.ts` keeps this in step with `template` — every\n * manifest tool named in the prose has to appear here, and every entry has to\n * be a real tool.\n */\n tools: string[];\n /** `{{arg}}` placeholders are substituted by `renderPrompt`. */\n template: string;\n}\n\nconst ORG_ARGUMENT: PromptArgument = {\n name: \"org\",\n description: \"Organization slug to run against, e.g. `morpho`.\",\n required: true,\n};\n\nexport const PROMPTS: PromptDefinition[] = [\n {\n name: \"org_healthcheck\",\n title: \"Organization healthcheck\",\n description:\n \"Audit one organization across the whole pipeline — detection, reviewing, blocklisting, takedowns — and report what needs attention.\",\n arguments: [ORG_ARGUMENT],\n tools: [\n \"healthchecks_list\",\n \"detection_configs_list\",\n \"operations_queues_snapshot\",\n \"organization_reports_list\",\n \"metrics_breakdown\",\n ],\n template: `Run a full healthcheck on the ChainPatrol organization \\`{{org}}\\`, covering the pipeline end to end: detection -> reviewing -> blocklisting -> takedowns.\n\n**How to run it**\n\n1. Call \\`healthchecks_list\\` first. It returns every check the platform exposes, which are implemented, and each one's default thresholds. Run every implemented check — they are independent, so fire them concurrently. The list describes the platform, not this session: if a check has no matching tool available to you, skip it and say so in the summary rather than reporting it as a failure.\n2. Alongside those, gather the qualitative signals the automated checks do not cover:\n - \\`detection_configs_list\\` — what is enabled, disabled, or not configured at all.\n - \\`operations_queues_snapshot\\` — the raw review and takedown queue counts.\n - \\`organization_reports_list\\` with \\`reportedByCustomer: true\\` — threats the customer found that detection missed. Each one is a detection gap worth naming.\n - \\`metrics_breakdown\\` by day — volume shifts that no single threshold catches.\n\n**How to report it**\n\nNarrate as you go; do not batch everything to the end. Before each check, one short sentence saying what you are checking. As soon as it returns, one line starting with a status word and ending in the number that matters:\n\n- \\`DONE\\` — ran cleanly, nothing to flag\n- \\`WARN\\` — a soft signal worth a human's eye\n- \\`FAIL\\` — a concrete failure to act on\n\nThen close with a Summary: one line per check, followed by a \"Top issues\" list in priority order, each with its concrete next action.`,\n },\n {\n name: \"trend_search\",\n title: \"Trend search\",\n description:\n \"Compare a recent window against a baseline for one organization to surface spikes — new attack channels, campaigns, or targeting — before they become healthcheck failures.\",\n arguments: [\n ORG_ARGUMENT,\n {\n name: \"days\",\n description: \"Length of the current window in days. Defaults to 7.\",\n required: false,\n },\n ],\n tools: [\"metrics_breakdown\", \"metrics_found\", \"organization_brands_list\"],\n template: `Search for trends in the ChainPatrol organization \\`{{org}}\\` over the last {{days}} days.\n\nTrend search asks what has *changed*, so it compares rates rather than grading absolute counts against thresholds. A trend is worth reporting even when the pipeline is keeping up with it.\n\n**Windows**\n\nUse two non-overlapping windows: a current window of {{days}} days, and a baseline of the prior 90 days ending the day before the current window starts. For every bucket:\n\n current_per_day = current_count / current_window_days\n baseline_per_day = baseline_count / baseline_window_days\n ratio = current_per_day / max(baseline_per_day, epsilon)\n\nFlag a bucket when \\`ratio >= 2\\` **and** \\`current_count >= 5\\`. The floor keeps a single new report on a quiet organization from reading as a spike.\n\n**Run these three concurrently**\n\n1. **By asset type** — \\`metrics_breakdown\\` for both windows, broken out by asset type. Catches a new attack channel.\n2. **Overall volume** — \\`metrics_found\\` daily for roughly six weeks, so the baseline and the spike are visible in one series.\n3. **By sub-brand** — \\`metrics_breakdown\\` for both windows by brand, and \\`organization_brands_list\\` to name them. Employee brands spiking usually means targeted impersonation.\n\n**Report**\n\nFor each flagged bucket: the bucket, current vs. baseline per-day rate, the ratio, and the absolute count. Then say what it most likely means and what to do about it. If nothing clears both thresholds, say so plainly and give the largest ratio you saw.`,\n },\n {\n name: \"cs_weekly_health\",\n title: \"Weekly customer-success sweep\",\n description:\n \"The packaged weekly customer health review: threats found, summary metrics, and whether the detectors are actually producing.\",\n arguments: [ORG_ARGUMENT],\n tools: [\"metrics_summary\", \"metrics_found\", \"detection_configs_validate\"],\n template: `Produce the weekly customer-success health package for \\`{{org}}\\`, covering the current week to date.\n\nGather concurrently:\n\n1. \\`metrics_summary\\` for the week — the headline numbers.\n2. \\`metrics_found\\` for the week — what was discovered, and through which channel.\n3. \\`detection_configs_validate\\` over a 168-hour lookback with a minimum of 1 result — which detectors produced nothing and are therefore silently broken.\n\nReport the headline metrics first, then any detector that failed validation, and finish with the one thing most worth a human's attention this week. If every detector passed and the metrics look ordinary, say that in a sentence rather than padding the report.`,\n },\n];\n\n/** Substitutes `{{name}}` placeholders, filling defaults for absent arguments. */\nexport function renderPrompt(\n prompt: PromptDefinition,\n args: Record<string, unknown>,\n): string {\n const defaults: Record<string, string> = { days: \"7\" };\n\n return prompt.template.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, name: string) => {\n const provided = args[name];\n if (typeof provided === \"string\" && provided !== \"\") return provided;\n if (typeof provided === \"number\" || typeof provided === \"boolean\") {\n return provided.toString();\n }\n const fallback = defaults[name];\n if (fallback !== undefined) return fallback;\n const argument = prompt.arguments.find((item) => item.name === name);\n if (argument?.required) {\n throw new Error(`Prompt \"${prompt.name}\" requires the \"${name}\" argument.`);\n }\n return \"\";\n });\n}\n\n/**\n * Narrows the prompt set to the workflows every one of whose tools is exposed.\n *\n * A prompt is a script for calling tools. Advertising one whose tools have been\n * filtered out hands the agent instructions it cannot follow, and the failure\n * surfaces mid-workflow as an unknown-tool error rather than at discovery.\n */\nexport function selectPrompts(\n prompts: PromptDefinition[],\n available: Iterable<string>,\n): PromptDefinition[] {\n const exposed = new Set(available);\n return prompts.filter((prompt) => prompt.tools.every((tool) => exposed.has(tool)));\n}\n","import type { ToolDefinition, ToolManifest } from \"./manifest\";\n\nexport interface McpResource {\n uri: string;\n name: string;\n title: string;\n description: string;\n mimeType: string;\n text: string;\n}\n\n/**\n * Builds the resource set served alongside the tools.\n *\n * Two kinds, both holding content that used to be inlined into every schema:\n * the large enums (asset types, detection sources) and the glossaries that\n * explain what a proposal label or reject reason means. Resources are fetched\n * on demand, so this detail costs nothing until an agent needs it.\n *\n * Every resource exists because some tool's schema points at it, so `tools`\n * narrows the set alongside the tool filter: with the referring tools gone the\n * resource is unreachable prose, and listing it only spends the context budget\n * the filter was set to save.\n */\nexport function buildResources(\n manifest: ToolManifest,\n tools: ToolDefinition[] = manifest.tools,\n): McpResource[] {\n const exposed = new Set(tools.map((tool) => tool.name));\n const resources: McpResource[] = [];\n\n for (const definition of manifest.enums) {\n const usedBy = definition.usedBy.filter((site) => exposed.has(toolNameOf(site)));\n if (usedBy.length === 0) continue;\n\n resources.push({\n uri: `chainpatrol://enums/${definition.name}`,\n name: definition.name,\n title: `Accepted values: ${definition.name}`,\n description:\n `Every value accepted for ${definition.name} (${definition.values.length} total). ` +\n `Referenced by ${usedBy.join(\", \")}.`,\n mimeType: \"text/plain\",\n text: definition.values.join(\"\\n\"),\n });\n }\n\n for (const glossary of manifest.glossaries) {\n if (!exposed.has(toolNameOf(glossary.title))) continue;\n const name = glossary.uri.split(\"/\").pop() ?? glossary.uri;\n resources.push({\n uri: glossary.uri,\n name,\n title: `Guide: ${name.replace(/-/g, \" \")}`,\n description: `What each value means, for ${glossary.title}.`,\n mimeType: \"text/markdown\",\n text: glossary.text,\n });\n }\n\n resources.sort((a, b) => a.uri.localeCompare(b.uri));\n return resources;\n}\n\n/**\n * Pulls the tool name out of a `tool_name.propertyPath` reference site.\n *\n * The generator writes both `EnumDefinition.usedBy` and `GlossaryDefinition`\n * titles in that form. Tool names are snake case and never contain a dot, so\n * the first one separates the two halves.\n */\nfunction toolNameOf(site: string): string {\n const dot = site.indexOf(\".\");\n return dot === -1 ? site : site.slice(0, dot);\n}\n","import type { ToolDefinition } from \"./manifest\";\n\n/**\n * Dispatches one tool call.\n *\n * Everything above this line — the tool list, the schemas, the descriptions,\n * the prompts and resources — is shared by every deployment. Only dispatch\n * differs: the remote server holds a tRPC caller and invokes the procedure in\n * process, while the local server posts to the public REST API. Keeping that\n * behind one function is what stops the two from drifting apart the way the\n * SDK drifted from the API.\n */\nexport type ToolInvoker = (\n tool: ToolDefinition,\n args: Record<string, unknown>,\n) => Promise<unknown>;\n\n/** Raised for an API response that carries a message worth showing the model. */\nexport class ToolInvocationError extends Error {\n readonly status: number | undefined;\n readonly details: unknown;\n\n constructor(\n message: string,\n options?: { status?: number; details?: unknown; cause?: unknown },\n ) {\n super(message, options?.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"ToolInvocationError\";\n this.status = options?.status;\n this.details = options?.details;\n }\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nimport manifestJson from \"./generated/tools.json\" with { type: \"json\" };\nimport { PROMPTS, renderPrompt, selectPrompts } from \"./prompts\";\nimport { buildResources } from \"./resources\";\nimport { ToolInvocationError, type ToolInvoker } from \"./invoker\";\nimport type { ToolDefinition, ToolManifest } from \"./manifest\";\n\n// The JSON import infers a huge literal type that will not line up with the\n// hand-written interface; the manifest is generated and CI-verified, so this\n// asserts the contract once here rather than weakening `JsonSchema`.\nexport const manifest = manifestJson as unknown as ToolManifest;\n\nexport interface CreateServerOptions {\n invoker: ToolInvoker;\n /**\n * Restricts the exposed tools by name. Every public API operation is served\n * by default — this exists only so a caller can trade breadth for context\n * budget, never to gate capabilities.\n */\n only?: string[];\n serverName?: string;\n version?: string;\n}\n\nfunction selectTools(only: string[] | undefined): ToolDefinition[] {\n if (!only || only.length === 0) return manifest.tools;\n\n const wanted = new Set(only);\n const selected = manifest.tools.filter((tool) => wanted.has(tool.name));\n const unknown = only.filter((name) => !manifest.tools.some((t) => t.name === name));\n if (unknown.length > 0) {\n throw new Error(\n `Unknown MCP tool name(s): ${unknown.join(\", \")}. ` +\n `Run with no filter to expose all ${manifest.tools.length} tools.`,\n );\n }\n return selected;\n}\n\n/**\n * Above this, a result is cut short rather than handed to the model whole.\n *\n * A broad `asset_list` or `detection_list` can otherwise fill a client's\n * context in a single call, with nothing in the response telling the model it\n * should have paginated.\n */\nexport const MAX_RESULT_CHARS = 100_000;\n\n/**\n * Serializes whatever the API returned into MCP tool content.\n *\n * Results are returned as JSON text rather than `structuredContent`: the tool\n * schemas here are generated from the router's *input* parsers, and claiming a\n * structured output shape we do not validate against would be a lie a client\n * could act on.\n *\n * Serialized compactly: indentation costs roughly half again as many tokens as\n * the payload itself, and nothing reads these but a model.\n */\nfunction toToolResult(value: unknown) {\n const serialized = typeof value === \"string\" ? value : JSON.stringify(value);\n const text =\n serialized.length <= MAX_RESULT_CHARS\n ? serialized\n : `${serialized.slice(0, MAX_RESULT_CHARS)}\\n\\n[Truncated: showing ${MAX_RESULT_CHARS} of ${serialized.length} characters, so this is no longer parseable JSON. Narrow the filters or request a smaller page to see a complete result.]`;\n\n return {\n content: [{ type: \"text\" as const, text }],\n };\n}\n\nfunction toErrorResult(error: unknown) {\n const message =\n error instanceof ToolInvocationError || error instanceof Error\n ? error.message\n : String(error);\n\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: message }],\n };\n}\n\n/**\n * Builds a ChainPatrol MCP server over the generated tool manifest.\n *\n * The transport and the dispatch strategy are the caller's choice: pass an\n * in-process invoker and a streamable-HTTP transport for the remote server, or\n * an HTTP invoker and a stdio transport for the local one. Both see exactly the\n * same tools.\n */\nexport function createChainPatrolMcpServer(options: CreateServerOptions): Server {\n const tools = selectTools(options.only);\n // Resources and prompts only make sense in terms of the tools that are\n // actually served, so `only` narrows all three surfaces together.\n const resources = buildResources(manifest, tools);\n const prompts = selectPrompts(\n PROMPTS,\n tools.map((tool) => tool.name),\n );\n const byName = new Map(tools.map((tool) => [tool.name, tool]));\n\n const server = new Server(\n {\n name: options.serverName ?? \"chainpatrol\",\n version: options.version ?? \"0.0.0\",\n },\n {\n capabilities: { tools: {}, resources: {}, prompts: {} },\n instructions:\n \"ChainPatrol threat intelligence and brand protection. Every public API \" +\n \"capability is available here as a tool: checking and searching assets, \" +\n \"reports, proposals, detections, takedowns, metrics, healthchecks and \" +\n \"organization management.\\n\\n\" +\n \"Most tools are scoped to one organization. Credentials can reach more \" +\n \"than one, and there is no implicit default, so call `user_orgs` first \" +\n \"and pass the slug explicitly.\\n\\n\" +\n \"Where a parameter's description points at a `chainpatrol://` resource, \" +\n \"read it before guessing a value.\",\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, () => ({\n tools: tools.map((tool) => ({\n name: tool.name,\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n title: tool.title,\n readOnlyHint: tool.readOnly,\n /*\n * `destructiveHint` is only meaningful when `readOnlyHint` is false, and\n * it does not mean \"irreversible\" — per the MCP spec, `false` asserts\n * the tool performs *only additive* updates, and the default is `true`.\n *\n * The public API's mutations block and unblock assets, delete detection\n * configs and asset groups, remove allowlist entries, review proposals\n * and replace webhook configuration. Those modify or remove existing\n * state, so claiming additive-only would suppress the confirmation\n * hosts raise for exactly this kind of call. Whether staff can restore\n * the data afterwards is a different question from what the hint asks.\n */\n ...(tool.readOnly ? {} : { destructiveHint: true }),\n ...(tool.deprecated ? { deprecated: true } : {}),\n },\n })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = byName.get(request.params.name);\n if (!tool) {\n return toErrorResult(\n new Error(\n `Unknown tool \"${request.params.name}\". Call tools/list for the current set.`,\n ),\n );\n }\n\n try {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n return toToolResult(await options.invoker(tool, args));\n } catch (error) {\n // Reported as a tool-level error rather than a protocol error so the\n // model sees the API's message and can correct the call itself.\n return toErrorResult(error);\n }\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, () => ({\n resources: resources.map(({ uri, name, title, description, mimeType }) => ({\n uri,\n name,\n title,\n description,\n mimeType,\n })),\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, (request) => {\n const resource = resources.find((item) => item.uri === request.params.uri);\n if (!resource) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n return {\n contents: [{ uri: resource.uri, mimeType: resource.mimeType, text: resource.text }],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, () => ({\n prompts: prompts.map(({ name, title, description, arguments: args }) => ({\n name,\n title,\n description,\n arguments: args,\n })),\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, (request) => {\n const prompt = prompts.find((item) => item.name === request.params.name);\n if (!prompt) {\n throw new Error(`Unknown prompt: ${request.params.name}`);\n }\n return {\n description: prompt.description,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: renderPrompt(prompt, request.params.arguments ?? {}),\n },\n },\n ],\n };\n });\n\n return server;\n}\n","{\n \"manifestVersion\": 1,\n \"tools\": [\n {\n \"name\": \"asset_changelog\",\n \"procedure\": \"assetChangelog\",\n \"method\": \"POST\",\n \"path\": \"/asset/changelog\",\n \"pathParams\": [],\n \"title\": \"Asset changelog\",\n \"description\": \"Asset changelog. Assets can be changed for various reasons, such as false positives, false negatives or normal reviews.\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"description\": \"Asset type One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n },\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Asset content\"\n },\n \"fromStatus\": {\n \"type\": \"string\",\n \"enum\": [\n \"UNKNOWN\",\n \"ALLOWED\",\n \"BLOCKED\"\n ],\n \"description\": \"Status of the changed assets to retrieve\"\n },\n \"toStatus\": {\n \"type\": \"string\",\n \"enum\": [\n \"UNKNOWN\",\n \"ALLOWED\",\n \"BLOCKED\"\n ],\n \"description\": \"Status of the changed assets to retrieve\"\n },\n \"startDate\": {\n \"allOf\": [\n {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"\n },\n {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n ],\n \"description\": \"The start date to list items from. This should be in the format `YYYY-MM-DD` and is inclusive.\"\n },\n \"endDate\": {\n \"allOf\": [\n {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"\n },\n {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n ],\n \"description\": \"The end date to list items from. This should be in the format `YYYY-MM-DD` and is inclusive.\"\n }\n },\n \"description\": \"List asset request body\\n\\nDefaults to getting all the updates in the last 1 day.\\n\\nYou can also choose a `startDate` and `endDate` for the range of asset updates, most \\ntimestamp formats should work, we use [Luxon](https://moment.github.io/luxon/#/parsing) \\nfor parsing the dates.\"\n }\n },\n {\n \"name\": \"asset_check\",\n \"procedure\": \"assetCheck\",\n \"method\": \"POST\",\n \"path\": \"/asset/check\",\n \"pathParams\": [],\n \"title\": \"Check asset\",\n \"description\": \"Answers 'is this asset known to be malicious?'. Takes one piece of content — a URL, domain, social handle, app listing, or wallet address — and returns its status (`BLOCKED`, `ALLOWED`, or `UNKNOWN`), the source that decided it, the reason, and the per-source breakdown. Use it when you have a specific asset in hand. To search the blocklist by pattern instead, use `/asset/search`; to find whether a report already exists for an asset, use `/reports/search`.\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Asset content. Could be a domain, URL, or crypto address.\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"description\": \"Check asset request body\"\n }\n },\n {\n \"name\": \"asset_details\",\n \"procedure\": \"assetDetails\",\n \"method\": \"POST\",\n \"path\": \"/asset/details\",\n \"pathParams\": [],\n \"title\": \"Get Asset Details\",\n \"description\": \"Deprecated — prefer `/asset/check`, which returns the same status plus the deciding source and per-source breakdown. Answers 'what is this asset's status, and which report set it?'. Returns the status, the reason (`report` for a ChainPatrol report, `eth-phishing-detect` for that list), and the id and link of the report behind the latest status change.\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": true,\n \"deprecated\": true,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Asset content\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"description\": \"Get asset details request body\"\n }\n },\n {\n \"name\": \"asset_list\",\n \"procedure\": \"assetList\",\n \"method\": \"POST\",\n \"path\": \"/asset/list\",\n \"pathParams\": [],\n \"title\": \"List assets\",\n \"description\": \"Answers 'which assets of this type does ChainPatrol hold at this status?'. Returns a paginated list for one asset type, defaulting to `BLOCKED`, optionally narrowed to a date range. Built for bulk export and sync — pass `next_page` from the previous response to continue. To check one specific asset, use `/asset/check` instead; for an organization's own monitored assets, use `/organization/assets`.\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"description\": \"Asset type One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"UNKNOWN\",\n \"ALLOWED\",\n \"BLOCKED\"\n ],\n \"default\": \"BLOCKED\",\n \"description\": \"Status of the assets to retrieve\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"description\": \"The start date to list assets from. This should be in the format `YYYY-MM-DD` and is inclusive.\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"description\": \"The end date to list assets from. This should be in the format `YYYY-MM-DD` and is inclusive.\"\n },\n \"per_page\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 10000,\n \"default\": 100,\n \"description\": \"The number of assets to return per page\"\n },\n \"next_page\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"not\": {}\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Cursor for fetching the next page of results\"\n }\n },\n \"required\": [\n \"type\"\n ],\n \"description\": \"List asset request body\\n\\nDefaults to getting all the updates in the last 1 day.\\n\\nYou can also choose a `startDate` and `endDate` for the range of asset updates, most \\ntimestamp formats should work, we use [Luxon](https://moment.github.io/luxon/#/parsing) \\nfor parsing the dates.\"\n }\n },\n {\n \"name\": \"asset_parse\",\n \"procedure\": \"assetParse\",\n \"method\": \"POST\",\n \"path\": \"/asset/parse\",\n \"pathParams\": [],\n \"title\": \"Parse Asset\",\n \"description\": \"Parse and normalize asset content to extract structured information\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"The asset content to parse (URL, address, etc.)\"\n }\n },\n \"required\": [\n \"content\"\n ],\n \"description\": \"Parse asset request body\"\n }\n },\n {\n \"name\": \"asset_scan_live\",\n \"procedure\": \"assetScanLive\",\n \"method\": \"POST\",\n \"path\": \"/asset/scan\",\n \"pathParams\": [],\n \"title\": \"Start an asset scan with optional webhook callback\",\n \"description\": \"Initiate an asset scan. Optionally provide an organization slug for brand impersonation detection and a callback URL to receive results when the scan completes.\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"asset\": {\n \"type\": \"string\",\n \"description\": \"The asset URL or content to scan\"\n },\n \"organizationSlug\": {\n \"type\": \"string\",\n \"description\": \"Optional: Org slug for brand impersonation & visual similarity rules\"\n },\n \"mode\": {\n \"type\": \"string\",\n \"enum\": [\n \"fast\",\n \"full\"\n ],\n \"default\": \"full\",\n \"description\": \"Scan mode\"\n },\n \"callbackUrl\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"HTTPS URL to receive scan results when complete\"\n }\n },\n \"required\": [\n \"asset\"\n ]\n }\n },\n {\n \"name\": \"asset_search\",\n \"procedure\": \"assetSearch\",\n \"method\": \"POST\",\n \"path\": \"/asset/search\",\n \"pathParams\": [],\n \"title\": \"Search asset\",\n \"description\": \"Search for an asset by content or ID and get its status, associated reports, and takedown details\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Asset content to search for (URL, domain, address, etc.)\"\n },\n \"assetId\": {\n \"type\": \"integer\",\n \"description\": \"Asset ID to search for\"\n },\n \"assetIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\"\n },\n \"description\": \"Multiple asset IDs to search for in bulk\"\n }\n },\n \"description\": \"Asset search request body\"\n }\n },\n {\n \"name\": \"asset_submit\",\n \"procedure\": \"assetSubmit\",\n \"method\": \"POST\",\n \"path\": \"/asset/submit\",\n \"pathParams\": [],\n \"title\": \"Submit assets to process and assign to organization(s)\",\n \"description\": \"Submit a list of assets such as domains, social profiles, or blockchain addresses. Automation will classify and assign them to appropriate organization(s).\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"assets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"maxItems\": 100,\n \"description\": \"List of assets to classify, such as domains, social profiles, or blockchain addresses.\"\n },\n \"organizationSlug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug to classify assets for. If not provided, the classification will be done for all organizations.\"\n }\n },\n \"required\": [\n \"assets\"\n ]\n }\n },\n {\n \"name\": \"asset_unblock\",\n \"procedure\": \"assetUnblock\",\n \"method\": \"POST\",\n \"path\": \"/asset/unblock\",\n \"pathParams\": [],\n \"title\": \"Unblock an asset\",\n \"description\": \"Unblock an asset if it belongs to your organization, or create a dispute if it doesn't. Requires API key.\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"reason\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"content\"\n ]\n }\n },\n {\n \"name\": \"blocklist_confirm\",\n \"procedure\": \"blocklistConfirm\",\n \"method\": \"POST\",\n \"path\": \"/asset/blocklist/confirm\",\n \"pathParams\": [],\n \"title\": \"Confirm blocklist prefix matches\",\n \"description\": \"Given a list of 4-byte (8-hex-char) hash prefixes and the algorithm version, returns the full SHA-256 hashes of blocked expressions whose prefixes match, grouped by prefix. Used by the browser extension to resolve true positives after a local prefix hit.\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"algoVersion\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"prefixes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"pattern\": \"^[0-9a-f]{8}$\"\n },\n \"minItems\": 1,\n \"maxItems\": 200\n }\n },\n \"required\": [\n \"algoVersion\",\n \"prefixes\"\n ],\n \"description\": \"Blocklist confirm request\"\n }\n },\n {\n \"name\": \"blocklist_version\",\n \"procedure\": \"blocklistVersion\",\n \"method\": \"GET\",\n \"path\": \"/asset/blocklist/version\",\n \"pathParams\": [],\n \"title\": \"Get blocklist version\",\n \"description\": \"Returns the current blocklist snapshot and recent-additions feed metadata (tokens, counts, absolute CDN URLs) and the canonicalization algorithm version. Used by the browser extension to discover and cache blocklist artifacts.\",\n \"tags\": [\n \"asset\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"acceptsNoInput\": true,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n {\n \"name\": \"detection_configs_create\",\n \"procedure\": \"detectionConfigsCreate\",\n \"method\": \"POST\",\n \"path\": \"/detection/configs/create\",\n \"pathParams\": [],\n \"title\": \"Create threat detection config\",\n \"description\": \"Create a config that makes a detection source run for an organization. Sources that are disabled by default have no config, so they cannot be enabled through /detection/configs/update until one is created. A source can have several configs, each with its own query, schedule or brand.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug. Defaults to the organization your API key is scoped to, so you only need this when authenticating with a key that spans organizations.\"\n },\n \"source\": {\n \"type\": \"string\",\n \"description\": \"Detection source key, from `GET /detection/sources`. The source must support the `organization` scope; global-only sources cannot be configured per organization. One of 55 values, e.g. meta_ads_search, telegram_channels_search, telegram_user_search, telegram_channels_search_vetric, telegram_user_search_vetric, facebook_page_search_vetric, facebook_user_search_vetric, instagram_account_search_vetric. Full list: resource chainpatrol://enums/source\"\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"ENABLED\",\n \"DEPRECATED_EVALUATE\",\n \"DISABLED\"\n ],\n \"default\": \"ENABLED\",\n \"description\": \"Status to create the config with. Defaults to `ENABLED`.\"\n },\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Optional label for this config\"\n },\n \"description\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Optional human-readable description of what the config does\"\n },\n \"cron\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Optional custom CRON schedule. Only accepted for sources that run on a schedule; the source's default schedule is used when omitted.\"\n },\n \"config\": {\n \"type\": \"object\",\n \"additionalProperties\": {},\n \"description\": \"Source-specific configuration, validated against that source's `configSchema` from `GET /detection/sources`. When omitted the source's schema defaults are applied.\"\n },\n \"brandId\": {\n \"anyOf\": [\n {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Optional brand to scope this config to. The brand must belong to the same organization. Omit for an organization-wide config.\"\n }\n },\n \"required\": [\n \"source\"\n ],\n \"description\": \"Create a threat detection config\\n\\nCreates the config row that makes a detection source run for your organization. Sources that are disabled by default have no config row, so they cannot be enabled through `/detection/configs/update` until one exists.\\n\\nA source can have several configs, each scanning with its own query, schedule or brand. Use `title` to tell them apart.\"\n }\n },\n {\n \"name\": \"detection_configs_delete\",\n \"procedure\": \"detectionConfigsDelete\",\n \"method\": \"POST\",\n \"path\": \"/detection/configs/delete\",\n \"pathParams\": [],\n \"title\": \"Delete threat detection config\",\n \"description\": \"Delete one detection config so it stops scanning. Other configs sharing the same source keep running. Deleting the last config for a source that is enabled by default is not permanent, since automation re-creates it; disable it through /detection/configs/update instead.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug. Defaults to the organization your API key is scoped to, so you only need this when authenticating with a key that spans organizations.\"\n },\n \"configId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"ID of the config to delete, from `/detection/configs/list`\"\n }\n },\n \"required\": [\n \"configId\"\n ],\n \"description\": \"Delete a threat detection config\\n\\nDeletes one detection config so it stops scanning. Deleting a config that shares a source with others leaves the others running.\\n\\nDeleting the *last* config for a source that is enabled by default for your organization is not permanent: automation re-creates a default config for that source on its next run. To stop such a source durably, set `status` to `DISABLED` through `/detection/configs/update` instead, which automation will not override.\"\n }\n },\n {\n \"name\": \"detection_configs_list\",\n \"procedure\": \"detectionConfigsList\",\n \"method\": \"POST\",\n \"path\": \"/detection/configs/list\",\n \"pathParams\": [],\n \"title\": \"List threat detection configs for organization\",\n \"description\": \"List all threat detection sources for an organization. Each source includes its individual configurations with details like schedule, status, and source-specific settings.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug\"\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"detection_configs_run\",\n \"procedure\": \"detectionConfigsRun\",\n \"method\": \"POST\",\n \"path\": \"/detection/configs/run\",\n \"pathParams\": [],\n \"title\": \"Run detection configs on demand\",\n \"description\": \"Run one or many organization detection configs and return run status per config.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"configId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"source\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"includeDisabled\": {\n \"type\": \"boolean\",\n \"default\": false\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"detection_configs_update\",\n \"procedure\": \"detectionConfigsUpdate\",\n \"method\": \"POST\",\n \"path\": \"/detection/configs/update\",\n \"pathParams\": [],\n \"title\": \"Update threat detection config\",\n \"description\": \"Update an organization threat detection config status, schedule, and config fields.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"configId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"ENABLED\",\n \"DEPRECATED_EVALUATE\",\n \"DISABLED\"\n ]\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cron\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"config\": {\n \"type\": \"object\",\n \"additionalProperties\": {}\n },\n \"mergeConfig\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"brandId\": {\n \"anyOf\": [\n {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Optional brand connection for this detection config. Pass null to clear the link. Only valid for org-scoped configs; the brand must belong to the same organization.\"\n }\n },\n \"required\": [\n \"slug\",\n \"configId\"\n ]\n }\n },\n {\n \"name\": \"detection_configs_validate\",\n \"procedure\": \"detectionConfigsValidate\",\n \"method\": \"POST\",\n \"path\": \"/detection/configs/validate\",\n \"pathParams\": [],\n \"title\": \"Validate detection config health\",\n \"description\": \"Validate detection configs by checking recent detection results, optionally running each config first.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"source\": {\n \"type\": \"string\"\n },\n \"minResults\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 1\n },\n \"lookbackHours\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"default\": 168\n },\n \"runBeforeValidate\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"includeDisabled\": {\n \"type\": \"boolean\",\n \"default\": false\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"detection_drift\",\n \"procedure\": \"detectionDrift\",\n \"method\": \"POST\",\n \"path\": \"/detection/drift\",\n \"pathParams\": [],\n \"title\": \"Get detection drift signals\",\n \"description\": \"Analyze organization detection configs and surface zero-result, noisy-source, and stale-query drift signals.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"lookbackHours\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 168\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"source\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"configIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n }\n },\n \"includeDisabled\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"thresholds\": {\n \"type\": \"object\",\n \"properties\": {\n \"zeroResultsMaxHours\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 72\n },\n \"noisyResultsPerDay\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"default\": 100\n },\n \"noisyAllowedRatioThreshold\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"maximum\": 1,\n \"default\": 0.6\n },\n \"staleConfigDays\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 30\n }\n }\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"detection_list\",\n \"procedure\": \"detectionList\",\n \"method\": \"POST\",\n \"path\": \"/detection/list\",\n \"pathParams\": [],\n \"title\": \"List threat detection results for organization\",\n \"description\": \"List threat detection results for an organization using API key authentication. Returns human-readable confidence levels (none, low, medium, high) and report status. Supports filtering by source, confidence level, asset status, and asset type. Includes pagination and search capabilities.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug\"\n },\n \"cursor\": {\n \"type\": \"number\",\n \"description\": \"Cursor for pagination\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 100,\n \"default\": 50,\n \"description\": \"Number of results to return\"\n },\n \"filters\": {\n \"type\": \"array\",\n \"description\": \"Filters to apply to the results. Each clause filters on one property. Accepted values per property — `source`: One of 55 values, e.g. meta_ads_search, telegram_channels_search, telegram_user_search, telegram_channels_search_vetric, telegram_user_search_vetric, facebook_page_search_vetric, facebook_user_search_vetric, instagram_account_search_vetric. Full list: resource chainpatrol://enums/source; `confidence`: none, low, medium, high; `liveness`: UNKNOWN, ALIVE, DEAD; `watchlist`: ENABLED, DISABLED; `assetStatus`: UNKNOWN, ALLOWED, BLOCKED; `reported`: reported, not_reported; `assetType`: One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type; `brand`: number values; `deleted`: string values; `countryCode`: string values.\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"property\": {\n \"type\": \"string\",\n \"enum\": [\n \"source\",\n \"confidence\",\n \"liveness\",\n \"watchlist\",\n \"assetStatus\",\n \"reported\",\n \"assetType\",\n \"brand\",\n \"deleted\",\n \"countryCode\"\n ]\n },\n \"operator\": {\n \"type\": \"string\",\n \"enum\": [\n \"in\",\n \"notIn\"\n ]\n },\n \"value\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"string\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"property\",\n \"operator\",\n \"value\"\n ]\n }\n },\n \"query\": {\n \"type\": \"string\",\n \"default\": \"\",\n \"description\": \"Search query for threat content\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Start date for filtering results\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"End date for filtering results\"\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"detection_sources_list\",\n \"procedure\": \"detectionSourcesList\",\n \"method\": \"GET\",\n \"path\": \"/detection/sources\",\n \"pathParams\": [],\n \"title\": \"List available threat detection sources\",\n \"description\": \"List the catalog of threat detection sources ChainPatrol can run, including the scopes each source supports and the JSON Schema its config object must satisfy. Sources that do not apply to the organization's industry are omitted.\",\n \"tags\": [\n \"detection\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug. Defaults to the organization your API key is scoped to, so you only need this when authenticating with a key that spans organizations. Sources that do not apply to the organization's industry are omitted.\"\n }\n },\n \"description\": \"List available threat detection sources\\n\\nReturns the catalog of detection sources ChainPatrol can run, including the scopes each source supports and the JSON Schema its `config` object must satisfy. Use this to discover valid `source` keys before creating or updating a detection config.\"\n }\n },\n {\n \"name\": \"dispute_create\",\n \"procedure\": \"disputeCreate\",\n \"method\": \"POST\",\n \"path\": \"/dispute/create\",\n \"pathParams\": [],\n \"title\": \"Create a dispute\",\n \"description\": \"Create a new dispute for an asset via the external API. Requires API key.\",\n \"tags\": [\n \"dispute\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"email\": {\n \"type\": \"string\",\n \"format\": \"email\"\n },\n \"description\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"content\"\n ]\n }\n },\n {\n \"name\": \"get_organization_reports\",\n \"procedure\": \"getOrganizationReports\",\n \"method\": \"POST\",\n \"path\": \"/public/getOrganizationReports\",\n \"pathParams\": [],\n \"title\": \"Get reports for an organization\",\n \"description\": \"Get reports for an organization based on organization slug and filters\",\n \"tags\": [\n \"public\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 20\n },\n \"cursor\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"TODO\",\n \"IN_PROGRESS\",\n \"CLOSED\"\n ]\n },\n \"searchQuery\": {\n \"type\": \"string\"\n },\n \"reporterQuery\": {\n \"type\": \"string\"\n },\n \"excludeAutomation\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"reporterKind\": {\n \"type\": \"string\",\n \"enum\": [\n \"human\",\n \"automation\"\n ]\n },\n \"reviewerKind\": {\n \"type\": \"string\",\n \"enum\": [\n \"human\",\n \"automation\"\n ]\n },\n \"onlyRejected\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"onlyFavorited\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"reviewStatuses\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"APPROVE\",\n \"REJECT\",\n \"SKIP\",\n \"ESCALATE\"\n ]\n }\n },\n \"assetTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"description\": \"One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n }\n },\n \"reviewedByUserId\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"updatedAtStartDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"updatedAtEndDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n },\n \"threatActorIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n },\n \"reportedByCustomer\": {\n \"type\": \"boolean\"\n },\n \"countryCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 2,\n \"maxLength\": 2\n }\n },\n \"registrars\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"hasMxRecords\": {\n \"type\": \"boolean\"\n },\n \"sources\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"APP\",\n \"API\",\n \"CANARY_TOKEN\",\n \"AUTO_DETECTION\",\n \"ASSET_MANAGEMENT\"\n ]\n }\n },\n \"needsCustomerReview\": {\n \"type\": \"boolean\",\n \"description\": \"Filter to reports waiting on the organization's own approval — the same queue the Review page shows a customer admin. `true` returns only reports with at least one pending proposal that is the customer's to action; `false` returns only reports that are not. A pending proposal counts when ChainPatrol staff escalated it to the customer and the customer has not answered yet, or when the organization submitted the report itself. Obligatory Organization Admin Approval does not widen this: an untriaged proposal is still waiting on ChainPatrol review, and reaches the customer only once staff escalate it.\"\n }\n },\n \"required\": [\n \"slug\",\n \"limit\"\n ]\n }\n },\n {\n \"name\": \"get_public_organization_metrics\",\n \"procedure\": \"getPublicOrganizationMetrics\",\n \"method\": \"POST\",\n \"path\": \"/public/getOrganizationMetrics\",\n \"pathParams\": [],\n \"title\": \"Get public metrics for organizations\",\n \"description\": \"Get public metrics for one or more organizations\",\n \"tags\": [\n \"public\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"organizationSlug\": {\n \"type\": \"string\"\n },\n \"brandSlug\": {\n \"type\": \"string\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n }\n },\n \"required\": [\n \"organizationSlug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_assets_dead_asset_spike\",\n \"procedure\": \"healthchecksAssetsDeadAssetSpike\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/assets/dead-asset-spike\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: spike in recently dead assets\",\n \"description\": \"Compares the count of `DETECTED_AS_DEAD` LivenessStatusEvent rows in the current window against the baseline rate from the prior `baselineDays`. Severity fires only when the current count clears `minSpikeCount` (suppresses noise when the org has near-zero baseline activity) and exceeds the configured multiplier. Useful for catching liveness-checker regressions after platform changes (captcha rollouts, anti-bot updates) which falsely mark live assets as dead.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"windowHours\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 24\n },\n \"baselineDays\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 7\n },\n \"warnMultiplier\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"default\": 2\n },\n \"failMultiplier\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0,\n \"default\": 4\n },\n \"minSpikeCount\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"default\": 10\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_detections_silent_configs\",\n \"procedure\": \"healthchecksDetectionsSilentConfigs\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/detections/silent-configs\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: detection configs producing recent results\",\n \"description\": \"Validates that each enabled detection config has produced at least the configured minimum number of results within the lookback window. Returns the uniform healthcheck result shape.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"source\": {\n \"type\": \"string\"\n },\n \"minResults\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 1\n },\n \"lookbackHours\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"default\": 168\n },\n \"runBeforeValidate\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"includeDisabled\": {\n \"type\": \"boolean\",\n \"default\": false\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_list\",\n \"procedure\": \"healthchecksList\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/list\",\n \"pathParams\": [],\n \"title\": \"List available healthchecks\",\n \"description\": \"Return the registry of healthchecks ChainPatrol exposes today, including planned checks that are not yet implemented on the backend. Clients should iterate this list and only call endpoints where `implemented` is true.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n {\n \"name\": \"healthchecks_missing_contact_url\",\n \"procedure\": \"healthchecksMissingContactUrl\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/organization/missing-contact-url\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: missing main contact URL / communication channel\",\n \"description\": \"Flags organizations that have no contactUrl configured. The contact URL is the main communication channel (typically Slack or Telegram) used to reach the customer.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_reviewing_backlog\",\n \"procedure\": \"healthchecksReviewingBacklog\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/reviewing/backlog\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: pile-up of unreviewed proposals\",\n \"description\": \"Counts proposals in PENDING review state for the org and grades severity (ok/warn/fail) against the configurable thresholds.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"warnThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 50\n },\n \"failThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 100\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_reviewing_old_proposals\",\n \"procedure\": \"healthchecksReviewingOldProposals\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/reviewing/old-proposals\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: proposals waiting too long in review\",\n \"description\": \"Counts PENDING proposals older than the warn / fail age thresholds (default 7 / 14 days) and lists the oldest offenders.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"warnAgeHours\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 168\n },\n \"failAgeHours\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 336\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_takedowns_automation_off\",\n \"procedure\": \"healthchecksTakedownsAutomationOff\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/takedowns/automation-off\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: automated takedowns disabled for too long\",\n \"description\": \"Flags orgs where takedown service is enabled but `isAutomatedTakedownsActive` has been off for longer than the configured age threshold (default warn 30 days, fail 60 days). Age is derived from the most recent SERVICES_AUTOMATED_TAKEDOWNS_UPDATED entry in OrganizationEvent, falling back to Organization.updatedAt. Orgs without takedown service enabled at all are excluded.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"warnAgeHours\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 720\n },\n \"failAgeHours\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 1440\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_takedowns_cancelled_count\",\n \"procedure\": \"healthchecksTakedownsCancelledCount\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/takedowns/cancelled-count\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: excess CANCELLED takedowns over a rolling window\",\n \"description\": \"Counts transitions into the CANCELLED status from the TakedownEvent log within the configured lookback window. Cancellations should be rare (typically 0-2 per week); a higher count usually signals a quality problem in the proposal funnel or a misuse of the CANCELLED status.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"lookbackHours\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 168\n },\n \"warnThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 3\n },\n \"failThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 10\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_takedowns_in_progress_volume\",\n \"procedure\": \"healthchecksTakedownsInProgressVolume\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/takedowns/in-progress-volume\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: pile-up of IN_PROGRESS takedowns\",\n \"description\": \"Counts takedowns currently IN_PROGRESS for the org regardless of age. Complements `takedowns.stale-in-progress` (which only flags items past a staleness threshold) — a high overall pile-up signals submission-format or vendor-side issues even when individual items are not yet stale.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"warnThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 30\n },\n \"failThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 75\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_takedowns_stale_in_progress\",\n \"procedure\": \"healthchecksTakedownsStaleInProgress\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/takedowns/stale-in-progress\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: stuck IN_PROGRESS takedowns\",\n \"description\": \"Counts takedowns that have sat in IN_PROGRESS past the staleness threshold (default 7 days) and lists the oldest offenders.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"staleThresholdHours\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 168\n },\n \"warnThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 1\n },\n \"failThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 5\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"healthchecks_takedowns_todo_volume\",\n \"procedure\": \"healthchecksTakedownsTodoVolume\",\n \"method\": \"POST\",\n \"path\": \"/healthchecks/takedowns/todo-volume\",\n \"pathParams\": [],\n \"title\": \"Healthcheck: pile-up of TODO takedowns\",\n \"description\": \"Counts takedowns sitting in TODO status for the org. A backlog typically signals either an automation gap on a new threat surface, or manual-filing capacity issues on the takedown team.\",\n \"tags\": [\n \"healthchecks\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"warnThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 50\n },\n \"failThreshold\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 100\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"metrics_breakdown\",\n \"procedure\": \"metricsBreakdown\",\n \"method\": \"POST\",\n \"path\": \"/metrics/breakdown\",\n \"pathParams\": [],\n \"title\": \"Get organization metrics breakdown\",\n \"description\": \"Get blocked threat counts grouped by day, asset type, or brand.\",\n \"tags\": [\n \"metrics\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"by\": {\n \"type\": \"string\",\n \"enum\": [\n \"day\",\n \"type\",\n \"brand\"\n ]\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n }\n }\n },\n \"required\": [\n \"slug\",\n \"by\"\n ]\n }\n },\n {\n \"name\": \"metrics_found\",\n \"procedure\": \"metricsFound\",\n \"method\": \"POST\",\n \"path\": \"/metrics/found\",\n \"pathParams\": [],\n \"title\": \"Get found threats count\",\n \"description\": \"Return the default 'found' metric for an organization, defined as customer-facing new threats.\",\n \"tags\": [\n \"metrics\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n }\n }\n },\n \"required\": [\n \"slug\",\n \"startDate\",\n \"endDate\"\n ]\n }\n },\n {\n \"name\": \"metrics_found_by_source\",\n \"procedure\": \"metricsFoundBySource\",\n \"method\": \"POST\",\n \"path\": \"/metrics/found-by-source\",\n \"pathParams\": [],\n \"title\": \"Get currently blocked threats by first-report source\",\n \"description\": \"Count distinct currently blocked assets whose earliest report for the organization falls in the date range, split into customer vs ChainPatrol (staff + automation). Blocked is current status or pending BLOCKED, not blockedAt. This does not equal /metrics/found.\",\n \"tags\": [\n \"metrics\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Only include assets whose earliest report was created on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Only include assets whose earliest report was created on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"description\": \"Only include assets belonging to these brands\"\n }\n },\n \"required\": [\n \"slug\",\n \"startDate\",\n \"endDate\"\n ]\n }\n },\n {\n \"name\": \"metrics_summary\",\n \"procedure\": \"metricsSummary\",\n \"method\": \"POST\",\n \"path\": \"/metrics/summary\",\n \"pathParams\": [],\n \"title\": \"Get organization metrics summary\",\n \"description\": \"Get customer-facing organization metrics and blocked threat breakdowns for a date range.\",\n \"tags\": [\n \"metrics\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n }\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"metrics_takedown_success_rate\",\n \"procedure\": \"metricsTakedownSuccessRate\",\n \"method\": \"POST\",\n \"path\": \"/metrics/takedown-success-rate\",\n \"pathParams\": [],\n \"title\": \"Get organization takedown success rate by asset type\",\n \"description\": \"Get the share of takedowns that ended in a removal, broken down by asset type, for a date range. The range bounds when a takedown was first submitted to a provider, so takedowns opened but never filed are excluded; outcomes are read as of now, and takedowns still being worked count against the rate.\",\n \"tags\": [\n \"metrics\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Only include takedowns first submitted to a provider on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Only include takedowns first submitted to a provider on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off\"\n },\n \"blockLabel\": {\n \"type\": \"string\",\n \"description\": \"Only include assets blocked with this review label, e.g. \\\"Brand Impersonation\\\", \\\"Employee Impersonation\\\" or \\\"Targeting Org Users\\\"\"\n },\n \"brandType\": {\n \"type\": \"string\",\n \"enum\": [\n \"INDIVIDUAL\",\n \"ORGANIZATION\",\n \"PRODUCT\"\n ],\n \"description\": \"Only include assets belonging to brands of this type\"\n },\n \"countryCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 2,\n \"maxLength\": 2\n },\n \"description\": \"Only include assets scanned from these ISO 3166-1 alpha-2 countries\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"description\": \"Only include assets belonging to these brands\"\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"metrics_takedown_time\",\n \"procedure\": \"metricsTakedownTime\",\n \"method\": \"POST\",\n \"path\": \"/metrics/takedown-time\",\n \"pathParams\": [],\n \"title\": \"Get organization time-to-takedown metrics\",\n \"description\": \"Get the median time from takedown start to completion, broken down by asset type, for a date range.\",\n \"tags\": [\n \"metrics\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Only include takedowns completed on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Only include takedowns completed on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off\"\n },\n \"blockLabel\": {\n \"type\": \"string\",\n \"description\": \"Only include assets blocked with this review label, e.g. \\\"Brand Impersonation\\\", \\\"Employee Impersonation\\\" or \\\"Targeting Org Users\\\"\"\n },\n \"brandType\": {\n \"type\": \"string\",\n \"enum\": [\n \"INDIVIDUAL\",\n \"ORGANIZATION\",\n \"PRODUCT\"\n ],\n \"description\": \"Only include assets belonging to brands of this type\"\n },\n \"countryCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 2,\n \"maxLength\": 2\n },\n \"description\": \"Only include assets scanned from these ISO 3166-1 alpha-2 countries\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"description\": \"Only include assets belonging to these brands\"\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"metrics_takedown_time_by_provider\",\n \"procedure\": \"metricsTakedownTimeByProvider\",\n \"method\": \"POST\",\n \"path\": \"/metrics/takedown-time/by-provider\",\n \"pathParams\": [],\n \"title\": \"Get organization time-to-takedown metrics by provider\",\n \"description\": \"Get the median time from takedown start to completion, broken down by the provider a takedown was filed against, for a date range. Each takedown is counted once per provider role it carries (hosting provider, domain registrar, TLD registrar).\",\n \"tags\": [\n \"metrics\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Only include takedowns completed on or after this date. A date-only value (YYYY-MM-DD) starts at midnight UTC\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Only include takedowns completed on or before this date. A date-only value (YYYY-MM-DD) covers the whole day in UTC; pass a full timestamp for a precise cut-off\"\n },\n \"roles\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"HOSTING_PROVIDER\",\n \"DOMAIN_REGISTRAR\",\n \"TLD_REGISTRAR\"\n ]\n },\n \"description\": \"Only break down these provider roles. Omit for every role. A takedown filed against both a host and a registrar is counted once under each\"\n },\n \"blockLabel\": {\n \"type\": \"string\",\n \"description\": \"Only include assets blocked with this review label, e.g. \\\"Brand Impersonation\\\", \\\"Employee Impersonation\\\" or \\\"Targeting Org Users\\\"\"\n },\n \"brandType\": {\n \"type\": \"string\",\n \"enum\": [\n \"INDIVIDUAL\",\n \"ORGANIZATION\",\n \"PRODUCT\"\n ],\n \"description\": \"Only include assets belonging to brands of this type\"\n },\n \"countryCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 2,\n \"maxLength\": 2\n },\n \"description\": \"Only include assets scanned from these ISO 3166-1 alpha-2 countries\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"description\": \"Only include assets belonging to these brands\"\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"metrics_takedown_time_trend\",\n \"procedure\": \"metricsTakedownTimeTrend\",\n \"method\": \"POST\",\n \"path\": \"/metrics/takedown-time/trend\",\n \"pathParams\": [],\n \"title\": \"Get organization time-to-takedown trends\",\n \"description\": \"Get the median time from takedown start to completion bucketed by the month a takedown completed, over a trailing window of whole months, together with the month-over-month change. Returns one series per requested asset type, or a single pooled series.\",\n \"tags\": [\n \"metrics\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug\"\n },\n \"months\": {\n \"type\": \"integer\",\n \"minimum\": 2,\n \"maximum\": 36,\n \"default\": 12,\n \"description\": \"Size of the trailing window in whole months, including the current month\"\n },\n \"assetTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"description\": \"One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n },\n \"maxItems\": 5,\n \"description\": \"Break the trend down by these asset types, one series each. Omit for a single series pooled across every asset type\"\n },\n \"blockLabel\": {\n \"type\": \"string\",\n \"description\": \"Only include assets blocked with this review label, e.g. \\\"Brand Impersonation\\\", \\\"Employee Impersonation\\\" or \\\"Targeting Org Users\\\"\"\n },\n \"brandType\": {\n \"type\": \"string\",\n \"enum\": [\n \"INDIVIDUAL\",\n \"ORGANIZATION\",\n \"PRODUCT\"\n ],\n \"description\": \"Only include assets belonging to brands of this type\"\n },\n \"countryCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 2,\n \"maxLength\": 2\n },\n \"description\": \"Only include assets scanned from these ISO 3166-1 alpha-2 countries\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"description\": \"Only include assets belonging to these brands\"\n }\n },\n \"required\": [\n \"slug\"\n ]\n }\n },\n {\n \"name\": \"operations_queues_snapshot\",\n \"procedure\": \"operationsQueuesSnapshot\",\n \"method\": \"POST\",\n \"path\": \"/operations/queues/snapshot\",\n \"pathParams\": [],\n \"title\": \"Get operations queue snapshot\",\n \"description\": \"Return pending review and takedown queue state with SLA and age buckets for operational monitoring.\",\n \"tags\": [\n \"operations\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"all\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"windowHours\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"default\": 168\n }\n }\n }\n },\n {\n \"name\": \"organization_asset_groups_create\",\n \"procedure\": \"organizationAssetGroupsCreate\",\n \"method\": \"POST\",\n \"path\": \"/organization/asset-groups\",\n \"pathParams\": [],\n \"title\": \"Create asset group\",\n \"description\": \"Create a new asset group for organizing your organization's assets.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 255,\n \"description\": \"Name for the new group\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"description\": \"Create a new asset group\\n\\nCreates a new asset group for organizing your organization's assets.\"\n }\n },\n {\n \"name\": \"organization_asset_groups_delete\",\n \"procedure\": \"organizationAssetGroupsDelete\",\n \"method\": \"DELETE\",\n \"path\": \"/organization/asset-groups/{groupId}\",\n \"pathParams\": [\n \"groupId\"\n ],\n \"title\": \"Delete asset group\",\n \"description\": \"Delete an asset group. Assets in this group will become ungrouped.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"groupId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"ID of the group to delete\"\n }\n },\n \"required\": [\n \"groupId\"\n ],\n \"description\": \"Delete an asset group\\n\\nDeletes an asset group. Assets in this group will become ungrouped.\"\n }\n },\n {\n \"name\": \"organization_asset_groups_list\",\n \"procedure\": \"organizationAssetGroupsList\",\n \"method\": \"GET\",\n \"path\": \"/organization/asset-groups\",\n \"pathParams\": [],\n \"title\": \"List organization asset groups\",\n \"description\": \"List all asset groups belonging to your organization with asset counts.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {},\n \"description\": \"List organization asset groups\\n\\nReturns all asset groups belonging to the organization associated with your API key.\"\n }\n },\n {\n \"name\": \"organization_asset_groups_update\",\n \"procedure\": \"organizationAssetGroupsUpdate\",\n \"method\": \"PATCH\",\n \"path\": \"/organization/asset-groups/{groupId}\",\n \"pathParams\": [\n \"groupId\"\n ],\n \"title\": \"Update asset group\",\n \"description\": \"Rename an existing asset group.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"groupId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"ID of the group to update\"\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 255,\n \"description\": \"New name for the group\"\n }\n },\n \"required\": [\n \"groupId\",\n \"name\"\n ],\n \"description\": \"Update an asset group\\n\\nRename an existing asset group.\"\n }\n },\n {\n \"name\": \"organization_assets_add\",\n \"procedure\": \"organizationAssetsAdd\",\n \"method\": \"POST\",\n \"path\": \"/organization/assets\",\n \"pathParams\": [],\n \"title\": \"Add assets to organization allowlist\",\n \"description\": \"Batch add multiple assets to your organization's allowlist. Each asset will be automatically parsed, classified, and approved as ALLOWED status. Supports optional group assignment.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"assets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Asset content (URL, address, handle, etc.)\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Optional display name for the asset\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"Optional description for the asset\"\n },\n \"groupId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"Optional group ID to assign the asset to\"\n }\n },\n \"required\": [\n \"content\"\n ]\n },\n \"minItems\": 1,\n \"maxItems\": 1000,\n \"description\": \"Array of assets to add (max 1000 per request)\"\n }\n },\n \"required\": [\n \"assets\"\n ],\n \"description\": \"Add assets to organization allowlist\\n\\nBatch add multiple assets to your organization's allowlist. \\nEach asset will be automatically parsed and classified.\\nAssets will be auto-approved as ALLOWED status.\"\n }\n },\n {\n \"name\": \"organization_assets_delete\",\n \"procedure\": \"organizationAssetsDelete\",\n \"method\": \"DELETE\",\n \"path\": \"/organization/assets/{assetId}\",\n \"pathParams\": [\n \"assetId\"\n ],\n \"title\": \"Remove asset from organization\",\n \"description\": \"Remove an asset from your organization's allowlist. This performs a soft delete.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"assetId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"ID of the asset to remove\"\n }\n },\n \"required\": [\n \"assetId\"\n ],\n \"description\": \"Remove an asset from the organization\\n\\nThis removes the asset from the organization's allowlist.\"\n }\n },\n {\n \"name\": \"organization_assets_list\",\n \"procedure\": \"organizationAssetsList\",\n \"method\": \"GET\",\n \"path\": \"/organization/assets\",\n \"pathParams\": [],\n \"title\": \"List organization assets\",\n \"description\": \"List all assets belonging to your organization with optional filtering by type, group, and search query. Supports pagination.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug. Optional for organization-scoped API keys, which resolve the organization from the key itself. Required when your credentials can reach more than one organization.\"\n },\n \"type\": {\n \"type\": \"string\",\n \"description\": \"Filter by asset type (URL, ADDRESS, etc.) One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n },\n \"groupId\": {\n \"type\": \"integer\",\n \"description\": \"Filter by group ID. Use -1 for ungrouped assets only. Omit for all assets.\"\n },\n \"query\": {\n \"type\": \"string\",\n \"description\": \"Search query to filter assets by content\"\n },\n \"per_page\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 1000,\n \"default\": 100,\n \"description\": \"The number of assets to return per page (max 1000)\"\n },\n \"next_page\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"not\": {}\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Cursor for fetching the next page of results\"\n }\n },\n \"description\": \"List organization assets request body\\n\\nReturns all assets belonging to the organization identified by `slug`, or —\\nwhen `slug` is omitted — the organization associated with your API key.\\nSupports filtering by type, group, and search query.\"\n }\n },\n {\n \"name\": \"organization_assets_update\",\n \"procedure\": \"organizationAssetsUpdate\",\n \"method\": \"PATCH\",\n \"path\": \"/organization/assets/{assetId}\",\n \"pathParams\": [\n \"assetId\"\n ],\n \"title\": \"Update organization asset\",\n \"description\": \"Update an asset's name, description, or group assignment. The asset must belong to your organization.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"assetId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"ID of the asset to update\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"New display name for the asset\"\n },\n \"description\": {\n \"description\": \"New description for the asset\",\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"groupId\": {\n \"anyOf\": [\n {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"New group ID (null to ungroup)\"\n }\n },\n \"required\": [\n \"assetId\"\n ],\n \"description\": \"Update an organization asset\\n\\nUpdate the name, description, or group assignment of an asset.\"\n }\n },\n {\n \"name\": \"organization_brands_list\",\n \"procedure\": \"organizationBrandsList\",\n \"method\": \"GET\",\n \"path\": \"/organization/brands\",\n \"pathParams\": [],\n \"title\": \"List organization brands\",\n \"description\": \"List every brand belonging to the organization associated with your API key. Returns parent brands (`type: ORGANIZATION`), individual / employee brands (`type: INDIVIDUAL`), and product brands (`type: PRODUCT`) in one call, including configuration fields: `brandColors` (HEX strings), `includedTerms`, `excludedTerms`, `tickers`, `avatarUrl`, `websiteUrl`, and `twitterHandle`. Each brand also reports `useOrganizationDocs` (when true, the brand inherits its LOA/POA from the org), a `legalDocuments` block with the brand-level Letter of Authorization and Power of Attorney attachments (each `{ present, fileName, fileUrl }`), and `trademarkRegistrations` — every brand-level trademark on file with its issuing office, registration number, and (when uploaded) a `certificateFileUrl` link to the certificate PDF. Soft-deleted brands are excluded. Brand counts per organization are typically <500, so the endpoint returns the full set in one response (no pagination).\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {},\n \"description\": \"List organization brands\\n\\nReturns all brands belonging to the organization associated with your API key,\\nincluding sub-brands (`ORGANIZATION`), individual / employee brands\\n(`INDIVIDUAL`), and product brands (`PRODUCT`). Soft-deleted brands are\\nexcluded.\"\n }\n },\n {\n \"name\": \"organization_create\",\n \"procedure\": \"organizationCreate\",\n \"method\": \"POST\",\n \"path\": \"/organization/immunefi-create\",\n \"pathParams\": [],\n \"title\": \"Create a new baseline organization (Immunefi only)\",\n \"description\": \"Create a new organization with baseline configuration and return an API key for accessing ChainPatrol services. This endpoint requires authentication with a valid Immunefi API key. Organization slugs will be automatically prefixed with 'immunefi-' (or 'immunefi-test-' when using a test API key) to prevent name clashes. The endpoint validates that the requested slug doesn't conflict with any existing organizations (checking bare slug, 'immunefi-{slug}', and 'immunefi-test-{slug}' variations). The organization will be created with standard monitoring and detection features enabled. Returns the organization details, API key, owner information, and direct dashboard URL.\",\n \"tags\": [\n \"organization\",\n \"immunefi\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 255\n },\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 100,\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*$\"\n },\n \"websiteUrl\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"description\": {\n \"type\": \"string\",\n \"maxLength\": 1000\n },\n \"ownerEmail\": {\n \"type\": \"string\",\n \"format\": \"email\"\n },\n \"ownerFullName\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"maxLength\": 255\n }\n },\n \"required\": [\n \"name\",\n \"slug\",\n \"ownerEmail\",\n \"ownerFullName\"\n ]\n }\n },\n {\n \"name\": \"organization_metrics_get\",\n \"procedure\": \"organizationMetricsGet\",\n \"method\": \"GET\",\n \"path\": \"/organization/metrics\",\n \"pathParams\": [],\n \"title\": \"Get organization metrics\",\n \"description\": \"Get metrics for your organization with optional date range and brand filtering. Organization is determined from your API key.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"organizationSlug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug. Required when authenticating with a user session (Bearer token) and `slugs`/`allMyOrgs` are not supplied; ignored when using an org-scoped API key (org is derived from the key). Mutually exclusive with `slugs` and `allMyOrgs`.\"\n },\n \"slugs\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"maxItems\": 500,\n \"description\": \"Multi-org form. Each slug is auth-checked individually (org-scoped API keys may only pass their own org; sessions and user API keys must have membership or staff role per slug). When supplied with more than one slug, the response includes a `perOrg` breakdown plus `metrics` rolled up across all of them. Capped at 500 slugs per call. Mutually exclusive with `organizationSlug` and `allMyOrgs`.\"\n },\n \"allMyOrgs\": {\n \"type\": \"boolean\",\n \"description\": \"Shortcut for 'every org the caller is authorized to read'. Reuses the same filter logic as `/user/orgs`: org-scoped API keys are rejected (they're pinned to one org — use the default form); user API keys / Bearer sessions resolve to the user's memberships (or every active org for staff). Combine with `subscriptionStatus` and `services` to narrow (e.g. only paying customers with takedowns enabled). The resolved org set is still capped at 500 and a 413 is returned if exceeded. Mutually exclusive with `organizationSlug`, `slugs`, and `brandSlug`.\"\n },\n \"subscriptionStatus\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"PROSPECT\",\n \"POC\",\n \"ACTIVE\",\n \"INTEGRATION\",\n \"INACTIVE\"\n ]\n },\n \"minItems\": 1,\n \"description\": \"Only meaningful with `allMyOrgs: true`. Defaults to the same set `/user/orgs` uses (ACTIVE/POC/PROSPECT/INTEGRATION); pass INACTIVE explicitly to include churned organizations.\"\n },\n \"services\": {\n \"type\": \"object\",\n \"properties\": {\n \"reporting\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"reviewing\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"protection\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"takedowns\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n },\n \"automated\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"detection\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"darkWebMonitoring\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n }\n },\n \"description\": \"Only meaningful with `allMyOrgs: true`. Same shape as `/user/orgs`'s `services` filter — every service accepts `{ active }`, and **only `takedowns` additionally accepts `automated`** (the one service where manual-vs-automated changes real platform behavior). E.g. `{ takedowns: { active: true, automated: false } }` for 'orgs with takedowns enabled but automation off'.\"\n },\n \"brandSlug\": {\n \"type\": \"string\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"include\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"reports\",\n \"newThreats\",\n \"threatsWatchlisted\",\n \"takedownsFiled\",\n \"takedownsInProgress\",\n \"takedownsCompleted\",\n \"takedownsCancelled\",\n \"domainThreats\",\n \"twitterThreats\",\n \"telegramThreats\",\n \"otherThreats\",\n \"blockedByType\",\n \"blockedByDay\"\n ]\n },\n \"description\": \"Subset of metrics to compute. When omitted or empty, every metric is computed (legacy behavior). Each value in `include` costs roughly one aggregate query, so narrow the list when an agent only needs a couple of numbers — this is the main lever for keeping big-org calls inside the 30s function cap. Fields not in `include` come back as `null`. `takedownsInProgress` and `takedownsCancelled` count takedowns currently in that status whose `updatedAt` falls in the window (same windowing as `takedownsFiled`), so they reconcile with the takedowns list filtered by status over the same date range.\"\n }\n }\n }\n },\n {\n \"name\": \"organization_proposals_review\",\n \"procedure\": \"organizationProposalsReview\",\n \"method\": \"POST\",\n \"path\": \"/organization/proposals/{proposalId}/review\",\n \"pathParams\": [\n \"proposalId\"\n ],\n \"title\": \"Review an organization proposal\",\n \"description\": \"Records your organization's decision on a proposal that is waiting on you — one ChainPatrol escalated to you, or one on a report you submitted yourself. These are exactly the proposals your Review page shows and the ones `GET /organization/reports?needsCustomerReview=true` counts; find their IDs in `proposals[].id` on that endpoint. `APPROVE` blocks the asset and takes a `label` (plus a `brandId` for labels that name a specific brand). `REJECT` takes a `rejectReason`. `WATCHLIST` rejects the proposal and parks the asset so it is re-evaluated if it comes back alive.\\n\\nPass `assetId` alongside `proposalId`; it must match the proposal's current asset or the request returns `409`, which keeps a caller from actioning a proposal it never read.\\n\\nApprovals are held to the same safety checks as the Review page, with no override: an asset that any enabled legitimacy rule marks as legitimate cannot be approved here, and an allowlisted asset cannot be blocked here. Both return `403` and must be handled on the Review page by a person.\\n\\nRate limited to 10 reviews per organization per day, since a review is not undoable and looping over a queue is easy to do by accident. Exceeding it returns `429`. The limit is shared across all of the organization's API credentials and does not apply to reviews made from the Review page.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"proposalId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"ID of the proposal to review. Read it from `proposals[].id` on `GET /organization/reports`.\"\n },\n \"assetId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"ID of the asset this proposal is for, from `proposals[].asset.id` on `GET /organization/reports`. Required, and must match the proposal's current asset — a mismatch returns 409. This proves the request was built from a proposal you actually read, rather than from a guessed or stale ID.\"\n },\n \"slug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug. Optional for organization-scoped API keys, which resolve the organization from the key itself. Required when your credentials can reach more than one organization.\"\n },\n \"decision\": {\n \"type\": \"string\",\n \"enum\": [\n \"APPROVE\",\n \"REJECT\",\n \"WATCHLIST\"\n ],\n \"description\": \"What to do with the proposal. `APPROVE` blocks the asset, `REJECT` declines it, and `WATCHLIST` declines it but parks the asset so it is re-evaluated if it comes back alive. `WATCHLIST` is recorded as a rejection with the asset watchlisted — the same write the Review page performs.\"\n },\n \"label\": {\n \"type\": \"string\",\n \"enum\": [\n \"Brand Impersonation\",\n \"Employee Impersonation\",\n \"Fake Employee\",\n \"Targeting Org Users\",\n \"General Phishing\",\n \"C2 Server\",\n \"False Positive\",\n \"Organization Member Impersonation\",\n \"Targeting Organization\"\n ],\n \"description\": \"Why the asset is being blocked. Full guidance: resource chainpatrol://glossary/proposal-labels\"\n },\n \"brandId\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0,\n \"description\": \"Brand the asset impersonates. Optional for most labels, but required for `Brand Impersonation` and `Employee Impersonation`, which name a specific impersonation target. List your brands with `GET /organization/brands`.\"\n },\n \"rejectReason\": {\n \"type\": \"string\",\n \"enum\": [\n \"irrelevant\",\n \"no_malicious_activity\",\n \"insufficient_evidence\",\n \"not_targeting_org\",\n \"decayed\"\n ],\n \"description\": \"Why the proposal is being rejected. Full guidance: resource chainpatrol://glossary/proposal-reject-reasons\"\n },\n \"watchlistReason\": {\n \"type\": \"string\",\n \"enum\": [\n \"DEAD\",\n \"PARKING\",\n \"NOT_ENOUGH_EVIDENCE\",\n \"OTHER\"\n ],\n \"description\": \"Why the asset is being parked. Full guidance: resource chainpatrol://glossary/proposal-watchlist-reasons\"\n },\n \"note\": {\n \"type\": \"string\",\n \"maxLength\": 1000,\n \"description\": \"Free-text detail recorded on the review, alongside the structured reason. Required when `watchlistReason` is `OTHER`.\"\n }\n },\n \"required\": [\n \"proposalId\",\n \"assetId\",\n \"decision\"\n ],\n \"description\": \"Review a proposal on your organization's behalf\\n\\nRecords your organization's decision on a proposal ChainPatrol escalated to you\\nand you have not answered yet. These are exactly the proposals your Review page\\nshows, and the ones counted by\\n`GET /organization/reports?needsCustomerReview=true`.\\n\\nProposals on reports your organization sourced itself are not reviewable here:\\nChainPatrol triages those and staff approval blocks the asset on its own, so\\nthere is no decision for you to record. They return `403`.\"\n }\n },\n {\n \"name\": \"organization_reports_list\",\n \"procedure\": \"organizationReportsList\",\n \"method\": \"GET\",\n \"path\": \"/organization/reports\",\n \"pathParams\": [],\n \"title\": \"List organization reports\",\n \"description\": \"Answers 'which of my organization's reports match these filters?'. Returns full report records — proposals, assets, scans, reporter, SLA — with filtering and pagination, newest first. The organization comes from your API key, or pass `slug` when your credentials can reach more than one. To check whether a report already exists for specific assets before filing a new one, use `POST /reports/search`, which looks reports up by asset content in a single batched call.\",\n \"tags\": [\n \"organization\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"limit\": {\n \"type\": \"number\",\n \"minimum\": 1,\n \"maximum\": 20\n },\n \"cursor\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"TODO\",\n \"IN_PROGRESS\",\n \"CLOSED\"\n ]\n },\n \"searchQuery\": {\n \"type\": \"string\"\n },\n \"reporterQuery\": {\n \"type\": \"string\"\n },\n \"reporterKind\": {\n \"type\": \"string\",\n \"enum\": [\n \"human\",\n \"automation\"\n ]\n },\n \"reviewerKind\": {\n \"type\": \"string\",\n \"enum\": [\n \"human\",\n \"automation\"\n ]\n },\n \"reviewedByUserId\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"updatedAtStartDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"updatedAtEndDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"registrars\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"hasMxRecords\": {\n \"type\": \"boolean\"\n },\n \"slug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug. Optional for organization-scoped API keys, which resolve the organization from the key itself. Required when your credentials can reach more than one organization.\"\n },\n \"excludeAutomation\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"onlyRejected\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"onlyFavorited\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"reportedByCustomer\": {\n \"type\": \"boolean\"\n },\n \"needsCustomerReview\": {\n \"type\": \"boolean\",\n \"description\": \"Filter to reports waiting on your organization's own approval — the same queue your Review page shows. `true` returns only reports with at least one pending proposal that is yours to action; `false` returns only reports that are not. A pending proposal counts when ChainPatrol staff escalated it to you and you have not answered yet. Answering means approving, rejecting, or escalating it back to ChainPatrol. Two things do not put a report here: reports your organization sourced itself (ChainPatrol triages those and staff approval blocks the asset without you, though you still see them in the unfiltered list), and Obligatory Organization Admin Approval (a proposal ChainPatrol has not triaged yet is still waiting on our review, and reaches you only once staff escalate it).\"\n },\n \"reviewStatuses\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"APPROVE\",\n \"REJECT\",\n \"SKIP\",\n \"ESCALATE\"\n ]\n }\n },\n \"assetTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"description\": \"One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n }\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n },\n \"countryCodes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"minLength\": 2,\n \"maxLength\": 2\n }\n },\n \"sources\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"APP\",\n \"API\",\n \"CANARY_TOKEN\",\n \"AUTO_DETECTION\",\n \"ASSET_MANAGEMENT\"\n ]\n }\n },\n \"threatActorIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"number\"\n }\n }\n },\n \"required\": [\n \"limit\"\n ]\n }\n },\n {\n \"name\": \"report_create\",\n \"procedure\": \"reportCreate\",\n \"method\": \"POST\",\n \"path\": \"/report/create\",\n \"pathParams\": [],\n \"title\": \"Create a report\",\n \"description\": \"Create a new report on ChainPatrol for a particular organization\",\n \"tags\": [\n \"report\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"organizationSlug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug used to identify the organization on ChainPatrol\"\n },\n \"discordGuildId\": {\n \"type\": \"string\",\n \"description\": \"Discord Guild (Server) ID linked to the organization on ChainPatrol\"\n },\n \"telegramGroupId\": {\n \"type\": \"string\",\n \"description\": \"Telegram Group ID linked to the organization on ChainPatrol\"\n },\n \"title\": {\n \"type\": \"string\",\n \"minLength\": 3,\n \"description\": \"Title of the report\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"Description of the report. Supports markdown\"\n },\n \"contactInfo\": {\n \"type\": \"string\",\n \"description\": \"Optional reporter contact info. If this value is a phone number, include a country code in E.164 format (e.g. +14155552671).\"\n },\n \"attachmentUrls\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"description\": \"URLs of images to attach to the report\"\n },\n \"externalSubmissionLink\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Link to the external submission (e.g. Telegram message link)\"\n },\n \"userAgent\": {\n \"type\": \"string\",\n \"description\": \"User agent string from the reporter's browser\"\n },\n \"referrer\": {\n \"type\": \"string\",\n \"description\": \"Referrer URL from the reporter's browser\"\n },\n \"assets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Asset content. If providing a phone number, include a country code in E.164 format (e.g. +14155552671).\"\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"UNKNOWN\",\n \"ALLOWED\",\n \"BLOCKED\"\n ],\n \"default\": \"BLOCKED\",\n \"description\": \"Proposed asset status (defaults to BLOCKED if not provided)\"\n },\n \"reporterConfidence\": {\n \"type\": \"string\",\n \"enum\": [\n \"HIGH\",\n \"LOW\"\n ],\n \"description\": \"Reporter confidence level (applies special handling for trusted reporters and superusers only)\"\n },\n \"brandSlug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Optional suggested brand slug for this proposed blocked asset\"\n },\n \"enrichments\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"description\": \"Enrichment type One of 39 values, e.g. content_and_metadata, browser_capture, ownership_and_registration, geolocation_and_ip, dns, tls, tcp, post. Full list: resource chainpatrol://enums/asset_scan_enrichment_type\"\n },\n \"source\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Enrichment source (e.g., extension)\"\n },\n \"output\": {\n \"type\": \"object\",\n \"additionalProperties\": {},\n \"description\": \"Enrichment output data\"\n }\n },\n \"required\": [\n \"type\",\n \"source\"\n ]\n },\n \"description\": \"Enrichments to attach to this asset\"\n }\n },\n \"required\": [\n \"content\"\n ]\n }\n },\n \"rawAssetsInput\": {\n \"type\": \"string\"\n },\n \"externalReporter\": {\n \"type\": \"object\",\n \"properties\": {\n \"avatarUrl\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"URL of the external avatar\"\n },\n \"platformIdentifier\": {\n \"type\": \"string\",\n \"description\": \"Unique identifier on the external platform\"\n },\n \"platform\": {\n \"type\": \"string\",\n \"description\": \"External platform's name\"\n },\n \"displayName\": {\n \"type\": \"string\",\n \"description\": \"User's public (mutable) display name\"\n }\n },\n \"required\": [\n \"platformIdentifier\",\n \"platform\",\n \"displayName\"\n ]\n }\n },\n \"required\": [\n \"assets\"\n ]\n }\n },\n {\n \"name\": \"report_search_external\",\n \"procedure\": \"reportSearchExternal\",\n \"method\": \"POST\",\n \"path\": \"/reports/search\",\n \"pathParams\": [],\n \"title\": \"Look up reports by asset content\",\n \"description\": \"Answers 'do reports already exist for these specific assets?'. Takes a batch of asset contents, normalizes each one the way ChainPatrol normalizes assets, and returns the reports covering them along with which of your assets each report matched. Use it to avoid filing a duplicate before calling `POST /report/create`. To browse or filter an organization's reports instead — by status, asset type, brand, date, review state — use `GET /organization/reports`, which returns the full report records with pagination.\",\n \"tags\": [\n \"reports\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"assetContents\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Asset contents to look up — URLs, handles, addresses. Each is normalized the way ChainPatrol normalizes assets, so `https://Bad.Site/` matches a report holding the canonical form.\"\n },\n \"slug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug. Optional for organization-scoped API keys, which resolve the organization from the key itself. Required when your credentials can reach more than one organization.\"\n },\n \"reportedByCustomer\": {\n \"type\": \"boolean\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 100,\n \"default\": 50,\n \"description\": \"Maximum number of reports to return, newest first. Defaults to 50, maximum 100. Compare with `totalCount` to tell whether the results were truncated.\"\n }\n },\n \"required\": [\n \"assetContents\"\n ]\n }\n },\n {\n \"name\": \"scan_results\",\n \"procedure\": \"scanResults\",\n \"method\": \"POST\",\n \"path\": \"/scan/result\",\n \"pathParams\": [],\n \"title\": \"Get scan results by scan ID\",\n \"description\": \"Get detailed scan results including enrichments, rules/checks results, and labels for a specific asset scan.\",\n \"tags\": [\n \"scan\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"scanId\": {\n \"type\": \"number\",\n \"description\": \"The ID of the asset scan to retrieve results for\"\n },\n \"workflowId\": {\n \"type\": \"string\",\n \"description\": \"Optional Temporal workflow ID to check if scan is still processing\"\n }\n },\n \"required\": [\n \"scanId\"\n ]\n }\n },\n {\n \"name\": \"takedowns_list\",\n \"procedure\": \"takedownsList\",\n \"method\": \"POST\",\n \"path\": \"/takedowns/list\",\n \"pathParams\": [],\n \"title\": \"List takedowns\",\n \"description\": \"List takedowns for an organization. Authenticate with an API key (the org is derived from the key) or with a user session (pass `organizationSlug` in the request body).\",\n \"tags\": [\n \"takedowns\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"organizationSlug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug. Required when authenticating with a user session (Bearer token); ignored when using an API key (org is derived from the key).\"\n },\n \"query\": {\n \"type\": \"string\",\n \"description\": \"Search query to filter takedowns by asset content\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"description\": \"The start date to list takedowns from. This should be in the format `YYYY-MM-DD` and is inclusive.\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"description\": \"The end date to list takedowns to. This should be in the format `YYYY-MM-DD` and is inclusive.\"\n },\n \"assetType\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"description\": \"One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n },\n \"description\": \"Filter by asset types\"\n },\n \"takedownStatus\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"TODO\",\n \"IN_PROGRESS\",\n \"COMPLETED\",\n \"CANCELLED\",\n \"PENDING_RETRACTION\",\n \"RETRACTION_SENT\",\n \"RETRACTED\",\n \"PENDING_INPUT\",\n \"PENDING_EVIDENCE\"\n ]\n },\n \"description\": \"Filter by takedown status\"\n },\n \"livenessStatus\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"UNKNOWN\",\n \"ALIVE\",\n \"DEAD\"\n ]\n },\n \"description\": \"Filter by liveness status\"\n },\n \"brandIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"description\": \"Filter by brand IDs\"\n },\n \"assigneeIds\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"integer\",\n \"exclusiveMinimum\": 0\n },\n \"description\": \"Filter by takedown assignee user IDs\"\n },\n \"startedAtStartDate\": {\n \"type\": \"string\",\n \"description\": \"Inclusive start of the `takedown started at` date range, in YYYY-MM-DD or ISO 8601. A takedown's started-at is the earliest IN_PROGRESS status-change event.\"\n },\n \"startedAtEndDate\": {\n \"type\": \"string\",\n \"description\": \"Inclusive end of the `takedown started at` date range. Defaults to the current time when `startedAtStartDate` is provided alone.\"\n },\n \"hideAutomatedTakedowns\": {\n \"type\": \"boolean\",\n \"description\": \"Hide takedowns whose target asset type (or content) is handled by the automated platform-takedown pipeline (e.g. Telegram, Medium, *.webflow.io).\"\n },\n \"hideAutomatedLivenessChecks\": {\n \"type\": \"boolean\",\n \"description\": \"Hide takedowns whose asset type (or content) is checked for liveness automatically (e.g. Twitter, Bluesky, *.gitbook.io).\"\n },\n \"sorting\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"enum\": [\n \"updatedAt\",\n \"createdAt\",\n \"takedownStatus\",\n \"takedownUpdatedAt\",\n \"assigneeId\",\n \"brandId\"\n ],\n \"description\": \"Field to sort by\"\n },\n \"direction\": {\n \"type\": \"string\",\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"description\": \"Sort direction\"\n }\n },\n \"required\": [\n \"key\",\n \"direction\"\n ]\n },\n \"description\": \"Sorting configuration\"\n },\n \"per_page\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 100,\n \"default\": 10,\n \"description\": \"The number of takedowns to return per page\"\n },\n \"next_page\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"not\": {}\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Cursor for fetching the next page of results\"\n }\n },\n \"description\": \"List takedowns request body\\n\\nDefaults to getting all takedowns in the last 30 days.\\n\\nYou can also choose a `startDate` and `endDate` for the range of takedown updates, most \\ntimestamp formats should work, we use [Luxon](https://moment.github.io/luxon/#/parsing) \\nfor parsing the dates.\"\n }\n },\n {\n \"name\": \"threats_list\",\n \"procedure\": \"threatsList\",\n \"method\": \"POST\",\n \"path\": \"/threats/list\",\n \"pathParams\": [],\n \"title\": \"List threats\",\n \"description\": \"List threats for an organization using API key authentication\",\n \"tags\": [\n \"threats\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"description\": \"Search query to filter threats by content\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"description\": \"The start date to list threats from. This should be in the format `YYYY-MM-DD` and is inclusive.\"\n },\n \"endDate\": {\n \"type\": \"string\",\n \"description\": \"The end date to list threats to. This should be in the format `YYYY-MM-DD` and is inclusive.\"\n },\n \"assetType\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"description\": \"One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n },\n \"description\": \"Filter by asset types\"\n },\n \"sorting\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"key\": {\n \"type\": \"string\",\n \"description\": \"Field to sort by\"\n },\n \"direction\": {\n \"type\": \"string\",\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"description\": \"Sort direction\"\n }\n },\n \"required\": [\n \"key\",\n \"direction\"\n ]\n },\n \"description\": \"Sorting configuration\"\n },\n \"per_page\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"maximum\": 100,\n \"default\": 10,\n \"description\": \"The number of threats to return per page\"\n },\n \"next_page\": {\n \"anyOf\": [\n {\n \"anyOf\": [\n {\n \"not\": {}\n },\n {\n \"type\": \"string\"\n }\n ]\n },\n {\n \"type\": \"null\"\n }\n ],\n \"description\": \"Cursor for fetching the next page of results\"\n }\n },\n \"description\": \"List threats request body\\n\\nDefaults to getting all threats in the last 1 day.\\n\\nYou can also choose a `startDate` and `endDate` for the range of threat updates, most \\ntimestamp formats should work, we use [Luxon](https://moment.github.io/luxon/#/parsing) \\nfor parsing the dates.\"\n }\n },\n {\n \"name\": \"user_me\",\n \"procedure\": \"userMe\",\n \"method\": \"POST\",\n \"path\": \"/user/me\",\n \"pathParams\": [],\n \"title\": \"Get current user\",\n \"description\": \"Get details of currently logged in user\",\n \"tags\": [\n \"user\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"acceptsNoInput\": true,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n {\n \"name\": \"user_me_update\",\n \"procedure\": \"userMeUpdate\",\n \"method\": \"POST\",\n \"path\": \"/user/me/update\",\n \"pathParams\": [],\n \"title\": \"Update current user\",\n \"description\": \"Update the currently authenticated user's profile and settings\",\n \"tags\": [\n \"user\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"avatarUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"protectionConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"linkMonitoring\": {\n \"type\": \"boolean\"\n },\n \"socialMediaScanning\": {\n \"type\": \"boolean\"\n },\n \"historyScanning\": {\n \"type\": \"boolean\"\n }\n }\n }\n }\n }\n },\n {\n \"name\": \"user_org_get\",\n \"procedure\": \"userOrgGet\",\n \"method\": \"GET\",\n \"path\": \"/user/orgs/{slug}\",\n \"pathParams\": [\n \"slug\"\n ],\n \"title\": \"Get an organization the caller can access\",\n \"description\": \"Fetch a single organization by slug. Returns the same per-organization shape as `/user/orgs` (id, name, slug, avatarUrl, subscriptionStatus, services flags, integration connection status, `obligatoryAdminApproval`, `legalDocuments`, and `trademarkRegistrations`). The `integrations` object shows which third-party integrations are connected: `slack`, `discord`, `vercel`, `intercom`, and `moderation` are booleans; `telegram` is `{ connected, groupCount }`. The `legalDocuments` object reports whether the org's Letter of Authorization and Power of Attorney are on file along with a direct `fileUrl` to view each when present. `trademarkRegistrations` returns every org-level trademark on file with its issuing office, registration number, and (when uploaded) a `certificateFileUrl` link to the certificate PDF — an empty array means no trademarks are recorded for the org. Access requires the caller to have permission for the org: org-scoped API keys must match the slug; user sessions and user-scoped API keys need an active OrganizationMembership unless the caller is staff. Soft-deleted organizations are excluded.\",\n \"tags\": [\n \"user\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"slug\": {\n \"type\": \"string\",\n \"minLength\": 1,\n \"description\": \"Organization slug to fetch (must be one the caller can access)\"\n }\n },\n \"required\": [\n \"slug\"\n ],\n \"description\": \"Get a single organization by slug.\\n\\nReturns the same per-organization shape as `/user/orgs`. Access is gated by\\nthe same rules: org-scoped API keys must match the slug; user sessions (and\\nuser-scoped API keys) need an active OrganizationMembership unless the user\\nhas a staff role.\"\n }\n },\n {\n \"name\": \"user_orgs\",\n \"procedure\": \"userOrgs\",\n \"method\": \"POST\",\n \"path\": \"/user/orgs\",\n \"pathParams\": [],\n \"title\": \"Get user organizations\",\n \"description\": \"List organizations accessible to the current user along with each org's subscription status, which services (reporting, reviewing, protection, takedowns, detection, dark web monitoring) are enabled, integration connection status (Slack, Discord, Telegram, Vercel, Intercom, Moderation API), whether Obligatory Organization Admin Approval is enabled, the org-level Letter of Authorization / Power of Attorney attachments, and every org-level trademark registration on file. Each service exposes an `active` flag; **only `takedowns` additionally exposes `automated`**. The `integrations` object shows which third-party integrations are connected: `slack`, `discord`, `vercel`, `intercom`, and `moderation` are booleans; `telegram` is `{ connected, groupCount }` since an org can have multiple Telegram groups. The `legalDocuments` block has `letterOfAuthorization` and `powerOfAttorney` entries, each with `{ present, fileName, fileUrl }`. `trademarkRegistrations` is the full list of org-level trademarks with their issuing office, registration number, and (when uploaded) a `certificateFileUrl` link — use it to identify which customers have or have not added trademarks. Optional `subscriptionStatus`, `services`, and `obligatoryAdminApproval` filters narrow the result server-side. `subscriptionStatus` defaults to the live set (PROSPECT/POC/ACTIVE/INTEGRATION); pass INACTIVE explicitly to include churned organizations.\",\n \"tags\": [\n \"user\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"default\": \"\"\n },\n \"subscriptionStatus\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"PROSPECT\",\n \"POC\",\n \"ACTIVE\",\n \"INTEGRATION\",\n \"INACTIVE\"\n ]\n },\n \"minItems\": 1,\n \"description\": \"Statuses to include. Defaults to the live set (PROSPECT/POC/ACTIVE/INTEGRATION); pass INACTIVE explicitly to see churned organizations.\"\n },\n \"services\": {\n \"type\": \"object\",\n \"properties\": {\n \"reporting\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"reviewing\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"protection\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"takedowns\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n },\n \"automated\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"detection\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"darkWebMonitoring\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n }\n }\n },\n \"obligatoryAdminApproval\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n },\n \"assetTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"description\": \"One of 92 values, e.g. URL, PAGE, ADDRESS, DISCORD, LINKEDIN, TWITTER, FACEBOOK, YOUTUBE. Full list: resource chainpatrol://enums/asset_type\"\n },\n \"minItems\": 1\n }\n }\n },\n \"pendingServiceApproval\": {\n \"type\": \"object\",\n \"properties\": {\n \"active\": {\n \"type\": \"boolean\"\n },\n \"services\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"protection\",\n \"takedowns\"\n ]\n },\n \"minItems\": 1\n }\n }\n }\n }\n }\n },\n {\n \"name\": \"validate\",\n \"procedure\": \"validate\",\n \"method\": \"GET\",\n \"path\": \"/validate\",\n \"pathParams\": [],\n \"title\": \"Validate API key\",\n \"description\": \"Validates if the provided API key is valid for Zapier integration\",\n \"tags\": [\n \"auth\"\n ],\n \"readOnly\": true,\n \"deprecated\": false,\n \"acceptsNoInput\": true,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n {\n \"name\": \"webhook_config\",\n \"procedure\": \"webhookConfig\",\n \"method\": \"POST\",\n \"path\": \"/webhook/config\",\n \"pathParams\": [],\n \"title\": \"Configure webhook for organization\",\n \"description\": \"Create and configure a webhook for an organization to receive real-time notifications for asset status updates and threat detections. Requires a valid API key with access to the specified organization.\",\n \"tags\": [\n \"webhook\"\n ],\n \"readOnly\": false,\n \"deprecated\": false,\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"organizationSlug\": {\n \"type\": \"string\",\n \"description\": \"Organization slug to configure webhooks for\"\n },\n \"subscriberUrl\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"HTTPS URL where webhook events will be delivered\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"Optional description for the webhook\"\n },\n \"active\": {\n \"type\": \"boolean\",\n \"default\": true,\n \"description\": \"Whether the webhook should be active\"\n },\n \"triggers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"enum\": [\n \"DEBUG_TEST\",\n \"ASSET_STATUS_UPDATED\",\n \"ORGANIZATION_THREAT_DETECTION_ADDED\",\n \"ASSET_STATUS_ESCALATED\"\n ]\n },\n \"minItems\": 1,\n \"description\": \"Array of webhook events to subscribe to\"\n }\n },\n \"required\": [\n \"organizationSlug\",\n \"subscriberUrl\",\n \"triggers\"\n ]\n }\n }\n ],\n \"excluded\": [\n {\n \"path\": \"/cloudflare/webhook\",\n \"method\": \"POST\",\n \"reason\": \"Inbound webhook receiver — Cloudflare calls this, users never do. Exposing it would let an agent forge takedown-status callbacks.\"\n },\n {\n \"path\": \"/github/webhook\",\n \"method\": \"POST\",\n \"reason\": \"Inbound webhook receiver — GitHub calls this, users never do. Exposing it would let an agent forge repository events.\"\n },\n {\n \"path\": \"/internal/asset/list/eth-phishing-detect\",\n \"method\": \"GET\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/getAutoDashboardTelegramGroups\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/getDiscordConfig\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/getDiscordGuildStatus\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/getIntercomOrganization\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/getOrganizationMetrics\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/getSlackOrganizations\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/getTakedown\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/getTelegramOrganization\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/notion/create-crm-page\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/reports/search\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/subscribeToTakedown\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/telegram/group\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/telegram/user\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/internal/updateDiscordConfig\",\n \"method\": \"POST\",\n \"reason\": \"Internal endpoint — ChainPatrol-owned plumbing (Slack/Telegram bots, CRM sync) rather than public API, and out of scope for the MCP surface by design.\"\n },\n {\n \"path\": \"/notion/webhook\",\n \"method\": \"POST\",\n \"reason\": \"Inbound webhook receiver — Notion calls this, users never do. Exposing it would let an agent forge CRM automation events.\"\n }\n ],\n \"enums\": [\n {\n \"name\": \"asset_scan_enrichment_type\",\n \"values\": [\n \"content_and_metadata\",\n \"browser_capture\",\n \"ownership_and_registration\",\n \"geolocation_and_ip\",\n \"dns\",\n \"tls\",\n \"tcp\",\n \"post\",\n \"profile\",\n \"twitter_followers\",\n \"cast\",\n \"farcaster_profile\",\n \"channel\",\n \"miniapp\",\n \"telegram_profile\",\n \"instagram_profile\",\n \"facebook_profile\",\n \"youtube_video\",\n \"youtube_channel\",\n \"apple_app_store_listing\",\n \"google_play_store_listing\",\n \"mozilla_addon\",\n \"reddit_subreddit\",\n \"email_validation\",\n \"phone_lookup\",\n \"bilibili_video\",\n \"bilibili_profile\",\n \"dailymotion_video\",\n \"vimeo_video\",\n \"vimeo_profile\",\n \"stackblitz_page\",\n \"leetcode_page\",\n \"npm_package\",\n \"pypi_package\",\n \"rust_package\",\n \"linkedin_profile\",\n \"meta_ad\",\n \"google_ad\",\n \"contract_deployer\"\n ],\n \"usedBy\": [\n \"report_create.type\"\n ]\n },\n {\n \"name\": \"asset_type\",\n \"values\": [\n \"URL\",\n \"PAGE\",\n \"ADDRESS\",\n \"DISCORD\",\n \"LINKEDIN\",\n \"TWITTER\",\n \"FACEBOOK\",\n \"YOUTUBE\",\n \"REDDIT\",\n \"TELEGRAM\",\n \"GOOGLE_APP_STORE\",\n \"APPLE_APP_STORE\",\n \"AMAZON_APP_STORE\",\n \"MICROSOFT_APP_STORE\",\n \"TIKTOK\",\n \"INSTAGRAM\",\n \"THREADS\",\n \"MEDIUM\",\n \"CHROME_WEB_STORE\",\n \"MOZILLA_ADDONS\",\n \"OPERA_ADDONS\",\n \"EMAIL\",\n \"PATREON\",\n \"OPENSEA\",\n \"FARCASTER\",\n \"IPFS\",\n \"GOOGLE_FORM\",\n \"WHATSAPP\",\n \"DISCORD_USER\",\n \"QUORA\",\n \"GITHUB\",\n \"TEACHABLE\",\n \"SUBSTACK\",\n \"DEBANK\",\n \"TAWK_TO\",\n \"JOTFORM\",\n \"PRIMAL\",\n \"BLUESKY\",\n \"SNAPCHAT\",\n \"DESO\",\n \"PINTEREST\",\n \"FLICKR\",\n \"GALXE\",\n \"VELOG\",\n \"NPM\",\n \"PYPI\",\n \"HEX\",\n \"DOCKER_HUB\",\n \"VOCAL_MEDIA\",\n \"TECKFINE\",\n \"TENDERLY\",\n \"HACKMD\",\n \"ETSY\",\n \"ZAZZLE\",\n \"BASENAME\",\n \"BILIBILI_TV\",\n \"VIMEO\",\n \"DAILYMOTION\",\n \"PHONE_NUMBER\",\n \"SLACK\",\n \"CALENDLY\",\n \"NGROK\",\n \"RARIBLE\",\n \"RUST_PACKAGE\",\n \"FLATHUB\",\n \"VIDLII\",\n \"VEVIOZ\",\n \"ISSUU\",\n \"SOUNDCLOUD\",\n \"ZAPPER\",\n \"REDNOTE\",\n \"SAMSUNG_APP_STORE\",\n \"HUAWEI_APP_STORE\",\n \"XIAOMI_APP_STORE\",\n \"TENCENT_APP_STORE\",\n \"OPPO_APP_STORE\",\n \"VIVO_APP_STORE\",\n \"F_DROID\",\n \"GOOGLE_AD\",\n \"BING_AD\",\n \"TWITCH\",\n \"BEHANCE\",\n \"ZORA\",\n \"META_AD\",\n \"SIGNAL\",\n \"DEVIANTART\",\n \"BANDCAMP\",\n \"ARCHIVE_ORG\",\n \"FIVE_HUNDRED_PX\",\n \"LUMA\",\n \"SMARTMONEYMATCH\",\n \"APK_GOLD\"\n ],\n \"usedBy\": [\n \"asset_changelog.type\",\n \"asset_list.type\",\n \"detection_list.value\",\n \"get_organization_reports.assetTypes\",\n \"metrics_takedown_time_trend.assetTypes\",\n \"organization_assets_list.type\",\n \"organization_reports_list.assetTypes\",\n \"takedowns_list.assetType\",\n \"threats_list.assetType\",\n \"user_orgs.assetTypes\"\n ]\n },\n {\n \"name\": \"source\",\n \"values\": [\n \"meta_ads_search\",\n \"telegram_channels_search\",\n \"telegram_user_search\",\n \"telegram_channels_search_vetric\",\n \"telegram_user_search_vetric\",\n \"facebook_page_search_vetric\",\n \"facebook_user_search_vetric\",\n \"instagram_account_search_vetric\",\n \"twitter_search_vetric\",\n \"linkedin_people_search_vetric\",\n \"linkedin_company_search_vetric\",\n \"meta_ads_search_vetric\",\n \"tik_tok_video_search\",\n \"tik_tok_user_search\",\n \"tik_tok_user_search_vetric\",\n \"tik_tok_video_search_vetric\",\n \"blocklist\",\n \"apple_app_store\",\n \"google_ads_search\",\n \"mozilla_addon_search\",\n \"reddit_subreddit_search\",\n \"asset_check\",\n \"twitter_post_search\",\n \"medium_tag_rss\",\n \"twitter_search\",\n \"yahoo_search\",\n \"duck_duck_go_search\",\n \"bing_search\",\n \"guestbook\",\n \"certstream\",\n \"external\",\n \"google_search\",\n \"dns_twist\",\n \"twitter\",\n \"twitter_username_monitor\",\n \"urlscan\",\n \"urlscan_hostname_search\",\n \"youtube_search\",\n \"google_play_search\",\n \"dexscreener_search\",\n \"blocked_ip_scan\",\n \"blocked_bilibili_suggested\",\n \"grok_post_search\",\n \"grok_user_search\",\n \"google_lens_image_search\",\n \"yandex_search\",\n \"yandex_image_search\",\n \"linkedin_employee_detection\",\n \"linkedin_post_search\",\n \"linkedin_company_search\",\n \"bing_ads_search\",\n \"tik_tok_ads_search\",\n \"dnsdb\",\n \"daily_motion_search\",\n \"watchlist\"\n ],\n \"usedBy\": [\n \"detection_configs_create.source\",\n \"detection_list.value\"\n ]\n }\n ],\n \"glossaries\": [\n {\n \"uri\": \"chainpatrol://glossary/proposal-labels\",\n \"title\": \"organization_proposals_review.label\",\n \"text\": \"Why the asset is being blocked. Required when `decision` is `APPROVE`, ignored otherwise. One of: `Brand Impersonation`, `Employee Impersonation`, `Fake Employee`, `Targeting Org Users`, `General Phishing`, `C2 Server`, `False Positive`, `Organization Member Impersonation`, `Targeting Organization`.\\n\\n- `Brand Impersonation` — The asset is directly using the Brand's name, logo, or other trademarks\\n- `Employee Impersonation` — The asset is impersonating a specific employee of the organization\\n- `Fake Employee` — The asset claims to work at the company but is not directly impersonating a specific person\\n- `Targeting Org Users` — A scam the org wants taken down that falls outside direct impersonation\\n- `General Phishing` — This asset is trying to steal user funds\\n- `C2 Server` — Command and Control server providing backend infrastructure for phishing operations\\n- `False Positive` — This asset was incorrectly flagged and should be allowed\\n- `Organization Member Impersonation` — The asset is impersonating a member or employee of the organization\\n- `Targeting Organization` — A scam the org wants taken down that falls outside direct impersonation\"\n },\n {\n \"uri\": \"chainpatrol://glossary/proposal-reject-reasons\",\n \"title\": \"organization_proposals_review.rejectReason\",\n \"text\": \"Why the proposal is being rejected. Required when `decision` is `REJECT`, ignored otherwise. These are the same reasons the Review page offers, and they feed ChainPatrol's detection-tuning breakdown — pick the closest one rather than relying on `note`.\"\n },\n {\n \"uri\": \"chainpatrol://glossary/proposal-watchlist-reasons\",\n \"title\": \"organization_proposals_review.watchlistReason\",\n \"text\": \"Why the asset is being parked. Required when `decision` is `WATCHLIST`, ignored otherwise. Use `OTHER` for anything not covered, in which case `note` becomes required and is treated as the reason. Note that the watchlist only covers asset types that can be re-checked for revival (URL, PAGE, EMAIL, and the social platforms); watchlisting any other type is rejected, so reject the proposal instead.\"\n }\n ]\n}\n","import type { ToolDefinition } from \"./manifest\";\nimport { ToolInvocationError, type ToolInvoker } from \"./invoker\";\n\nconst DEFAULT_BASE_URL = \"https://app.chainpatrol.io\";\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\n/** How the caller authenticates: an org/user API key, or a bearer token. */\nexport type ApiCredential =\n | { kind: \"api-key\"; value: string }\n | { kind: \"bearer\"; value: string };\n\nexport type CredentialProvider = () => ApiCredential | Promise<ApiCredential>;\n\nexport interface HttpInvokerOptions {\n /** Defaults to `https://app.chainpatrol.io`. */\n baseUrl?: string;\n credential: CredentialProvider;\n timeoutMs?: number;\n fetchImpl?: typeof fetch;\n}\n\nfunction trimTrailingSlashes(url: string): string {\n return url.replace(/\\/+$/, \"\");\n}\n\n/**\n * Serializes one value into query-string form.\n *\n * The REST layer makes GET inputs coercible, and its `queryBoolean` /\n * `queryArray` helpers accept `\"true\"`/`\"false\"` and repeated keys. Objects have\n * no query representation, so they go as JSON — matching what the SDK does for\n * the one endpoint that takes a nested filter object on a GET.\n */\nfunction appendQueryValue(search: URLSearchParams, key: string, value: unknown): void {\n if (value === undefined || value === null) return;\n\n if (Array.isArray(value)) {\n // Repeated keys: `?ids=12&ids=34`.\n for (const item of value) appendQueryValue(search, key, item);\n return;\n }\n\n if (typeof value === \"object\") {\n search.append(key, JSON.stringify(value));\n return;\n }\n\n const serialized = scalarToString(value);\n if (serialized === undefined || serialized === \"\") return;\n search.append(key, serialized);\n}\n\n/**\n * Renders a JSON scalar as a string. Returns `undefined` for anything with no\n * meaningful text form, so a stray value becomes an omitted parameter rather\n * than the literal `\"[object Object]\"`.\n */\nfunction scalarToString(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return Number.isNaN(value) ? undefined : value.toString();\n }\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n return undefined;\n}\n\n/**\n * Splits tool arguments into the path substitutions and the remaining payload.\n * Path parameters are named in the manifest, so this needs no schema lookup.\n */\nfunction applyPathParams(\n tool: ToolDefinition,\n args: Record<string, unknown>,\n): { path: string; rest: Record<string, unknown> } {\n const rest: Record<string, unknown> = { ...args };\n let path = tool.path;\n\n for (const name of tool.pathParams) {\n const value = scalarToString(rest[name]);\n if (value === undefined || value === \"\") {\n throw new ToolInvocationError(\n `${tool.name}: \"${name}\" is required and must be a string or number — it identifies the resource in the request path.`,\n );\n }\n path = path.replace(`{${name}}`, encodeURIComponent(value));\n delete rest[name];\n }\n\n return { path, rest };\n}\n\n/** True for methods whose input travels as a JSON body rather than a query. */\nfunction acceptsBody(method: ToolDefinition[\"method\"]): boolean {\n return method === \"POST\" || method === \"PATCH\" || method === \"PUT\";\n}\n\n/**\n * Dispatches tool calls to the public REST API.\n *\n * Used by the local (stdio) server, which has no in-process access to the\n * router. It talks to exactly the endpoints a customer's own script would, with\n * the credentials the CLI already stores.\n */\nexport function createHttpInvoker(options: HttpInvokerOptions): ToolInvoker {\n const baseUrl = trimTrailingSlashes(options.baseUrl ?? DEFAULT_BASE_URL);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const doFetch = options.fetchImpl ?? fetch;\n\n return async (tool, args) => {\n const credential = await options.credential();\n const headers: Record<string, string> = {\n accept: \"application/json\",\n \"user-agent\": \"chainpatrol-mcp\",\n };\n if (credential.kind === \"api-key\") {\n headers[\"x-api-key\"] = credential.value;\n } else {\n headers[\"authorization\"] = `Bearer ${credential.value}`;\n }\n\n const { path, rest } = applyPathParams(tool, args);\n let url = `${baseUrl}/api/v2${path}`;\n let body: string | undefined;\n\n if (acceptsBody(tool.method)) {\n headers[\"content-type\"] = \"application/json\";\n body = JSON.stringify(rest);\n } else {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(rest)) {\n appendQueryValue(search, key, value);\n }\n const queryString = search.toString();\n if (queryString) url = `${url}?${queryString}`;\n }\n\n let response: Response;\n try {\n response = await doFetch(url, {\n method: tool.method,\n headers,\n body,\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n if (error instanceof DOMException && error.name === \"TimeoutError\") {\n throw new ToolInvocationError(\n `${tool.name} timed out after ${timeoutMs}ms. Narrow the date range or filters and try again.`,\n );\n }\n // Every non-timeout throw from `doFetch` lands here — DNS, TLS, a bad\n // `baseUrl`, a bug in the fetch path. Over stdio this message is all a\n // person debugging ever sees, so keep the original reachable.\n throw new ToolInvocationError(\n `Could not reach ChainPatrol at ${baseUrl}. Check network access and the configured API URL.`,\n { cause: error },\n );\n }\n\n const text = await response.text();\n let parsed: unknown;\n try {\n parsed = text.length > 0 ? JSON.parse(text) : null;\n } catch {\n parsed = text;\n }\n\n if (!response.ok) {\n // The API's error messages are written to be actionable — a rejected enum\n // value comes back naming every accepted one — so they are passed\n // through rather than replaced with something generic.\n const message =\n (parsed as { message?: string } | null)?.message ??\n `${tool.name} failed with HTTP ${response.status}.`;\n throw new ToolInvocationError(message, {\n status: response.status,\n details: parsed,\n });\n }\n\n return parsed;\n };\n}\n","/**\n * The one knob that narrows the exposed tool surface.\n *\n * MCP clients configure servers by command plus environment, not by argv they\n * can always control, so the variable is the interface that has to work — both\n * entry points (`chainpatrol-mcp` and `chainpatrol mcp`) read it from here so\n * there is one parser and one documented name.\n *\n * It trades breadth for context budget and is not access control: the API\n * still authorizes every call against the credential in use.\n */\nexport const TOOLS_ENV_VAR = \"CHAINPATROL_MCP_TOOLS\";\n\n/** The environment shape this reads, so a test can pass one in. */\nexport type ToolsEnvironment = Record<string, string | undefined>;\n\n/**\n * Reads `CHAINPATROL_MCP_TOOLS` as a list of tool names.\n *\n * Returns `undefined` — meaning \"expose everything\" — for an unset, blank, or\n * all-separator value, so a misconfigured variable widens the surface rather\n * than silently serving no tools at all.\n */\nexport function toolsFromEnvironment(\n env: ToolsEnvironment = process.env,\n): string[] | undefined {\n const raw = env[TOOLS_ENV_VAR]?.trim();\n if (!raw) return undefined;\n\n const names = raw\n .split(\",\")\n .map((name) => name.trim())\n .filter(Boolean);\n\n return names.length > 0 ? names : undefined;\n}\n","/**\n * Package version, reported to MCP clients in the initialize handshake.\n * Kept as a literal so the bundled server needs no filesystem lookup; the\n * `version.unit.test.ts` check keeps it in step with package.json.\n */\nexport const PACKAGE_VERSION = \"1.10.0\";\n"],"mappings":"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IACP;AAAA,MACE,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAU;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAU;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAc;AAAA,IACZ;AAAA,MACE,KAAO;AAAA,MACP,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,KAAO;AAAA,MACP,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,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","names":["manifest"]}