@mambalabsdev/mcp-ai-tooling-detector 1.3.1 → 1.4.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.
package/README.md CHANGED
@@ -29,6 +29,7 @@ The tier has four levels and each one needs its own class of evidence:
29
29
  | `deployed` | AI tooling is running on the site | An AI-native vendor, a direct inference endpoint, or an AI-capable platform backed by AI copy |
30
30
  | `declared` | The company says AI, nothing observable | A validated llms.txt, AI crawler rules in robots.txt, or weighted marketing copy |
31
31
  | `none` | No signal fired | Nothing |
32
+ | `max_charge_usd` | number | Optional cost cap in USD for this run. The actor stops before an item that could take its charges past this amount. |
32
33
 
33
34
  A domain sitting behind a bot challenge comes back with `blocked: true` at low confidence rather than as a confident no, so a challenged site is never mistaken for a company with no AI.
34
35
 
@@ -82,10 +83,19 @@ Calls consume Apify credits, billed per domain analyzed. Free Apify plans get 15
82
83
  | `request_timeout_ms` | integer | no | Per-request timeout in milliseconds, 3000 to 20000. Default 9000. |
83
84
  | `batchSize` | integer | no | Batch mode only: how many domains the actor analyzes at once, 1 to 10. Default 5. |
84
85
 
85
- The tool is read-only and idempotent. It never writes anything.
86
+ The tool reads public data and writes nothing, but every call starts a paid Apify run, so it is not marked read only.
86
87
 
87
88
  The tool starts the actor run and polls it to a finished status, so a long run is not cut off at 300 seconds. The run is allowed 1,800 seconds. If it is still going two minutes after that, the call stops waiting and returns the run ID with a link to it in the Apify Console, where the results land when it finishes. A run that does not succeed comes back as an error with its run ID and status.
88
89
 
90
+ ## Pricing
91
+
92
+ Price per event on the Apify FREE plan, from the live pricing record; paid Apify plans pay less per event.
93
+
94
+ | Event | Price (USD) |
95
+ | --- | --- |
96
+ | Actor start (`actor-start`) | 0.00005 |
97
+ | Domain analyzed (`domain-analyzed`) | 0.003 |
98
+
89
99
  ## Full actor documentation
90
100
 
91
101
  Input reference, the complete output field list, pricing tiers, error handling, and the measured limitations are on the actor's Apify Store page:
package/build/index.js CHANGED
@@ -175,12 +175,13 @@ server.registerTool("detect_ai_tooling", {
175
175
  description: "Given a company domain, determine how far that company has actually gone with AI. Returns an ai_maturity tier of none, declared (says AI but nothing observable is running), deployed (AI tooling is live on the site), or commercialized (the pricing page charges for AI via credits, tokens, an add-on, an AI-named plan, or a per-outcome price). Also returns the detected AI vendors and categories, validated llms.txt status, robots.txt AI-crawler policy, and the quotable evidence strings behind the verdict. A domain behind a bot challenge comes back with blocked=true at low confidence rather than as a false negative. Public data only, no login. Returns flat Clay-ready JSON. Read-only; requires an APIFY_TOKEN and consumes Apify credits per domain analyzed.",
176
176
  annotations: {
177
177
  title: "Detect AI Tooling",
178
- readOnlyHint: true,
178
+ readOnlyHint: false,
179
179
  destructiveHint: false,
180
180
  idempotentHint: true,
181
181
  openWorldHint: true,
182
182
  },
183
183
  inputSchema: {
184
+ max_charge_usd: z.number().min(0).optional().describe("Optional. The run stops before any charge that would take this run's total past this amount in USD, and every row already charged is kept. Leave it empty to rely only on the maximum cost per run set in Apify, which the actor also honors."),
184
185
  domain: z
185
186
  .string()
186
187
  .optional()
@@ -216,7 +217,7 @@ server.registerTool("detect_ai_tooling", {
216
217
  .optional()
217
218
  .describe("Batch mode only: how many domains the actor analyzes at once. 1 to 10. Default: 5."),
218
219
  },
219
- }, async ({ domain, domains, vendors, check_pricing, skipCache, request_timeout_ms, batchSize }) => {
220
+ }, async ({ domain, domains, vendors, check_pricing, skipCache, request_timeout_ms, batchSize, max_charge_usd }) => {
220
221
  const hasSingle = domain !== undefined && domain !== "";
221
222
  const hasBatch = Array.isArray(domains) && domains.length > 0;
222
223
  if (!hasSingle && !hasBatch) {
@@ -226,6 +227,7 @@ server.registerTool("detect_ai_tooling", {
226
227
  };
227
228
  }
228
229
  return runActor("EwkHhmqiuJgRoVEbE", "AI Tooling Detector", compact({
230
+ max_charge_usd,
229
231
  domain: hasBatch ? undefined : domain,
230
232
  domains: hasBatch ? domains : undefined,
231
233
  vendors,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mambalabsdev/mcp-ai-tooling-detector",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "MCP server for the Mamba Labs AI Tooling Detector actor on Apify. Give it a company domain and it returns whether the company only talks about AI, actually deploys AI tooling on its site, or charges for AI, with the evidence, as Clay-ready JSON.",
5
5
  "type": "module",
6
6
  "bin": {