Skip to main content
Glama

Run a paid data task

run_capability

Run one paid data capability (company data, people and contact data and the like) through Ahel's provider execution: it is quoted, the exact price is reserved from the workspace balance, and the run starts. Give id, a task id or tool id from capability_search: it runs only through the v2 capability Ahel's task map binds to it, and an item that is not ready is refused with its exact reason before anything is quoted. It then waits up to wait_seconds (default 20, at most 50; 0 answers at once): when the run finishes in that time, this same answer has its state, exact cost and rows, and generated images and audio as links; otherwise it answers the execution id, and capability_run_status reads the run. An answer with rows also has results_page and csv_url: give the person those links instead of writing the rows out again. Data collection only: a capability that writes or has a side effect is refused. Ahel picks the provider unless endpoint_ids pins one; exclude_endpoint_ids leaves providers out. Give max_cost_usd to hold the price: a run that would cost more is refused with nothing run or charged. Give idempotency_key so a retry after a lost answer is safe: the same key answers the same run, with no new charge. Give tag (such as a customer name) to see usage and cost by tag in Activity. A list: for people.email.find or companies.register.search or companies.emails.from_website, give rows (objects) or rows_text (paste up to 100 rows as text) instead of arguments: without confirm it answers the list's quote and runs nothing; with confirm true it runs every row once and answers the receipt (found, not found, failed, the exact total, the rows and a CSV link) and its run_id; run_id continues a run whose rows were still going. NOT for: the team's own tools, which is my_tools.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "run_capability"
  }
}

Input Schema

NameRequiredDescriptionDefault
idNoA task id or tool id from capability_search or capability_inspect.
tagNoOptional: a label for this run, such as the customer or project it is for: 1 to 64 lowercase letters, digits, dots, dashes or underscores. Activity shows runs and cost by tag. It stays in Ahel and is never sent to a provider.
rowsNoA list for people.email.find or companies.register.search or companies.emails.from_website: 1 to 100 rows, each run once as its own run with its own exact cost. One object per row, such as {"name": "Patrick Collison", "domain": "stripe.com"} or {"name": "Wise", "country": "GB"}.
run_idNoWith id: the run_id a list's receipt answered, to read its rows still running and start the rest. Rows already run are never run twice.
confirmNoWith rows or rows_text: true runs the list once the person agrees to its quote. Left out, the answer is the quote and nothing runs. The same list sent again the same UTC day answers the first run's receipt and neither runs nor charges again; a new idempotency_key runs it again.
argumentsNoThe capability's inputs, by name. Required unless rows, rows_text or run_id is given; with a list, {"verify": true} checks every found email.
max_itemsNoMost rows to collect, 1-100. Default 10.
rows_textNoA list for people.email.find or companies.register.search or companies.emails.from_website: 1 to 100 rows, each run once as its own run with its own exact cost. Instead of rows: paste up to 100 rows as text, one per line ("Patrick Collison, stripe.com"; "Wise, GB") or a CSV with a header row (name, domain, linkedin_url; name, country).
endpoint_idsNoOptional: run only on these providers, by the endpoint ids capability_inspect lists. Leave it out to let Ahel pick (the default).
max_cost_usdNoOptional: the most this run may cost, in USD, such as "0.05". capability_inspect's next names the quoted maximum. Ahel uses only providers that fit under it, and when none does the run is refused with nothing run or charged. One run only; a list has its own quote and confirm.
wait_secondsNoOptional: how long to wait for the run to finish and answer its rows here, 0-50 seconds. Default 20; 0 answers the execution id at once. A list waits up to 45 s.
capability_idNoInstead of id: a v2 capability id from capability_run_status (no execution_id).
idempotency_keyNoOptional: your own key for this run, 8 to 200 letters, digits, dots, underscores, colons or hyphens. Sending the same call again with the same key answers the same run with no new charge; the same key with different inputs is refused.
timeout_secondsNoLongest the run may take, 1-180 seconds. Default: the provider's own (60, more for slow sources).
exclude_endpoint_idsNoOptional: never use these providers, by the endpoint ids capability_inspect lists. Ahel picks among the rest.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / confirm / description
      Previous value: -"With rows or rows_text: true runs the list once the person agrees to its quote. Left out, the answer is the quote and nothing runs."New value: +"With rows or rows_text: true runs the list once the person agrees to its quote. Left out, the answer is the quote and nothing runs. The same list sent again the same UTC day answers the first run's receipt and neither runs nor charges again; a new idempotency_key runs it again."
  2. Changed2 schema fields changed
    • addedInput schema / properties / max_cost_usd
      Added value: +{
      +  "description": "Optional: the most this run may cost, in USD, such as \"0.05\". capability_inspect's next names the quoted maximum. Ahel uses only providers that fit under it, and when none does the run is refused with nothing run or charged. One run only; a list has its own quote and confirm.",
      +  "type": "string"
      +}
    • changedInput schema / properties / rows_text / description
      Previous value: -"A list for people.email.find or companies.register.search or companies.emails.from_website: 1 to 100 rows, each run once as its own run with its own exact cost. Instead of rows: paste up to 100 rows as text, one per line (\"Patrick Collison, stripe.com\"; \"Wise, GB\") or a CSV with a header row (name, domain, linkedin_url; name, country), read as Ahel's Run a list page reads a paste."New value: +"A list for people.email.find or companies.register.search or companies.emails.from_website: 1 to 100 rows, each run once as its own run with its own exact cost. Instead of rows: paste up to 100 rows as text, one per line (\"Patrick Collison, stripe.com\"; \"Wise, GB\") or a CSV with a header row (name, domain, linkedin_url; name, country)."
  3. Changed2 schema fields changed
    • changedInput schema / properties / rows / description
      Previous value: -"A list for people.email.find or companies.register.search: 1 to 100 rows, each run once as its own run with its own exact cost. One object per row, such as {\"name\": \"Patrick Collison\", \"domain\": \"stripe.com\"} or {\"name\": \"Wise\", \"country\": \"GB\"}."New value: +"A list for people.email.find or companies.register.search or companies.emails.from_website: 1 to 100 rows, each run once as its own run with its own exact cost. One object per row, such as {\"name\": \"Patrick Collison\", \"domain\": \"stripe.com\"} or {\"name\": \"Wise\", \"country\": \"GB\"}."
    • changedInput schema / properties / rows_text / description
      Previous value: -"A list for people.email.find or companies.register.search: 1 to 100 rows, each run once as its own run with its own exact cost. Instead of rows: paste up to 100 rows as text, one per line (\"Patrick Collison, stripe.com\"; \"Wise, GB\") or a CSV with a header row (name, domain, linkedin_url; name, country), read as Ahel's Run a list page reads a paste."New value: +"A list for people.email.find or companies.register.search or companies.emails.from_website: 1 to 100 rows, each run once as its own run with its own exact cost. Instead of rows: paste up to 100 rows as text, one per line (\"Patrick Collison, stripe.com\"; \"Wise, GB\") or a CSV with a header row (name, domain, linkedin_url; name, country), read as Ahel's Run a list page reads a paste."
  4. Changed7 schema fields changed
    • changedInput schema / properties / arguments / description
      Previous value: -"The capability's inputs, by name."New value: +"The capability's inputs, by name. Required unless rows, rows_text or run_id is given; with a list, {\"verify\": true} checks every found email."
    • addedInput schema / properties / confirm
      Added value: +{
      +  "description": "With rows or rows_text: true runs the list once the person agrees to its quote. Left out, the answer is the quote and nothing runs.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / rows
      Added value: +{
      +  "description": "A list for people.email.find or companies.register.search: 1 to 100 rows, each run once as its own run with its own exact cost. One object per row, such as {\"name\": \"Patrick Collison\", \"domain\": \"stripe.com\"} or {\"name\": \"Wise\", \"country\": \"GB\"}.",
      +  "items": {
      +    "type": "object"
      +  },
      +  "maxItems": 100,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / rows_text
      Added value: +{
      +  "description": "A list for people.email.find or companies.register.search: 1 to 100 rows, each run once as its own run with its own exact cost. Instead of rows: paste up to 100 rows as text, one per line (\"Patrick Collison, stripe.com\"; \"Wise, GB\") or a CSV with a header row (name, domain, linkedin_url; name, country), read as Ahel's Run a list page reads a paste.",
      +  "type": "string"
      +}
    • addedInput schema / properties / run_id
      Added value: +{
      +  "description": "With id: the run_id a list's receipt answered, to read its rows still running and start the rest. Rows already run are never run twice.",
      +  "type": "string"
      +}
    • changedInput schema / properties / wait_seconds / description
      Previous value: -"Optional: how long to wait for the run to finish and answer its rows here, 0-50 seconds. Default 20; 0 answers the execution id at once."New value: +"Optional: how long to wait for the run to finish and answer its rows here, 0-50 seconds. Default 20; 0 answers the execution id at once. A list waits up to 45 s."
    • removedInput schema / required
      Removed value: -[
      -  "arguments"
      -]
  5. Changed1 schema field changed
    • addedInput schema / properties / tag
      Added value: +{
      +  "description": "Optional: a label for this run, such as the customer or project it is for: 1 to 64 lowercase letters, digits, dots, dashes or underscores. Activity shows runs and cost by tag. It stays in Ahel and is never sent to a provider.",
      +  "type": "string"
      +}
  6. First observed

TDQS

A4.5/5.0
Behavior4/5

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

The description carries substantial behavior beyond the annotations: price is quoted and reserved from workspace balance before running, unready items are refused with a reason before any quote, lists return a quote without confirm and a receipt with confirm, results_page and csv_url accompany rows, and rows are never re-run. That is consistent with annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true), and the idempotency nuance (retries are safe only when a key is supplied) sensibly refines idempotentHint=false rather than contradicting it. It stops short of covering failure/partial-failure semantics for a single (non-list) run or what the execution state values are, so it falls just short of the top.

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

Conciseness3/5

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

The purpose is front-loaded in the first clause, which is the right structural choice, but the body is a dense run-on of extremely long sentences that fold pricing, waiting, list handling, and exclusions into single paragraphs. The rows/rows_text list restriction is stated three times (description plus both schema fields), and the 'generated images and audio as links' detail is minor relative to the space it occupies. Every element is relevant, but the packaging makes it harder to scan than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 15 parameters, no output schema, and a nested arguments object, the description does the work structured fields cannot: it explains the return shape (state, exact cost, rows, results_page, csv_url, or an execution id), the quote/confirm gating for batch-style calls, the cost-cap refusal, and the idempotency contract. Nothing an agent needs in order to invoke this correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the prose adds cross-parameter meaning the schema cannot express: arguments are required 'unless rows, rows_text or run_id is given', max_cost_usd applies to 'one run only' while a list has its own quote and confirm, and a repeated idempotency_key with different inputs is refused. The only deduction is that several defaults (wait_seconds 20/50, max_items 10) are restated near-verbatim from the schema rather than adding meaning.

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

Purpose5/5

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

The opening sentence names a specific verb and resource ('Run one paid data capability ... through Ahel's provider execution') and immediately characterizes the transaction (quoted, price reserved, run starts). It explicitly carves out the boundary against a sibling: 'NOT for: the team's own tools, which is my_tools.' An agent can distinguish this from my_tools and capability_run_status without opening any schema.

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

Usage Guidelines5/5

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

It states when to use this tool (paid capability execution), when to use alternatives (capability_run_status 'reads the run' when the answer is just an execution id; capability_search to obtain the id; my_tools for team-owned tools), and an explicit prohibition ('Data collection only: a capability that writes or has a side effect is refused'). The quote-then-confirm path for lists likewise spells out the branch conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.