Skip to main content
Glama
Zeekeey-jpeg

singleops-mcp-server

by Zeekeey-jpeg

singleops-mcp-server

An MCP server for SingleOps, the field-service platform for tree care, landscaping and green-industry businesses.

SingleOps publishes only a small Lead Entry API. This server instead exposes the endpoints the SingleOps web app itself uses: clients, jobs, visits, invoices, items, tasks, timesheets, reports and more. Every endpoint becomes one MCP tool. Reads are always on. Writes and deletes are off until you turn them on, and even then each call is a dry run until you say otherwise.

It works with any MCP client:

  • over stdio: Claude Code, Claude Desktop, Cursor, Grok CLI-style local agents

  • over Streamable HTTP: Grok (xAI API remote MCP) and other remote agents

Unofficial. Not affiliated with or endorsed by SingleOps. It drives your own logged-in session the way your browser does. Use it on accounts you are authorised to operate, at a polite rate (it defaults to 1 request/second).


Contents


Related MCP server: ForIT MCP Gateway

Quick start

git clone https://github.com/Zeekeey-jpeg/Single_Ops_MCP.git
cd Single_Ops_MCP
npm install
npx playwright install chrome   # once: the login browser
npm run build
npm run login                   # a browser opens; sign in to SingleOps by hand
npm start                       # stdio MCP server: 87 tools live (82 read + 5 meta)

Requirements: Node.js 20+, and Google Chrome (or run npx playwright install chromium and set channel in scripts/capture.mjs).


Authentication: the login option

SingleOps' internal API has no API key and no JWT. It authenticates the way the web app does: a session cookie plus a Rails CSRF token.

  1. npm run login opens a real browser window at app.singleops.com.

  2. You sign in by hand, including any 2FA. The script never sees, asks for or stores your password.

  3. As soon as the app loads, the browser's cookies are saved to state/session.json (gitignored), and the window closes.

  4. Every tool call replays that session:

    • the _SingleOps_session cookie

    • x-csrf-token, read from the app's <meta name="csrf-token">, sent on non-GET requests

    • x-requested-with: XMLHttpRequest

When the session expires, tools return AUTH: SingleOps rejected the session (HTTP 401)…. They never retry a 401, because hammering a login wall is how accounts get locked. Run npm run login again and restart the server. The browser profile in state/profile/ usually keeps you signed in, so re-login is often a single click.

Optional: Lead Entry token. The official Lead Entry API (4 routes) uses user_email + user_token from SingleOps → Users → your API user → View API Token. Put them in .env to enable the singleops_*_lead_* tools. Everything else uses the browser session.

state/session.json is a live login. Treat it like a password: never commit it, never copy it to a shared machine.


Connect a client

Claude Code

claude mcp add singleops -s user -- node /absolute/path/to/Single_Ops_MCP/dist/index.js

Claude Desktop / Cursor / any stdio client

{
  "mcpServers": {
    "singleops": {
      "command": "node",
      "args": ["/absolute/path/to/Single_Ops_MCP/dist/index.js"]
    }
  }
}

Secrets stay in .env next to the server, never in the client config.

Grok (xAI): remote MCP over Streamable HTTP

Grok connects to remote MCP servers by URL. Run the server in HTTP mode on the machine that holds your SingleOps session:

# 1. a long random token that only you and your Grok config know
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
# 2. put it in .env
#    SINGLEOPS_HTTP_TOKEN=<that token>
# 3. start
npm run start:http      # http://127.0.0.1:3333/mcp  (health: /health)

Grok's servers cannot reach 127.0.0.1, so publish the port over HTTPS with a tunnel you control. For example, cloudflared tunnel --url http://127.0.0.1:3333 gives you https://<random>.trycloudflare.com. Then point Grok at it.

xAI API / SDK (remote MCP tool):

from xai_sdk import Client
from xai_sdk.chat import user
from xai_sdk.tools import mcp

client = Client(api_key=XAI_API_KEY)
chat = client.chat.create(
    model="grok-4",
    tools=[mcp(
        server_url="https://<your-tunnel>/mcp",
        server_label="singleops",
        authorization="Bearer <SINGLEOPS_HTTP_TOKEN>",
    )],
)
chat.append(user("List my SingleOps jobs scheduled this week"))
print(chat.sample().content)

Grok apps / agents with a "Connectors / MCP" setting: add a custom MCP server with URL https://<your-tunnel>/mcp and header Authorization: Bearer <SINGLEOPS_HTTP_TOKEN>.

HTTP mode is stateless: each request gets a fresh server, so several agents can share one instance. It refuses to start without a 24+ character token, rejects requests without it (constant-time compare), rejects browser Origins unless they are listed in SINGLEOPS_HTTP_ALLOWED_ORIGINS, and binds to 127.0.0.1 unless you set SINGLEOPS_HTTP_HOST. Anyone with the URL and token acts as you in SingleOps, so keep write and delete off on any internet-reachable instance unless you mean it.


Safety model

Layer

What it does

Registration gates

A tool that is not registered cannot be called. Reads: always. Writes (POST/PUT/PATCH): only if SINGLEOPS_ENABLE_WRITE=true (default false). Deletes: only if SINGLEOPS_ENABLE_DELETE=true (default false).

Denied by policy

Routes that move money, change billing or subscriptions, touch user accounts or passwords, email or text your customers, or change account-wide settings are mapped but never registered, whatever the flags say.

Dry run by default

Every write call returns the exact request (method, URL, every form field) and sends nothing, unless you pass dry_run: false.

Typed delete confirmation

A delete also needs confirm: "DELETE /tags/42" naming that one record.

Write budget

At most SINGLEOPS_MAX_WRITES (default 25) live writes per server run. Raise it deliberately for a bulk job.

Map-bound

Only routes in api-map.json can be called. There is no free-form URL tool.

Audit log

Every write, failed write and auth failure is appended to audit/YYYY-MM-DD.jsonl, with field names only, never values.

Polite client

1 request/second, serialized. 429/5xx are retried with backoff and Retry-After. 401/403 are never retried. A stale CSRF token is refreshed once.

QuickBooks: if your SingleOps account syncs to QuickBooks Online, writes to clients, items and invoices flow into QuickBooks. Run singleops_read_get_qbo_status first, and test on a throwaway record (e.g. a client named ZZ-TEST-MCP).


Configuration

Copy .env.example to .env. Every capability defaults to off.

Variable

Default

Meaning

SINGLEOPS_ENABLE_WRITE

false

Register create/update tools.

SINGLEOPS_ENABLE_DELETE

false

Register delete tools (still need confirm).

SINGLEOPS_MAX_WRITES

25

Live writes allowed per server run.

SINGLEOPS_MAX_RPS

1

Requests per second.

SINGLEOPS_LEAD_USER_EMAIL / SINGLEOPS_LEAD_USER_TOKEN

—

Optional, for the official Lead Entry API tools.

SINGLEOPS_HTTP_TOKEN

—

Required for --http. Clients send Authorization: Bearer <token>.

SINGLEOPS_HTTP_HOST / SINGLEOPS_HTTP_PORT

127.0.0.1 / 3333

HTTP bind address.

SINGLEOPS_HTTP_ALLOWED_ORIGINS

—

Comma-separated browser origins allowed to call HTTP mode.

SINGLEOPS_BASE_URL

https://app.singleops.com

Override for a different SingleOps host.

Gitignored and never committed: .env, state/ (session and browser profile), capture/ (raw traffic), audit/, dist/, node_modules/.


The route map: shipped, or build your own

The tools are generated at startup from api-map.json, a map of SingleOps' internal routes. It records shapes only: method, path template, query-parameter names, body field names and types, and response key names. It holds no values, no record ids, no account names and no cookies. A test enforces this.

Decision: a sanitized map ships with the repo, so the server is useful immediately. SingleOps is multi-tenant SaaS, so the routes are the same for every account. The shipped map was built from one account's read-only crawl and scrubbed of anything account-specific. api-map.md is the human-readable version.

Build your own to pick up routes your plan or settings expose, or after SingleOps ships changes (singleops_read_contract_test tells you when):

npm run crawl     # sign in; it then visits every page type READ-ONLY and records traffic to capture/*.har
npm run map       # rebuilds api-map.json + api-map.md (merges with the existing map)
npm run docs      # regenerates the tool tables in this README

How the map is built:

  • Read routes: XHR/JSON calls are taken from the recorded traffic (HAR) and the paths templated (/clients/123 → /clients/{id}), the same idea as mitmproxy2swagger and har-to-openapi.

  • Write routes: these come from the Rails <form>s and data-method links in the pages the crawl already loaded: action, method (_method override) and field names. No write is performed to discover them.

  • Crawler safety: the crawler follows only plain GET links and skips anything that looks like an action (send, approve, convert, delete, pay, export…). node scripts/audit-actions.mjs capture/<file>.har lists every non-GET or action-like request a crawl made, so you can confirm nothing changed.

  • Sensitive output: capture/*.har contains your real customer data and cookies. It stays local (gitignored). Delete it when you're done.


Tool reference

Naming follows singleops_{read|write}_{verb}_{entity}. Each tool carries MCP annotations: readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Read tools take response_format (markdown default, or json). Long outputs are truncated at 25,000 characters with a hint to page.

How to call:

  • Path parameters ({id}, {client_id}) are named inputs.

  • Query parameters seen in traffic are named inputs. Anything else goes in extra_query.

  • Search tools (Rails datatables) take DataTables-style paging in body: {"start": 0, "length": 25, "search": {"value": "smith"}}.

  • Write tools take Rails-style nested objects in body, e.g. {"client": {"first_name": "Pat", "last_name": "Lee"}}. Send only the fields you set. Success returns {ok, status, redirect, id}. A validation failure returns the form's error messages.

132 tools: 5 meta, 82 read, 37 write, 8 delete. 15 more mapped routes are denied by policy and never exposed. With default settings 87 tools are live (meta + read).

Meta tools (5)

Always on. Discovery, health and guarded generic access.

ID

Tool name

Description

Endpoint

Enabled when

1

singleops_discover_tools

List every tool grouped by domain (clients, jobs, visits, reports…), filterable by domain and read/write, with enabled/disabled state.

—

always

2

singleops_read_whoami

Connection status: session presence/expiry and auth scheme (no secret values), gates, write budget, and a live probe of one GET route.

—

always

3

singleops_call_route

Call any mapped route by tool name or route id. Free-form URLs are not accepted; the target's gates and dry-run apply.

—

same as target

4

singleops_read_contract_test

Replay parameter-free GET routes and diff response keys against the map, to detect SingleOps changing its internal API.

—

always

5

singleops_read_get_qbo_status

Report the QuickBooks Online connection settings. Check before any bulk write: writes sync to QuickBooks.

—

always

Read tools (82)

Read-only (readOnlyHint: true). Always on. GET routes plus Rails datatable/report queries that are sent as POST but only read. Every read tool accepts response_format (markdown default, or json).

ID

Tool name

Description

Endpoint

Enabled when

1

singleops_read_lead_list_operations

Lead Entry API: list operations (divisions).

GET /api/v1/operations

Lead Entry token

2

singleops_read_lead_list_custom_inputs

Lead Entry API: list custom input (custom field) definitions.

GET /api/v1/custom_inputs

Lead Entry token

3

singleops_read_lead_list_clients_search_by_field

Lead Entry API: search clients. search_field = email | phone (prefix match).

GET /api/v1/clients/search_by_field

Lead Entry token

4

singleops_read_list_account_settings_options_quickbooks

List account settings options quickbooks.

GET /api/v1/account_settings/options/quickbooks

always

5

singleops_read_list_accounts_info

List accounts info.

GET /api/v1/accounts/info

always

6

singleops_read_get_dashboard

Get dashboard by id.

GET /api/v1/dashboards/{id}

always

7

singleops_read_list_operations

List operations.

GET /api/v1/operations

always

8

singleops_read_list_users_current

List users current.

GET /api/v1/users/current

always

9

singleops_read_list_widgets

List widgets.

GET /api/v1/widgets

always

10

singleops_read_list_portal_accounts_feature_flags

List portal accounts feature flags.

GET /client/api/v1/accounts/feature_flags

always

11

singleops_read_list_client_location_stats

List client location stats for one client/location.

GET /clients/{client_id}/location/{location_id}/stats

always

12

singleops_read_list_client_emails

List client emails for one id.

GET /clients/{id}/emails

always

13

singleops_read_list_client_invoices

List client invoices for one id.

GET /clients/{id}/invoices

always

14

singleops_read_list_client_jobs

List client jobs for one id.

GET /clients/{id}/jobs

always

15

singleops_read_list_client_locations

List client locations for one id.

GET /clients/{id}/locations

always

16

singleops_read_list_client_stat_hours

List client stat hours for one id.

GET /clients/{id}/stats/hours.json

always

17

singleops_read_list_client_stat_revenue

List client stat revenue for one id.

GET /clients/{id}/stats/revenue.json

always

18

singleops_read_list_client_tasks

List client tasks for one id.

GET /clients/{id}/tasks

always

19

singleops_read_list_client_text_messages

List client text messages for one id.

GET /clients/{id}/text_messages

always

20

singleops_read_list_client_visits

List client visits for one id.

GET /clients/{id}/visits

always

21

singleops_read_search_clients

Search clients (server-side table query: paging, sorting, filters).

GET /clients/data_table

always

22

singleops_read_list_email_spam_addresses_check_batch_emails

List email spam addresses check batch emails.

POST /email_spam_addresses/check_batch_emails

always

23

singleops_read_list_emails_report

List emails report.

GET /emails/report

always

24

singleops_read_search_invoices_archived_invoices

Search invoices archived invoices (server-side table query: paging, sorting, filters).

GET /invoices/archived_invoices_data_table

always

25

singleops_read_search_invoices

Search invoices (server-side table query: paging, sorting, filters).

POST /invoices/data_table

always

26

singleops_read_list_invoices_invoice_totals

List invoices invoice totals.

POST /invoices/invoice_totals

always

27

singleops_read_search_invoices_2

Search invoices (server-side table query: paging, sorting, filters).

POST /invoices/invoices_datatable

always

28

singleops_read_list_item_groups

List item groups.

GET /item_groups

always

29

singleops_read_list_items

List items.

GET /items

always

30

singleops_read_search_jobs_invoices

Search jobs invoices (server-side table query: paging, sorting, filters) for one id.

GET /jobs/{id}/invoices_datatable

always

31

singleops_read_search_jobs

Search jobs (server-side table query: paging, sorting, filters).

POST /jobs/jobs_datatable

always

32

singleops_read_search_jobs_report

Search jobs report (server-side table query: paging, sorting, filters).

POST /jobs/jobs_report_datatable

always

33

singleops_read_search_jobs_progress_billing

Search jobs progress billing (server-side table query: paging, sorting, filters).

GET /jobs/progress_billing_datatable

always

34

singleops_read_search_jobs_visits_report

Search jobs visits report (server-side table query: paging, sorting, filters).

POST /jobs/visits_report_datatable

always

35

singleops_read_search_labor_resources

Search labor resources (server-side table query: paging, sorting, filters).

GET /labor_resources/data_table

always

36

singleops_read_list_public_accounts_feature_flags

List public accounts feature flags.

GET /public/api/v1/accounts/feature_flags

always

37

singleops_read_list_public_brand_details

List public brand details for one id.

GET /public/api/v1/brands/{id}/details

always

38

singleops_read_list_public_client_public_invoices

List public client public invoices for one id.

GET /public/api/v1/clients/{id}/public_invoices

always

39

singleops_read_list_purchase_orders

List purchase orders.

GET /purchase_orders

always

40

singleops_read_get_archived_jobs_report

Get archived jobs report.

GET /reports/archived_jobs_report

always

41

singleops_read_get_batch_renew_jobs_report

Get batch renew jobs report.

GET /reports/batch_renew_jobs

always

42

singleops_read_get_client_labor_report

Get client labor report.

GET /reports/client_labor

always

43

singleops_read_get_custom_inputs_report

Get custom inputs report.

GET /reports/custom_inputs_report

always

44

singleops_read_get_customer_history_report

Get customer history report.

GET /reports/customer_history

always

45

singleops_read_get_customer_type_report

Get customer type report.

GET /reports/customer_type_report

always

46

singleops_read_get_equipment_utilization_report

Get equipment utilization report.

GET /reports/equipment_utilization

always

47

singleops_read_get_global_planner_report

Get global planner report.

GET /reports/global_planner

always

48

singleops_read_get_inventory_transactions_report

Get inventory transactions report.

POST /reports/inventory_transactions

always

49

singleops_read_get_item_groups_report

Get item groups report.

GET /reports/item_groups_report

always

50

singleops_read_get_items_report

Get items report.

GET /reports/items_report

always

51

singleops_read_get_job_expenses_report

Get job expenses report.

POST /reports/job_expenses

always

52

singleops_read_get_job_labor_report

Get job labor report.

GET /reports/job_labor

always

53

singleops_read_get_job_profit_margin_report

Get job profit margin report.

GET /reports/job_profit_margin

always

54

singleops_read_get_master_line_item_report

Get master line item report.

POST /reports/master_line_item

always

55

singleops_read_get_net_sales_report

Get net sales report.

GET /reports/net_sales

always

56

singleops_read_get_operation_performance_report

Get operation performance report.

GET /reports/operation_performance_report

always

57

singleops_read_get_payment_records_report

Get payment records report.

GET /reports/payment_records_report

always

58

singleops_read_get_payment_totals_report

Get payment totals report.

POST /reports/payment_totals_report

always

59

singleops_read_get_purchase_orders_report

Get purchase orders report.

GET /reports/purchase_orders

always

60

singleops_read_get_sales_rep_report

Get sales rep report.

GET /reports/sales_rep

always

61

singleops_read_get_timesheet_summary_report

Get timesheet summary report.

GET /reports/timesheet_summary_report

always

62

singleops_read_get_timesheet_totals_report

Get timesheet totals report.

POST /reports/timesheet_totals_report

always

63

singleops_read_get_tree_inventory_report

Get tree inventory report.

POST /reports/tree_inventory_report

always

64

singleops_read_get_visit_profit_margin_report

Get visit profit margin report.

GET /reports/visit_profit_margin

always

65

singleops_read_list_tags

List all tags (id, name, html_color, tag_type). Use the id with update_tag / delete_tag.

GET /tags

always

66

singleops_read_get_task

Get task by id.

GET /tasks/{id}.json

always

67

singleops_read_list_tasks_calendar

List tasks calendar.

GET /tasks/calendar

always

68

singleops_read_search_tasks

Search tasks (server-side table query: paging, sorting, filters).

POST /tasks/data_table/all

always

69

singleops_read_list_tasks_route_planner

List tasks route planner.

GET /tasks/route_planner

always

70

singleops_read_list_text_messages_report

List text messages report.

GET /text_messages/report.json

always

71

singleops_read_list_timesheet_events_list

List timesheet events list.

GET /timesheet_events/list.json

always

72

singleops_read_list_timesheets_list

List timesheets list.

GET /timesheets/list.json

always

73

singleops_read_list_users_crews

List users crews.

GET /users/crews.json

always

74

singleops_read_list_vendors

List vendors.

GET /vendors

always

75

singleops_read_get_visit

Get visit by id.

GET /visits/{id}.json

always

76

singleops_read_search_visits_approved

Search visits approved (server-side table query: paging, sorting, filters).

GET /visits/approved/data_table

always

77

singleops_read_list_visits_awaiting_scheduling_stats

List visits awaiting scheduling stats.

GET /visits/awaiting_scheduling_stats

always

78

singleops_read_list_visits_index_fullcalendar_events

List visits index fullcalendar events.

GET /visits/index_fullcalendar_events.json

always

79

singleops_read_list_visits_index_fullcalendar_holiday_events

List visits index fullcalendar holiday events.

GET /visits/index_fullcalendar_holiday_events.json

always

80

singleops_read_list_visits_index_route_planner_events

List visits index route planner events.

GET /visits/index_route_planner_events.json

always

81

singleops_read_list_visits_route_planner_data

List visits route planner data.

GET /visits/route_planner_data

always

82

singleops_read_list_visits_user_routes

List visits user routes.

GET /visits/user_routes

always

Write tools (37)

Mutating. Registered only when SINGLEOPS_ENABLE_WRITE=true (default false). Each call is a dry run by default and returns the exact request; pass dry_run: false to send. Capped at SINGLEOPS_MAX_WRITES live writes per run and audited to audit/.

ID

Tool name

Description

Endpoint

Enabled when

1

singleops_write_lead_create_job

Lead Entry API: create a lead (for an existing client_id, or with a new client profile).

POST /api/v1/jobs

SINGLEOPS_ENABLE_WRITE

2

singleops_write_create_client

Create client.

POST /clients

SINGLEOPS_ENABLE_WRITE

3

singleops_write_update_client

Update client for one id.

PATCH /clients/{id}

SINGLEOPS_ENABLE_WRITE

4

singleops_write_create_custom_input

Create custom input.

POST /custom_inputs

SINGLEOPS_ENABLE_WRITE

5

singleops_write_update_custom_input

Update custom input for one id.

PATCH /custom_inputs/{id}

SINGLEOPS_ENABLE_WRITE

6

singleops_write_create_customer_type

Create customer type.

POST /customer_types

SINGLEOPS_ENABLE_WRITE

7

singleops_write_update_invoice

Update invoice for one id.

PATCH /invoices/{id}

SINGLEOPS_ENABLE_WRITE

8

singleops_write_create_item_group

Create item group.

POST /item_groups

SINGLEOPS_ENABLE_WRITE

9

singleops_write_create_item_subcategory

Create item subcategory.

POST /item_subcategories

SINGLEOPS_ENABLE_WRITE

10

singleops_write_create_item

Create item.

POST /items

SINGLEOPS_ENABLE_WRITE

11

singleops_write_update_item

Update item for one id.

PATCH /items/{id}

SINGLEOPS_ENABLE_WRITE

12

singleops_write_create_job_template

Create job template.

POST /job_templates

SINGLEOPS_ENABLE_WRITE

13

singleops_write_create_job

Create job.

POST /jobs

SINGLEOPS_ENABLE_WRITE

14

singleops_write_update_job

Update job for one id.

PATCH /jobs/{id}

SINGLEOPS_ENABLE_WRITE

15

singleops_write_update_job_notes

Update job notes for one id.

PATCH /jobs/{id}/update_notes

SINGLEOPS_ENABLE_WRITE

16

singleops_write_create_labor_resource

Create labor resource.

POST /labor_resources

SINGLEOPS_ENABLE_WRITE

17

singleops_write_create_labor_schedule

Create labor schedule.

POST /labor_schedules

SINGLEOPS_ENABLE_WRITE

18

singleops_write_create_loaded_labor_rate_formula

Create loaded labor rate formula.

POST /loaded_labor_rate_formulas

SINGLEOPS_ENABLE_WRITE

19

singleops_write_create_operation

Create operation.

POST /operations

SINGLEOPS_ENABLE_WRITE

20

singleops_write_update_operation

Update operation for one id.

PATCH /operations/{id}

SINGLEOPS_ENABLE_WRITE

21

singleops_write_create_payment_method

Create payment method.

POST /payment_methods

SINGLEOPS_ENABLE_WRITE

22

singleops_write_create_purchase_order

Create purchase order.

POST /purchase_orders

SINGLEOPS_ENABLE_WRITE

23

singleops_write_create_recurrence_schedule

Create recurrence schedule.

POST /recurrence_schedules

SINGLEOPS_ENABLE_WRITE

24

singleops_write_create_tag

Create tag.

POST /tags

SINGLEOPS_ENABLE_WRITE

25

singleops_write_update_tag

Update tag for one id.

PATCH /tags/{id}

SINGLEOPS_ENABLE_WRITE

26

singleops_write_create_task

Create task.

POST /tasks

SINGLEOPS_ENABLE_WRITE

27

singleops_write_unschedule_task

Unschedule task for one id.

PUT /tasks/{id}/unschedule

SINGLEOPS_ENABLE_WRITE

28

singleops_write_create_tax_location

Create tax location.

POST /tax_locations

SINGLEOPS_ENABLE_WRITE

29

singleops_write_create_tax_rate

Create tax rate.

POST /tax_rates

SINGLEOPS_ENABLE_WRITE

30

singleops_write_create_term

Create term.

POST /terms

SINGLEOPS_ENABLE_WRITE

31

singleops_write_update_term

Update term for one id.

PATCH /terms/{id}

SINGLEOPS_ENABLE_WRITE

32

singleops_write_update_timesheet_event

Update timesheet event for one id.

PATCH /timesheet_events/{id}

SINGLEOPS_ENABLE_WRITE

33

singleops_write_create_timesheet

Create timesheet.

POST /timesheets

SINGLEOPS_ENABLE_WRITE

34

singleops_write_create_unit_of_measure

Create unit of measure.

POST /unit_of_measures

SINGLEOPS_ENABLE_WRITE

35

singleops_write_create_vendor

Create vendor.

POST /vendors

SINGLEOPS_ENABLE_WRITE

36

singleops_write_create_visit

Create visit.

POST /visits

SINGLEOPS_ENABLE_WRITE

37

singleops_write_update_visit

Update visit for one id.

PATCH /visits/{id}

SINGLEOPS_ENABLE_WRITE

Delete tools (8)

Destructive. Registered only when SINGLEOPS_ENABLE_DELETE=true (default false). Sending needs dry_run: false and confirm: "DELETE <path>" naming the one record.

ID

Tool name

Description

Endpoint

Enabled when

1

singleops_write_delete_client

Delete client.

DELETE /clients/{id}

SINGLEOPS_ENABLE_DELETE

2

singleops_write_delete_custom_input

Delete custom input.

DELETE /custom_inputs/{id}

SINGLEOPS_ENABLE_DELETE

3

singleops_write_delete_invoice

Delete invoice.

DELETE /invoices/{id}

SINGLEOPS_ENABLE_DELETE

4

singleops_write_delete_operation

Delete operation.

DELETE /operations/{id}

SINGLEOPS_ENABLE_DELETE

5

singleops_write_delete_tag

Delete tag.

DELETE /tags/{id}

SINGLEOPS_ENABLE_DELETE

6

singleops_write_delete_task

Delete task.

DELETE /tasks/{id}

SINGLEOPS_ENABLE_DELETE

7

singleops_write_delete_term

Delete term.

DELETE /terms/{id}

SINGLEOPS_ENABLE_DELETE

8

singleops_write_delete_timesheet_event

Delete timesheet event.

DELETE /timesheet_events/{id}

SINGLEOPS_ENABLE_DELETE

Denied by policy (never exposed) (15)

Mapped so you know they exist, but no flag turns them on: they move money, change billing or logins, message customers, or reconfigure the account.

ID

Tool name

Description

Endpoint

Enabled when

1

singleops_write_update_account_setting_general_settings

Update account setting general settings.

POST /account_settings/update_general_settings

never (account-wide settings)

2

singleops_write_update_account_setting_payment_gateway

Update account setting payment gateway.

POST /account_settings/update_payment_gateway

never (billing, payments or subscription)

3

singleops_write_update_account

Update account for one id.

PATCH /accounts/{id}

never (account-wide settings)

4

singleops_write_create_financing

Create financing.

POST /financings

never (billing, payments or subscription)

5

singleops_write_custom_import_input_drop_downs_import

Custom import input drop downs import.

POST /imports/custom_input_drop_downs_import

never (bulk import)

6

singleops_read_list_inventories_search_and_repredict

List inventories search and repredict.

POST /inventories/search_and_repredict

never (bulk recalculation or UI state)

7

singleops_write_update_propay_config

Update propay config for one id.

PATCH /propay_configs/{id}

never (billing, payments or subscription)

8

singleops_write_salesforce_subscription_add

Salesforce subscription add for one id.

POST /subscription/licenses/{id}/salesforce_subscription_add

never (billing, payments or subscription)

9

singleops_write_update_subscription

Update subscription for one id.

PATCH /subscriptions/{id}

never (billing, payments or subscription)

10

singleops_write_create_user

Create user.

POST /users

never (user accounts and logins)

11

singleops_write_update_user

Update user for one id.

PATCH /users/{id}

never (user accounts and logins)

12

singleops_write_clear_user_tooltip_history

Clear user tooltip history for one id.

POST /users/{id}/clear_tooltip_history

never (user accounts and logins)

13

singleops_write_resend_user_invitation

Resend user invitation for one id.

POST /users/{id}/resend_invitation

never (user accounts and logins)

14

singleops_write_save_user_table_settings

Save user table settings.

POST /users/save_table_settings

never (user accounts and logins)

15

singleops_write_email_visit

Email visit.

POST /visits/email

never (sends to customers)


Examples

Health check: singleops_read_whoami returns the session status, the gates, the write budget and a live probe.

Find a client and their jobs:

  1. singleops_read_search_clients with body: {"start":0,"length":10,"search":{"value":"Lee"}}

  2. singleops_read_list_client_jobs with id: <client id>

Revenue report: singleops_read_get_net_sales_report, with a date range in extra_query (reports need dates; without them some return HTTP 500).

Create a client (writes enabled):

  1. singleops_write_create_client with body: {"client":{"first_name":"ZZ","last_name":"TEST-MCP"}}. This returns the dry-run request.

  2. Repeat with dry_run: false. This returns {ok: true, redirect: "/clients/123", id: "123"}.

Update job notes: singleops_write_update_job_notes with id: 123, body: {"job":{"crew_notes":"Bring the 60ft lift"}} and dry_run: false.

Delete a test tag (deletes enabled): singleops_write_delete_tag with id: 42, dry_run: false and confirm: "DELETE /tags/42".

Anything else: singleops_discover_tools with domain: "visits", then singleops_call_route with the tool name.


Development

npm run build        # tsc → dist/
npm test             # vitest: map building, no-leak guarantees, auth replay, gates, dry-run, Rails encoding
npm run inspect      # MCP Inspector against the stdio server
npm run docs         # regenerate the README tool tables
npm run forms -- capture/<file>.har   # list write forms found in a capture

Layout:

src/
  index.ts     stdio + Streamable HTTP entry
  tools.ts     tool generation, gates, dry-run, catalog, meta tools
  naming.ts    {service}_{read|write}_{verb}_{entity} names
  client.ts    throttled, retrying HTTP; Rails form submit + redirect/error handling
  auth.ts      session cookie + CSRF replay from state/session.json
  rails.ts     nested param encoding, validation-error parsing
  format.ts    markdown rendering
  map.ts       route types + the 4 Lead Entry routes
scripts/
  capture.mjs        login / crawl / manual capture (Playwright, headed)
  har-to-map.mjs     HAR (+ HTML forms) → api-map.json
  audit-actions.mjs  post-crawl "did anything change?" report
  gen-readme-tools.mjs

Credit: the retry and error patterns follow sanjibani/singleops-mcp (MIT), which wraps the Lead Entry API.

License

MIT. See LICENSE.

Available Tools

87 tools
singleops_call_routeCall a mapped SingleOps routeC
Destructive

Call any mapped route by tool name or route id. Free-form URLs are not accepted; the target's gates and dry-run apply.

NameRequiredDescriptionDefault
bodyNo
queryNo
routeYesTool name (singleops_read_list_items) or route id (get_items). See singleops_discover_tools.
confirmNoDeletes only: "DELETE <path>".
dry_runNoWrites only. Default true = preview, nothing sent.
path_paramsNo
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already flag destructive, open-world, non-idempotent behavior. The description adds useful context that URLs are not accepted and that the target's gates and dry-run settings apply, but it does not explain the practical implications of the destructive hint or confirm/dry-run requirements.

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

Conciseness4/5

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

The description is two compact sentences with the core constraint front-loaded. There is little waste, though the phrase 'target's gates and dry-run apply' is vague and could be more actionable.

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

Completeness2/5

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

This is a complex meta-tool with seven parameters, nested objects, destructive behavior, and no output schema. The description is too short to explain how to construct body/query/path_params, how confirm works for deletes, or how dry_run defaults affect writes. It leaves too much to be inferred from the schema.

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

Parameters2/5

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

Schema coverage is only 57%, and the description only elaborates on the route parameter's accepted forms. It does not explain body, query, path_params, confirm, or dry_run beyond what the schema already partially provides. The description fails to compensate for the undocumented parameters.

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

Purpose4/5

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

The description states a specific action (calling a mapped route) and two accepted identifiers (tool name or route id). It also clarifies that free-form URLs are rejected. It is clear but does not explicitly distinguish when to use this meta-tool versus calling a concrete sibling directly.

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

Usage Guidelines2/5

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

The only usage constraint given is that free-form URLs are not accepted and that the target's gates/dry-run apply. There is no explicit guidance on when to use this tool instead of singleops_discover_tools or a concrete singleops_read_* tool. The schema mentions discover_tools, but the description itself does not route the agent.

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

singleops_discover_toolsDiscover SingleOps toolsA
Read-onlyIdempotent

List every tool grouped by domain (clients, jobs, visits, reports…), filterable by domain and read/write, with enabled/disabled state. Returns JSON: {totalTools, domains: {: {tools: [{name, kind, enabled, description}]}}}.

NameRequiredDescriptionDefault
typeNoFilter by tool kind.
domainNoResource domain, e.g. "clients", "jobs", "visits", "reports", "invoices".

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish that this is a safe, read-only, idempotent, closed-world operation. The description adds useful behavioral context by explaining grouping, filtering, enabled/disabled state, and the exact return shape.

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

Conciseness5/5

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

The description is compact and front-loaded: one sentence covers purpose and filters, and one sentence gives the return structure. There is no wasted text.

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

Completeness4/5

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

Because there is no output schema, the description appropriately supplies the JSON return shape. It covers filters and enabled state, though it could state default behavior when no filters are provided.

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

Parameters3/5

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

Schema coverage is 100%, so the input schema already documents both parameters. The description reinforces that results can be filtered by domain and read/write, but it does not clarify the other enum values such as delete, denied, or meta beyond what is already in the schema.

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 description states a specific verb and resource: it lists every tool, grouped by domain, with filters. This clearly distinguishes the discovery/meta tool from the many sibling SingleOps API tools.

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

Usage Guidelines3/5

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

Usage is implied because this is a discovery tool, but the description does not explicitly say when to call it versus calling a specific sibling tool, nor does it state exclusions or recommended workflow.

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

singleops_read_contract_testSingleOps API contract testA
Read-onlyIdempotent

Replay parameter-free GET routes and diff response keys against the map, to detect SingleOps changing its internal API. Returns {probed, passed, failed, results[]}.

NameRequiredDescriptionDefault
limitNoMax routes to probe (default 25).

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), so the description's job is to add scope and output context. It does: it discloses that only parameter-free GET routes are replayed and gives the return shape {probed, passed, failed, results[]} despite no output schema. Missing detail on what a 'failed' entry contains or whether probing hits live rate limits.

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

Conciseness5/5

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

One tightly packed sentence that front-loads the mechanism, then the purpose, then the return shape. Nothing is redundant and no filler is present.

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

Completeness4/5

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

For a single-optional-param diagnostic tool with no output schema, the description conveys mechanism, intent, and the top-level result envelope. It falls slightly short on what the per-route `results[]` entries or 'failed' classification mean, which an agent would need to interpret the diagnostic output.

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

Parameters3/5

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

Schema description coverage is 100% and the single optional `limit` parameter is already documented in the schema (max routes to probe, default 25). The description adds no extra semantics about what limiting routes means for coverage or result fidelity, so the baseline 3 applies.

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?

States a specific mechanism (replay parameter-free GET routes, diff response keys against a known map) and an explicit goal (detect SingleOps changing its internal API). This clearly distinguishes it from data-returning siblings like singleops_call_route and singleops_discover_tools, which fetch values rather than validate contracts.

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

Usage Guidelines3/5

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

The stated goal ('to detect SingleOps changing its internal API') implies the usage context of a contract/regression check, but there is no explicit when-to-use, when-not-to-use, or named alternative. An agent must infer that this is not for retrieving data and that only parameter-free routes are covered.

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

singleops_read_get_archived_jobs_reportGet archived jobs reportC
Read-onlyIdempotent

Get archived jobs report. (GET /reports/archived_jobs_report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, open-world, and non-destructive behavior, so the safety profile is covered. The description contributes real extra context by disclosing that the definition was inferred from observed traffic and results should be confirmed, plus it lists the JSON response keys (draw, recordsTotal, data, meta, etc.) absent an output schema. It stops short of explaining pagination semantics or rate-limit/error behavior.

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

Conciseness2/5

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

The purpose and caveat are front-loaded, which is good, but the body is a 68-item enumeration of parameter names that duplicates the input schema verbatim and dominates the description. That bulk does not earn its place; a sentence on DataTables conventions would have been far more useful.

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

Completeness3/5

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

For a 68-parameter tool with no output schema, listing the response keys and flagging the inferred/unverified nature are genuinely valuable. However, the description never explains how the paging/sorting/filter parameters are meant to be combined or what the report actually contains, so an agent still lacks the operational detail needed to call this confidently.

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

Parameters3/5

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

Schema description coverage is nominally 100%, so the baseline is 3, but those descriptions are placeholders ('Query parameter "draw"') that convey no meaning. The description merely mirrors the schema's parameter-name dump and never explains DataTables concepts like draw/start/length, search[value], or the table_filter_start/end range params, so it adds no true semantic value.

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

Purpose4/5

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

States a specific verb and resource ('Get archived jobs report') and pins it to the concrete endpoint GET /reports/archived_jobs_report, so the agent knows exactly which report is fetched. It does not, however, distinguish this from the many sibling report tools (job_labor_report, job_expenses_report, etc.) beyond the name itself.

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

Usage Guidelines2/5

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

The only guidance offered is 'Inferred from the SingleOps web app's own traffic; confirm results,' which is a reliability caveat rather than a when-to-use rule. Nothing says when this report is preferred over the other archived/jobs/report siblings or what filters are needed to get meaningful output.

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

singleops_read_get_batch_renew_jobs_reportGet batch renew jobs reportC
Read-onlyIdempotent

Get batch renew jobs report. (GET /reports/batch_renew_jobs) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, sales_reps, operation_ids, include_contracts, stage_ids[], tag_ids, tags_any, include_on_hold, show_only_eligible_for_renewal, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
tag_idsNoQuery parameter "tag_ids".
tags_anyNoQuery parameter "tags_any".
sales_repsNoQuery parameter "sales_reps".
extra_queryNoAny additional query parameters.
stage_ids[]NoQuery parameter "stage_ids[]".
colReorder[]NoQuery parameter "colReorder[]".
operation_idsNoQuery parameter "operation_ids".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
include_on_holdNoQuery parameter "include_on_hold".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
include_contractsNoQuery parameter "include_contracts".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
show_only_eligible_for_renewalNoQuery parameter "show_only_eligible_for_renewal".

TDQS

C2.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so safety is covered. The description adds one genuinely useful behavioral fact: the parameters were reverse-engineered from observed traffic and results should be verified. It also lists return keys, but says nothing about pagination defaults or how the DataTables params affect output.

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

Conciseness2/5

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

The middle of the description is a 90-name enumeration of columns[0..11] params that duplicates the schema verbatim and pushes the two actually useful sentences (the inference caveat and the return keys) into the background. Structure is back-loaded and dominated by boilerplate.

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

Completeness2/5

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

For a 94-parameter tool with no output schema, the description does at least name the return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), which the schema does not cover. But it never says what data columns the report returns or what the key business filters do, leaving an agent unable to interpret or filter results with confidence.

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

Parameters3/5

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

Schema coverage is 100% but the per-parameter descriptions are tautological ('Query parameter "start"'), so the description could have added real meaning. Instead it mostly re-lists the same names; its only added value is making it apparent these are DataTables-style paging, sorting, and column-search params and flagging business filters like show_only_eligible_for_renewal, include_on_hold, and tag_ids. It does not explain what any of those filters do.

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

Purpose3/5

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

The description names the resource (batch renew jobs report) and the endpoint, but 'Get batch renew jobs report' largely restates the name and title. Among roughly 60 report siblings, nothing explains what this report contains or how it differs from, say, get_archived_jobs_report or search_jobs_report.

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

Usage Guidelines2/5

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

The only guidance is the caveat 'Inferred from the SingleOps web app's own traffic; confirm results', which describes reliability rather than when to use the tool. There is no guidance on when to choose this report over the many sibling report tools, and no exclusions or prerequisites.

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

singleops_read_get_client_labor_reportGet client labor reportB
Read-onlyIdempotent

Get client labor report. (GET /reports/client_labor) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds meaningful context by warning that the endpoint was inferred from observed traffic and results should be confirmed, and it lists the response keys. It still does not describe pagination behavior or reliability limits beyond the inference caveat.

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

Conciseness2/5

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

The purpose and endpoint are front-loaded, but the description then dumps a long raw list of DataTables query parameter names that largely restates the schema. That makes the definition unnecessarily bloated rather than concise.

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

Completeness3/5

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

For a complex 44-parameter report tool with no output schema, the description provides the endpoint, return keys, and an important inference caveat. However, it does not explain the semantics of the DataTables-style filters, the report contents, or how this report relates to sibling report tools, leaving real gaps for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 even though the schema descriptions are generic placeholders. The description enumerates many query parameter names seen in traffic, but it does not explain their meaning or syntax beyond what the schema already exposes.

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

Purpose4/5

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

The description states a specific verb and resource: "Get client labor report," and identifies the backing endpoint GET /reports/client_labor. It is clear what the tool retrieves, though it does not explicitly differentiate it from sibling report tools such as singleops_read_get_job_labor_report.

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

Usage Guidelines2/5

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

The description gives no when-to-use guidance and does not mention alternatives or exclusions. The caution "Inferred from the SingleOps web app's own traffic; confirm results" is useful context but is not usage guidance.

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

singleops_read_get_customer_history_reportGet customer history reportC
Read-onlyIdempotent

Get customer history report. (GET /reports/customer_history) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], columns[14][data], columns[14][name], columns[14][searchable], columns[14][orderable], columns[14][search][value], columns[14][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], select_years[], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
select_years[]NoQuery parameter "select_years[]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
columns[14][data]NoQuery parameter "columns[14][data]".
columns[14][name]NoQuery parameter "columns[14][name]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[14][orderable]NoQuery parameter "columns[14][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[14][searchable]NoQuery parameter "columns[14][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".
columns[14][search][regex]NoQuery parameter "columns[14][search][regex]".
columns[14][search][value]NoQuery parameter "columns[14][search][value]".

TDQS

C2.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description does add genuinely useful behavior context: the endpoint was reverse-engineered from observed traffic and results should be validated, and it names the response keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) despite no output schema. It does not disclose pagination defaults, size limits, or what 'select_years[]' controls.

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

Conciseness2/5

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

The core content is front-loaded and useful, but roughly 90% of the text is a 100+ item enumeration of query parameter names copy-pasted from the schema. This bloats the description enormously while adding zero information, and buries the one valuable caveat about inferred traffic.

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

Completeness3/5

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

Given 102 parameters, no output schema, and a warning that the endpoint is inferred, the description does supply return keys and a validation caveat, which are the right things to include. It still omits how to actually shape a call (which params matter, how filtering by year/client works) and how large responses are handled, so an agent must guess before invoking.

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

Parameters2/5

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

Nominal schema coverage is 100%, but every schema description is a tautology ('Query parameter "start".'), so the schema conveys no semantics. The description merely re-lists the same parameter names verbatim without explaining DataTables conventions (draw as a request echo, start/length as pagination, columns[n][search][value] as per-column filters), leaving the agent no better off than the raw names.

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

Purpose3/5

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

The first sentence names a specific verb and resource (get customer history report), so the intent is identifiable. However, nothing distinguishes it from the ~30 sibling report tools (customer type report, client labor report, payment totals report, etc.), so an agent cannot tell from the description which report answers which question.

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

Usage Guidelines2/5

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

There is no statement of when to call this report versus alternatives, no prerequisites, and no note about what data it covers (years, clients, date range). The only guidance is a caution that results were 'inferred from the SingleOps web app's own traffic; confirm results', which is a reliability warning, not usage direction.

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

singleops_read_get_customer_type_reportGet customer type reportC
Read-onlyIdempotent

Get customer type report. (GET /reports/customer_type_report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, operation_ids, sales_rep_ids, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
operation_idsNoQuery parameter "operation_ids".
sales_rep_idsNoQuery parameter "sales_rep_ids".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".

TDQS

C2.4/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description does add genuinely useful non-annotation context: the endpoint was "inferred from the SingleOps web app's own traffic" and results should be confirmed, which warns the agent the contract is unverified, and it lists the response keys. It stops short of saying what data the report actually returns.

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

Conciseness2/5

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

Purpose and the useful caveat are front-loaded, but the bulk of the text is a comma-separated dump of ~44 query parameter names that the agent already receives verbatim in the schema at 100% coverage. That duplication dominates the description and pushes the one valuable sentence (traffic-inferred, confirm results) into the middle.

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

Completeness3/5

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

For a 44-parameter tool with no output schema, the description does supply the return-key list and a caveat about reliability, which is more than nothing. However it leaves the agent without the essentials: which parameters are meaningful, typical pagination/date-range conventions, and what the report's rows represent.

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

Parameters3/5

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

Schema coverage is 100%, though the schema descriptions are pure tautologies ("Query parameter \"draw\""). The description merely echoes the same parameter names in a flat list and adds no semantics for what DataTables-style params (draw, start, length, columns[n][search][value]) or business filters (operation_ids, sales_rep_ids, table_filter_start/end) actually mean. High coverage makes 3 the correct baseline.

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

Purpose2/5

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

The first sentence, "Get customer type report," simply restates the tool name and title with no added specificity about what the report contains (customer type breakdown of what — revenue, jobs, visits?). The endpoint path is the only concrete detail, and it does nothing to distinguish this from the ~30 sibling report tools in the same family.

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

Usage Guidelines2/5

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

There is no guidance on when this report should be chosen over the many sibling reports (get_net_sales_report, get_customer_history_report, get_sales_rep_report, etc.), no prerequisites, and no mention of how to supply the date range or filters. "Confirm results" is a reliability caveat, not usage guidance.

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

singleops_read_get_custom_inputs_reportGet custom inputs reportC
Read-onlyIdempotent

Get custom inputs report. (GET /reports/custom_inputs_report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, custom_input_id, sales_rep_ids, operation_id, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
operation_idNoQuery parameter "operation_id".
order[0][dir]NoQuery parameter "order[0][dir]".
sales_rep_idsNoQuery parameter "sales_rep_ids".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
custom_input_idNoQuery parameter "custom_input_id".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".

TDQS

C2.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so safety is covered. The description adds genuinely useful context beyond them: the parameters were reverse-engineered from observed traffic and results should be confirmed, and it names the JSON response keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings).

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

Conciseness2/5

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

The description dumps roughly 40 query parameter names verbatim, duplicating the input schema and pushing the genuinely useful information (traffic-inferred caveat, response keys) into a wall of noise. The signal-to-noise ratio is poor and the important caveat is buried mid-sentence.

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

Completeness3/5

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

For a 53-parameter tool with no output schema, the description does supply the return keys, which helps. But it never explains how to practically drive the DataTables-style parameters or which subset matters for a typical report query, leaving an agent to guess among 53 optional params.

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

Parameters3/5

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

Schema description coverage is 100%, but every property description is a trivial echo ('Query parameter "draw".'), and the description's long param list merely repeats those names without explaining DataTables semantics (draw/start/length, columns[N][search][value], order[0][dir]). Baseline 3 applies since the schema nominally documents all params, but no real meaning is added.

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

Purpose2/5

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

The description restates the tool name almost verbatim ('Get custom inputs report') and adds only the raw endpoint path. With 60+ sibling report tools, nothing distinguishes this report from get_sales_rep_report, get_items_report, etc., so an agent cannot tell what data it actually returns.

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

Usage Guidelines2/5

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

The only guidance is 'Inferred from the SingleOps web app's own traffic; confirm results', which is a reliability caveat rather than usage guidance. There is no statement of when to choose this report over the many sibling reports or what prerequisites/filters are needed.

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

singleops_read_get_dashboardGet dashboard by idA
Read-onlyIdempotent

Get dashboard by id. (GET /api/v1/dashboards/{id}) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: id, account_id, title, layouts, created_at, updated_at, user_id.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context: the route was inferred from observed traffic and results should be confirmed, which warns the agent the behavior may be approximate. It stops short of mentioning auth or pagination, so a 4 rather than a 5.

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

Conciseness5/5

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

Three compact clauses: the purpose, the concrete endpoint, and the reliability caveat plus return keys. Everything is front-loaded and no sentence is filler.

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

Completeness4/5

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

With no output schema, the description compensates by enumerating the returned JSON keys (id, account_id, title, layouts, timestamps, user_id), which is enough for an agent to plan around the result. Combined with the read-only annotations, the definition is nearly complete; only auth and error behavior are absent.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents id, extra_query and response_format, making 3 the baseline. The description adds nothing about parameter meaning beyond the implied record id, so it does not exceed that baseline.

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

Purpose4/5

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

The description states a specific verb+resource ('Get dashboard by id') and pins it down with the concrete endpoint GET /api/v1/dashboards/{id}, so an agent knows exactly what resource is fetched. It does not explicitly differentiate itself from nearby siblings like singleops_read_list_widgets, so it falls just short of 5.

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

Usage Guidelines2/5

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

There is no statement of when to use this over alternatives, no prerequisites, and no exclusions. The note 'Inferred from the SingleOps web app's own traffic; confirm results' is a reliability caveat, not usage guidance, so the agent is left to infer the call context.

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

singleops_read_get_equipment_utilization_reportGet equipment utilization reportB
Read-onlyIdempotent

Get equipment utilization report. (GET /reports/equipment_utilization) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. The description adds useful context that the endpoint was inferred from app traffic and that results should be confirmed, plus the top-level return keys.

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

Conciseness2/5

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

The description front-loads the purpose and endpoint well, but it then dumps dozens of raw query parameter names in a single run-on list. Much of that list is redundant with the schema and makes the description unnecessarily bloated.

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

Completeness3/5

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

It provides the endpoint, a reliability caveat, a raw parameter list, and top-level JSON return keys, which helps because there is no output schema. However, for an 86-parameter report tool it does not explain report content, key filters, defaults, or the markdown/json response_format behavior.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description lists the query parameters seen and the return keys, but it does not explain what the DataTables-style parameters mean or how key filters like table_filter_start and table_filter_end should be used.

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

Purpose4/5

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

The description states a specific verb and resource: 'Get equipment utilization report' and gives the endpoint path. It is clear what report is being fetched, though it does not explicitly distinguish this report from the many sibling report tools beyond the resource name.

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

Usage Guidelines2/5

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

The only guidance is 'Inferred from the SingleOps web app's own traffic; confirm results,' which is a reliability caveat rather than when-to-use guidance. It does not name alternatives or explain when this report should be chosen over other report tools.

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

singleops_read_get_global_planner_reportGet global planner reportC
Read-onlyIdempotent

Get global planner report. (GET /reports/global_planner) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, client_select, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
client_selectNoQuery parameter "client_select".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, non-destructive, and open-world behavior. The description adds useful provenance ("Inferred from the SingleOps web app's own traffic") and lists returned keys, but it does not explain report behavior, filtering semantics, or pagination beyond repeating parameter names.

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

Conciseness2/5

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

The opening sentence is concise and front-loaded, but the description then dumps a massive redundant list of fifty-plus query parameter names already present in the schema. That list is unreadable and does not earn its place.

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

Completeness3/5

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

For a complex 57-parameter endpoint with no output schema, the description does include the return keys, which is helpful. However, it does not explain the report's content, how the date filters should be used, or how the DataTables parameters interact, leaving significant gaps.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 even though the schema descriptions are mostly tautological (e.g., "Query parameter draw"). The description merely repeats the same parameter names in a comma-separated list and adds no meaning about filters like table_filter_start/end or the DataTables-style parameters.

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

Purpose4/5

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

The description states a specific verb and resource ("Get global planner report") and names the backing endpoint (GET /reports/global_planner). It does not distinguish this report from the many sibling report tools or explain what the report contains.

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

Usage Guidelines2/5

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

There is no guidance on when to use this report versus alternatives such as get_dashboard, list_widgets, or the other report tools. The only guidance-like remark is the caveat "confirm results," which is about reliability rather than tool selection.

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

singleops_read_get_inventory_transactions_reportGet inventory transactions reportA
Read-onlyIdempotent

Get inventory transactions report. (POST /reports/inventory_transactions) Inferred from the SingleOps web app's own traffic; confirm results. Rails form fields (pass as nested objects, e.g. {"client": {"first_name": "…"}}; send only what you set): start_date, end_date. Returns {ok, status, redirect, id} on success (the new/updated record id), or validation errors. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.5/5.0
Behavior3/5

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

Adds genuine value beyond the annotations: it discloses that the route was inferred from observed web traffic ("confirm results"), that the query is read-only despite using POST, and the success envelope {ok, status, redirect, id}. The parenthetical "(the new/updated record id)" is boilerplate residue implying a mutation, which is at odds with readOnlyHint=true, though the explicit "Read-only query sent as POST" sentence makes the intent clear.

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

Conciseness5/5

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

Purpose is front-loaded in the first clause, followed by endpoint, confidence caveat, field list, and return shape in tight succession. No sentence is decorative; even the caveat about inferred traffic earns its place by setting expectations for verification.

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

Completeness4/5

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

With no output schema, the description supplies a return envelope and error behavior, which covers the main gap. Remaining unknowns (report columns, date format, pagination) are minor for a read-only report call whose safety profile is fully declared by annotations.

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%, but the body is a free-form object with only additionalProperties, so the description's listing of start_date/end_date and the nested-object convention with a concrete example materially extend the schema. Date format and pagination/limit parameters remain unspecified.

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

Purpose4/5

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

States a specific verb and resource ("Get inventory transactions report") and even names the underlying endpoint POST /reports/inventory_transactions. It does not differentiate itself from closely-named report siblings such as singleops_read_get_tree_inventory_report or singleops_read_get_items_report, so an agent must infer the boundary.

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

Usage Guidelines2/5

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

There is no when-to-use / when-not-to-use guidance and no named alternative among the ~70 sibling report tools. The only procedural guidance concerns how to shape the body, not when this tool is the right choice.

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

singleops_read_get_item_groups_reportGet item groups reportC
Read-onlyIdempotent

Get item groups report. (GET /reports/item_groups_report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, visit_stages[], assignees, sales_reps, tags, date_applied_to, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
tagsNoQuery parameter "tags".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
assigneesNoQuery parameter "assignees".
sales_repsNoQuery parameter "sales_reps".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
visit_stages[]NoQuery parameter "visit_stages[]".
date_applied_toNoQuery parameter "date_applied_to".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds a meaningful caveat that the endpoint was inferred from observed traffic and results should be confirmed — useful context beyond annotations — but it says nothing about pagination, rate limits, or result shape beyond listing keys.

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

Conciseness2/5

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

The purpose and caveat are front-loaded, which is good, but the description then dumps a massive 55-item parameter list that merely duplicates the schema keys, bloating the text without adding information. That enumeration does not earn its space.

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

Completeness3/5

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

For a 55-parameter report tool with no output schema, the description does list the return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), which partially substitutes for an output schema. But it leaves the meaning of the many filter/column parameters and the actual report content unexplained, so an agent cannot construct a meaningful call beyond guessing.

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

Parameters3/5

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

Schema description coverage is nominally 100%, but every property description is a tautology ('Query parameter "draw".'), so the schema provides no real semantic value. The description only enumerates parameter names with no explanation of meaning, format, or which are important, leaving effective semantic coverage low despite the reported number.

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

Purpose4/5

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

States a specific verb and resource ('Get item groups report') and cites the underlying endpoint GET /reports/item_groups_report. However, it does not distinguish this report from close siblings like singleops_read_list_item_groups or singleops_read_get_items_report, so an agent cannot easily tell which one applies from the text alone.

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

Usage Guidelines2/5

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

There is no explicit when-to-use, when-not-to-use, or alternative recommendation. The only caveat is 'Inferred from the SingleOps web app's own traffic; confirm results,' which is a reliability warning rather than routing guidance.

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

singleops_read_get_items_reportGet items reportB
Read-onlyIdempotent

Get items report. (GET /reports/items_report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, visit_stages[], assignees, sales_reps, tags, date_applied_to, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
tagsNoQuery parameter "tags".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
assigneesNoQuery parameter "assignees".
sales_repsNoQuery parameter "sales_reps".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
visit_stages[]NoQuery parameter "visit_stages[]".
date_applied_toNoQuery parameter "date_applied_to".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower, and the description adds genuinely useful provenance context: the endpoint and parameters were 'inferred from the SingleOps web app's own traffic; confirm results.' That is a meaningful reliability caveat an agent should know. It stops short of describing pagination defaults, auth needs, or rate limits.

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

Conciseness2/5

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

After a front-loaded purpose sentence, the description devolves into a ~60-item verbatim dump of parameter names that duplicates the input schema, making it hard to scan. The trailing return-key list is somewhat useful but the body is largely redundant bulk.

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

Completeness3/5

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

For a 79-parameter tool with no output schema, the description does supply the return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), which fills the output-schema gap partially. But it never explains what the report's data rows contain or how the ten column groupings map to real fields, leaving the agent under-informed about result interpretation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents every parameter, and the description's long enumeration of query params merely repeats those names with zero added meaning (no formats, defaults, or interactions). Baseline 3 applies since the schema carries the semantic load.

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

Purpose4/5

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

The first sentence plus the GET path make the verb and resource explicit: this fetches the items report. However, it never says what an 'items report' actually contains or how it differs from close siblings like get_item_groups_report, get_master_line_item_report, or list_items, so the agent cannot disambiguate on purpose alone.

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

Usage Guidelines2/5

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

There is no statement of when to call this instead of the many neighboring report tools, nor any prerequisite or exclusion. The only guidance-ish text is 'confirm results,' which cautions about reliability but does not route the agent among alternatives.

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

singleops_read_get_job_expenses_reportGet job expenses reportB
Read-onlyIdempotent

Get job expenses report. (POST /reports/job_expenses) Inferred from the SingleOps web app's own traffic; confirm results. Rails form fields (pass as nested objects, e.g. {"client": {"first_name": "…"}}; send only what you set): start_date, end_date. Returns {ok, status, redirect, id} on success (the new/updated record id), or validation errors. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so safety is covered. The description adds genuinely useful context beyond that: the 'Inferred from the SingleOps web app's own traffic; confirm results' reliability caveat, the fact that a read-only query is sent as a POST with filters in the body, and the return shape {ok, status, redirect, id} or validation errors.

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

Conciseness4/5

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

Front-loaded with the endpoint and return format, and every sentence adds information. It is somewhat dense with parentheticals, but there is little waste.

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

Completeness3/5

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

Endpoint, fields, format, and return shape are covered for a read-only report. However, the 'new/updated record id' phrasing is boilerplate that reads oddly for a read-only query, and the description gives no help distinguishing this report from the large sibling set, leaving the selection task incomplete.

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%, but the body property only says 'Match the fields listed in the description,' so the description carries the real documentation burden. It names the actual fields (start_date, end_date) and explains the nested Rails form-field format with an example, adding meaning the schema does not provide.

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

Purpose3/5

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

The core sentence 'Get job expenses report' essentially restates the title, offering no differentiation from the ~40 sibling report tools (job_labor_report, job_profit_margin_report, etc.). It does add the concrete endpoint (POST /reports/job_expenses) and notes filters go in the body, which gives some specificity, but an agent still cannot tell why to pick this report over the others.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus the many alternative report tools, nor any prerequisites or exclusions. Usage is only implied by the report name itself.

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

singleops_read_get_job_labor_reportGet job labor reportC
Read-onlyIdempotent

Get job labor report. (GET /reports/job_labor) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, sales_reps, operations, assignees, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
assigneesNoQuery parameter "assignees".
operationsNoQuery parameter "operations".
sales_repsNoQuery parameter "sales_reps".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, so safety needs no explanation. The description does add genuinely useful context: the tool was reverse-engineered from observed web traffic and its results should be verified, which is behavioral information an agent cannot get from annotations. It says nothing about permissions, date-range defaults, or pagination behavior.

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

Conciseness2/5

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

The description is dominated by a ~70-item comma-separated dump of parameter names that conveys no meaning and buries the single important sentence (confirm inferred results). Front-loading is fine, but the bulk of the text does not earn its place.

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

Completeness3/5

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

It helpfully names the response keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), which compensates for the absent output schema. But for an 83-parameter DataTables endpoint with zero required params, it gives no guidance on which parameters matter for a meaningful call or how the results are shaped.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. However, both the schema descriptions and this enumeration are purely tautological ("Query parameter 'draw'"), and the description merely repeats parameter names without explaining what any of them mean — notably start/length pagination, search[value], the table_filter_* date bounds, or the sales_reps/operations/assignees filters.

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

Purpose4/5

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

The first sentence plus the route (GET /reports/job_labor) states a specific resource and action, so an agent knows this returns a job-level labor report. It does not distinguish itself from the closely named sibling singleops_read_get_client_labor_report, but the job vs. client scope is at least implied by the name.

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

Usage Guidelines2/5

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

There is no statement of when to use this report versus the many other report siblings (client labor, job expenses, timesheet totals, etc.) or of prerequisites. 'Inferred from the SingleOps web app's own traffic; confirm results' is a reliability caveat, not usage guidance.

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

singleops_read_get_job_profit_margin_reportGet job profit margin reportB
Read-onlyIdempotent

Get job profit margin report. (GET /reports/job_profit_margin) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], columns[14][data], columns[14][name], columns[14][searchable], columns[14][orderable], columns[14][search][value], columns[14][search][regex], columns[15][data], columns[15][name], columns[15][searchable], columns[15][orderable], columns[15][search][value], columns[15][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, visit_stages[], visit_operations, visit_sales_reps, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
visit_stages[]NoQuery parameter "visit_stages[]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
visit_operationsNoQuery parameter "visit_operations".
visit_sales_repsNoQuery parameter "visit_sales_reps".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
columns[14][data]NoQuery parameter "columns[14][data]".
columns[14][name]NoQuery parameter "columns[14][name]".
columns[15][data]NoQuery parameter "columns[15][data]".
columns[15][name]NoQuery parameter "columns[15][name]".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[14][orderable]NoQuery parameter "columns[14][orderable]".
columns[15][orderable]NoQuery parameter "columns[15][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[14][searchable]NoQuery parameter "columns[14][searchable]".
columns[15][searchable]NoQuery parameter "columns[15][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".
columns[14][search][regex]NoQuery parameter "columns[14][search][regex]".
columns[14][search][value]NoQuery parameter "columns[14][search][value]".
columns[15][search][regex]NoQuery parameter "columns[15][search][regex]".
columns[15][search][value]NoQuery parameter "columns[15][search][value]".

TDQS

B3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, but the description adds genuinely useful disclosure: this endpoint was inferred from the SingleOps web app's own traffic and results should be confirmed. That is real behavioral context an agent otherwise couldn't infer. It stops short of noting rate limits or pagination behavior of the DataTables response.

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

Conciseness2/5

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

The purpose and endpoint are front-loaded correctly, but the bulk is an enormous verbatim dump of column/order/search parameter names that duplicates the schema and adds no information. This bloats the definition and buries the one high-value sentence (the provenance caveat).

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

Completeness3/5

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

Given 113 optional params and no output schema, the description does helpfully enumerate the JSON response keys (draw, recordsTotal, data, meta, table_id, settings) and warns about reliability. But it leaves the 100+ parameters semantically opaque, so an agent still cannot confidently construct a filtered request.

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

Parameters2/5

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

Nominal schema coverage is 100%, but every schema description is a tautology ('Query parameter "draw".'), and the description simply re-lists the same 100+ parameter names verbatim. No meaning is added for key params like draw/start/length (DataTables paging), table_filter_start/end, or visit_stages[], which are the ones an agent would actually need explained.

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

Purpose4/5

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

States a specific verb+resource ('Get job profit margin report') that, combined with the endpoint, unambiguously identifies the resource. However, the description never names the very close sibling singleops_read_get_visit_profit_margin_report, so differentiation is left to the tool name alone.

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

Usage Guidelines2/5

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

No statement of when to use this report vs the visit-level profit margin report or other report siblings, and no prerequisites for the DataTables query params. The only guidance-adjacent text is the provenance caveat 'Inferred from traffic; confirm results,' which is about trust, not selection.

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

singleops_read_get_master_line_item_reportGet master line item reportC
Read-onlyIdempotent

Get master line item report. (POST /reports/master_line_item) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

C2.9/5.0
Behavior4/5

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

The annotations already cover read-only and idempotence. The description adds two things: it resolves the tension of a POST that doesn't mutate ('Read-only query sent as POST, filters go in body') and warns the payload was inferred from web traffic and should be confirmed. Those are real behavioral disclosures.

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

Conciseness2/5

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

The purpose and the return keys come first, but most of the description is a raw, repetitive list of 40+ DataTables body keys (columns[0] through [6] spelled out). That bulk crowds out useful explanation and makes the description hard to scan.

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

Completeness3/5

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

There is no output schema, so listing the return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) partly compensates. But the description never says what the report's data rows or columns actually are, which is the key missing context for an agent choosing among report tools.

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

Parameters3/5

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

The schema documents all three parameters, so 3 is the baseline. The description enumerates the body keys (draw, columns[i][data/name/searchable]...), which slightly helps an agent build the body. But it never explains what the DataTables keys mean, so it adds little semantic value.

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

Purpose3/5

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

The description names a verb and resource ('Get master line item report') and adds the endpoint and return keys. But it never says what the report contains or how it differs from the many other report tools. An agent can't tell this apart from them.

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

Usage Guidelines2/5

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

No when-to-use/how-to-choose guidance versus the other report tools. The only usage-ish note is a reliability caveat ('confirm results'), not selection help. The 'read-only query sent as POST' line helps explain the call shape, not when to call.

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

singleops_read_get_net_sales_reportGet net sales reportC
Read-onlyIdempotent

Get net sales report. (GET /reports/net_sales) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], columns[14][data], columns[14][name], columns[14][searchable], columns[14][orderable], columns[14][search][value], columns[14][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, operation_id, sales_rep_id, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
operation_idNoQuery parameter "operation_id".
sales_rep_idNoQuery parameter "sales_rep_id".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
columns[14][data]NoQuery parameter "columns[14][data]".
columns[14][name]NoQuery parameter "columns[14][name]".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[14][orderable]NoQuery parameter "columns[14][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[14][searchable]NoQuery parameter "columns[14][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".
columns[14][search][regex]NoQuery parameter "columns[14][search][regex]".
columns[14][search][value]NoQuery parameter "columns[14][search][value]".

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already establish readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description does add genuine value by disclosing that the endpoint was inferred from the SingleOps web app's own traffic and results should be confirmed, plus a summary of the return keys. However it says nothing about permissions, pagination defaults, or rate/volume limits on a report that can return large tables.

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

Conciseness2/5

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

The description is front-loaded acceptably, but roughly 80% of its length is a run-on enumeration of 100+ parameter names already present in the schema, which buries the one useful caveat. It is padded rather than concise.

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

Completeness2/5

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

For a 106-parameter tool with no output schema, the description should explain the handful of parameters an agent would realistically set and how they interact. Instead it dumps the raw list, leaving the agent unable to distinguish required filtering from optional DataTables plumbing; only the return-key list and reliability caveat are genuinely useful.

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

Parameters2/5

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

Schema coverage is nominally 100%, but every schema property is a tautology ('Query parameter "draw"'), so the schema conveys no real meaning. The description then repeats the identical bare parameter names, adding zero semantics for the parameters that actually matter (table_filter_start/end, report_range_cache, operation_id, sales_rep_id) and never explaining the DataTables draw/start/length or columns[n][search][value] conventions.

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

Purpose4/5

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

States a specific verb and resource ('Get net sales report') and anchors it to an endpoint (GET /reports/net_sales), so an agent knows what it returns. It does not differentiate from the many sibling report tools (get_sales_rep_report, get_payment_totals_report, etc.), which matters given how many near-identical names exist.

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

Usage Guidelines2/5

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

There is no statement of when to use this report versus the dozens of sibling report tools, no prerequisites, and no indication of what filters select this report's data. The only guidance is the caveat 'confirm results', which is a reliability warning rather than usage routing.

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

singleops_read_get_operation_performance_reportGet operation performance reportB
Read-onlyIdempotent

Get operation performance report. (GET /reports/operation_performance_report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: the parameters were 'inferred from the SingleOps web app's own traffic' and results should be confirmed, which warns the agent the schema may be incomplete or inaccurate. It also enumerates the response keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), useful since there is no output schema.

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

Conciseness2/5

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

The first two sentences are appropriately front-loaded, but the ~50-item inline parameter dump duplicates the schema verbatim and buries the one genuinely useful line ('inferred from traffic; confirm results'). Significant waste that pushes the actionable caveat into the middle of noise.

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

Completeness3/5

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

For a 56-parameter, zero-required tool with no output schema, the description does supply response keys and a provenance caveat. However it never explains which of the 56 params matter in practice, omits any mention of the response_format enum, and gives no pagination or default-value guidance, leaving the agent to guess how to make a usable call.

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

Parameters3/5

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

Schema description coverage is 100%, but every schema description is a tautological placeholder (e.g. 'Query parameter "draw".'), so the real semantics of DataTables params like draw/start/length/order are never explained anywhere. The description merely re-lists the parameter names already present in the schema, adding no meaning beyond them. Baseline 3 applies given high coverage.

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

Purpose4/5

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

Names a specific verb and resource ('Get operation performance report') plus the underlying endpoint, so the agent knows it retrieves a report. It is distinguishable from the many sibling report tools by the resource name, though it doesn't say what the report actually contains (jobs? visits? revenue?).

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

Usage Guidelines2/5

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

No indication of when this report is the right choice versus the other ~30 report tools in the sibling list, no prerequisites, no mention of what time range or filters to supply. Only the caveat 'confirm results' hints at caution, which is reliability guidance rather than usage routing.

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

singleops_read_get_payment_records_reportGet payment records reportC
Read-onlyIdempotent

Get payment records report. (GET /reports/payment_records_report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], columns[14][data], columns[14][name], columns[14][searchable], columns[14][orderable], columns[14][search][value], columns[14][search][regex], columns[15][data], columns[15][name], columns[15][searchable], columns[15][orderable], columns[15][search][value], columns[15][search][regex], columns[16][data], columns[16][name], columns[16][searchable], columns[16][orderable], columns[16][search][value], columns[16][search][regex], columns[17][data], columns[17][name], columns[17][searchable], columns[17][orderable], columns[17][search][value], columns[17][search][regex], columns[18][data], columns[18][name], columns[18][searchable], columns[18][orderable], columns[18][search][value], columns[18][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, operation_id, include_quickbooks, only_refunds, sales_rep_ids, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
only_refundsNoQuery parameter "only_refunds".
operation_idNoQuery parameter "operation_id".
order[0][dir]NoQuery parameter "order[0][dir]".
sales_rep_idsNoQuery parameter "sales_rep_ids".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
columns[14][data]NoQuery parameter "columns[14][data]".
columns[14][name]NoQuery parameter "columns[14][name]".
columns[15][data]NoQuery parameter "columns[15][data]".
columns[15][name]NoQuery parameter "columns[15][name]".
columns[16][data]NoQuery parameter "columns[16][data]".
columns[16][name]NoQuery parameter "columns[16][name]".
columns[17][data]NoQuery parameter "columns[17][data]".
columns[17][name]NoQuery parameter "columns[17][name]".
columns[18][data]NoQuery parameter "columns[18][data]".
columns[18][name]NoQuery parameter "columns[18][name]".
include_quickbooksNoQuery parameter "include_quickbooks".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[14][orderable]NoQuery parameter "columns[14][orderable]".
columns[15][orderable]NoQuery parameter "columns[15][orderable]".
columns[16][orderable]NoQuery parameter "columns[16][orderable]".
columns[17][orderable]NoQuery parameter "columns[17][orderable]".
columns[18][orderable]NoQuery parameter "columns[18][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[14][searchable]NoQuery parameter "columns[14][searchable]".
columns[15][searchable]NoQuery parameter "columns[15][searchable]".
columns[16][searchable]NoQuery parameter "columns[16][searchable]".
columns[17][searchable]NoQuery parameter "columns[17][searchable]".
columns[18][searchable]NoQuery parameter "columns[18][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".
columns[14][search][regex]NoQuery parameter "columns[14][search][regex]".
columns[14][search][value]NoQuery parameter "columns[14][search][value]".
columns[15][search][regex]NoQuery parameter "columns[15][search][regex]".
columns[15][search][value]NoQuery parameter "columns[15][search][value]".
columns[16][search][regex]NoQuery parameter "columns[16][search][regex]".
columns[16][search][value]NoQuery parameter "columns[16][search][value]".
columns[17][search][regex]NoQuery parameter "columns[17][search][regex]".
columns[17][search][value]NoQuery parameter "columns[17][search][value]".
columns[18][search][regex]NoQuery parameter "columns[18][search][regex]".
columns[18][search][value]NoQuery parameter "columns[18][search][value]".

TDQS

C2.6/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuine context beyond that: results were reverse-engineered from web traffic and should be confirmed, and it lists the JSON keys returned (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings). It still does not explain pagination semantics, auth needs, or rate limits, so a 3 is appropriate.

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

Conciseness2/5

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

The purpose and endpoint are front-loaded, but the body is a ~100-item verbatim dump of query parameter names that carries no information an agent can act on. It is long without being informative, violating the 'every sentence earns its place' standard.

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

Completeness2/5

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

For a 132-parameter report endpoint with no output schema, the description should explain paging behavior, what the report rows represent, and how the key filters work. It only lists return keys and warns that results were inferred, leaving an agent unable to construct a correct query beyond passing raw DataTables parameters.

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

Parameters3/5

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

Schema description coverage is nominally 100%, so the baseline is 3, but the schema descriptions are tautologies ('Query parameter "draw".') and the description merely re-lists the same raw parameter names without meaning. Filters that actually matter (only_refunds, sales_rep_ids, include_quickbooks, table_filter_start/end, start/length paging) get no explanation of accepted formats or effects, so no value is added above the schema.

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

Purpose3/5

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

The description states a verb ('Get') and a resource ('payment records report') plus the underlying endpoint, so the basic action is identifiable. However, it never explains what a 'payment record' contains or how this differs from close siblings such as singleops_read_get_payment_totals_report or singleops_read_get_net_sales_report; the title and description are effectively identical.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this report over the many other report tools, no prerequisites, and no exclusions. The only contextual note is 'Inferred from traffic; confirm results', which is not usage guidance.

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

singleops_read_get_payment_totals_reportGet payment totals reportA
Read-onlyIdempotent

Get payment totals report. (POST /reports/payment_totals_report) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes beyond them by disclosing that this read is issued as a POST with filters in the body, that the field set was inferred from observed traffic and should be verified, and that the response carries DataTables-style keys. The inference caveat is genuinely valuable context not captured anywhere in structured fields.

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?

Front-loaded correctly: purpose, endpoint, and the verification caveat come first. However, the ~40-item flat key dump is bulky and unstructured, and a more compact pattern notation (columns[0-4][data|name|searchable|orderable|search][value|regex]) would carry the same information in a fraction of the space.

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

Completeness4/5

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

For a three-parameter report tool with no output schema, the description supplies both the request body shape and the top-level response keys, plus the POST-for-read quirk. An agent can construct a plausible call and interpret the result without further discovery; only per-key semantics and pagination behavior remain unstated.

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%, but the body parameter is an open additionalProperties object, so the description's enumeration of the accepted body keys (draw, columns[n][*], order[0][*], start, length, search[*], table_filter_start/end, report_range_cache) is real added value the schema cannot convey. It stops short of explaining what individual keys mean — e.g. table_filter_start/end are presumably date bounds but that is left to inference.

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

Purpose4/5

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

The description names a specific verb and resource ('Get payment totals report') and pins it to the concrete endpoint POST /reports/payment_totals_report. It is distinguishable from most siblings but never differentiates itself from the very similar singleops_read_get_payment_records_report, which an agent would also consider.

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

Usage Guidelines2/5

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

There is no statement of when to use this report versus the adjacent payment_records report or the other report tools. The only guidance is a caveat ('confirm results'), which is about trust, not about tool selection.

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

singleops_read_get_purchase_orders_reportGet purchase orders reportC
Read-onlyIdempotent

Get purchase orders report. (GET /reports/purchase_orders) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, operation_id, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
operation_idNoQuery parameter "operation_id".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds a genuinely useful caveat that the endpoint was inferred from observed web-app traffic and results should be confirmed, plus the return keys. It does not explain pagination or the DataTables semantics of the query params, so it goes beyond annotations only modestly.

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

Conciseness2/5

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

The description is dominated by a 60-plus-item verbatim parameter dump that duplicates the schema and pushes the one useful caveat out of the front position. The actual intent and return keys are buried after the noise.

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

Completeness2/5

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

For a 75-parameter tool with no output schema, the description should clarify the DataTables request model and how to paginate/filter, but it does not. Listing return keys (draw, recordsTotal, recordsFiltered, data, meta...) helps somewhat, but the functional gaps remain large.

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

Parameters2/5

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

Although schema description coverage is nominally 100%, every property description is a tautology ('Query parameter "draw"'), so the schema conveys no meaning. The description's long 'Query params seen' list merely duplicates those names without explaining DataTables conventions like draw/start/length or column ordering, so it adds no semantic value over the schema.

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

Purpose4/5

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

The first two sentences name a specific verb and resource (get purchase orders report) and give the underlying route GET /reports/purchase_orders. It is distinguishable from singleops_read_list_purchase_orders by being a report endpoint, though the description never explicitly states that distinction.

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

Usage Guidelines2/5

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

There is no guidance on when to use this report versus the related singleops_read_list_purchase_orders or the many other report tools. The only usage-adjacent statement is the caveat to 'confirm results', which is about trust, not tool selection.

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

singleops_read_get_qbo_statusQuickBooks connection statusA
Read-onlyIdempotent

Report the QuickBooks Online connection settings. Check before any bulk write: writes sync to QuickBooks.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered structurally. The description adds genuinely useful system-level context (writes propagate to QuickBooks), but it does not say what the response contains — e.g., whether it reports a connected/disconnected state or sync configuration — which is the main behavioral unknown here.

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

Conciseness5/5

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

Two short sentences, both earning their place: the first states what is returned, the second states when to call it. The actionable trigger is front-loaded in the imperative and there is no filler.

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

Completeness4/5

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

With no parameters, no nested objects, and no output schema, the description supplies nearly everything needed to call this correctly. The remaining gap is the shape of the reported settings and the unresolved overlap with the QuickBooks account-settings sibling tool.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter discussion is needed and none is attempted.

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

Purpose4/5

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

The description pairs a specific verb ("Report") with a specific resource ("QuickBooks Online connection settings"), so an agent immediately knows this is a read of QBO integration state. It does not, however, distinguish itself from the similar-sounding sibling singleops_read_list_account_settings_options_quickbooks, which an agent could plausibly confuse it with.

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

Usage Guidelines4/5

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

"Check before any bulk write: writes sync to QuickBooks" gives a concrete, actionable trigger condition that an agent can act on without inference. It offers no exclusions or named alternatives, and the overlap with the QuickBooks account-settings sibling is left unaddressed.

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

singleops_read_get_sales_rep_reportGet sales rep reportB
Read-onlyIdempotent

Get sales rep report. (GET /reports/sales_rep) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, operations, date_filter_column, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
operationsNoQuery parameter "operations".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
date_filter_columnNoQuery parameter "date_filter_column".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".

TDQS

B3.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description still adds genuine value by disclosing provenance ('inferred from the web app's own traffic; confirm results') and by enumerating return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) despite there being no output schema.

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

Conciseness2/5

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

The first two sentences are well front-loaded, but the bulk of the text is an ~80-item enumeration of query parameters that duplicates the input schema verbatim and conveys no additional information. That padding dilutes the two sentences that actually matter.

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

Completeness2/5

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

Return keys are covered, which offsets the missing output schema, but for an 88-parameter DataTables endpoint the description omits the essential usage contract: pagination via start/length, the draw echo, global vs per-column search, ordering, and the semantics of report_range_cache / date_filter_column. An agent cannot call this confidently without reverse-engineering the schema.

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

Parameters3/5

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

Schema description coverage is 100% (88 params), so the baseline is 3. The description merely re-lists the parameter names already in the schema and adds no meaning for the DataTables contract — nothing explains that draw is an echo counter, start/length control pagination, or that columns[N][search][value] is a per-column filter.

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

Purpose4/5

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

States a specific verb and resource ('Get sales rep report') and pins the exact endpoint (GET /reports/sales_rep), so an agent knows precisely what data this returns. It does not, however, differentiate itself from the ~30 other report siblings (net sales, job labor, payment totals), leaving disambiguation to the name alone.

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

Usage Guidelines2/5

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

There is no statement of when to pick this report over the many sibling reports, no prerequisites, and no note on required date ranges or permissions. The only guidance-like text, 'confirm results', is a reliability caveat rather than usage direction.

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

singleops_read_get_taskGet task by idB
Read-onlyIdempotent

Get task by id. (GET /tasks/{id}.json) Inferred from the SingleOps web app's own traffic; confirm results. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds a useful caveat that the route was inferred from web-app traffic and results should be confirmed, but says nothing about error behavior or what happens with a missing/invalid id.

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

Conciseness4/5

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

Short and front-loaded: the action comes first, then the endpoint, then the reliability caveat. Slight tension exists between 'returns the endpoint's JSON response' and the schema's markdown default for response_format.

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

Completeness3/5

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

With no output schema, the description should say more about the returned shape; it instead defers with 'the endpoint's JSON response.' Adequate for a simple by-id read, but the return contract is left vague against many sibling list tools.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters are documented in the schema. The description only restates that id is a path parameter and that a JSON response comes back, adding no syntax or format detail beyond structured fields.

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

Purpose4/5

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

States a specific verb and resource (get a task by id) and anchors it to the underlying endpoint GET /tasks/{id}.json. It does not, however, differentiate from the many sibling task readers such as singleops_read_search_tasks, singleops_read_list_tasks_calendar, or singleops_read_list_client_tasks.

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

Usage Guidelines2/5

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

No guidance on when to use this single-record fetch versus the search/list task siblings. The agent must infer from the tool name alone that this is the direct-by-id path.

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

singleops_read_get_timesheet_summary_reportGet timesheet summary reportC
Read-onlyIdempotent

Get timesheet summary report. (GET /reports/timesheet_summary_report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, timesheet_statuses, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
timesheet_statusesNoQuery parameter "timesheet_statuses".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description's added value is the honest disclosure that this endpoint was inferred from observed traffic and results should be confirmed. It also names the top-level response keys, which helps. It says nothing about pagination behavior, default page size, or what the meta/table_id/settings fields contain.

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

Conciseness2/5

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

Purpose is front-loaded in the first two sentences, but the bulk of the text is a ~90-item comma-separated dump of parameter names that duplicates the schema verbatim and swamps the useful caveat. It is verbose without being informative.

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

Completeness2/5

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

For a 93-parameter tool with no output schema, the description should at minimum explain the filter/date-range parameters and the paging convention; instead it enumerates names only. The response-key list is the sole genuinely additive content, leaving an agent unable to construct a meaningful filtered request.

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

Parameters2/5

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

Schema coverage is nominally 100%, but the schema descriptions are pure tautologies ('Query parameter "columns[3][search][regex]"'), so no real meaning is conveyed anywhere. The description only re-lists the same parameter names already in the schema, without explaining the semantically important ones such as table_filter_start/end, timesheet_statuses, report_range_cache, start/length, or the DataTables columns[N][*] conventions.

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

Purpose4/5

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

States a specific verb and resource ('Get timesheet summary report') plus the underlying endpoint GET /reports/timesheet_summary_report, so the agent knows this is a read of an aggregated timesheet report. It does not differentiate from the sibling singleops_read_get_timesheet_totals_report, leaving ambiguity between two similar timesheet summary tools.

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

Usage Guidelines2/5

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

No guidance on when to call this instead of get_timesheet_totals_report or list_timesheets_list. The only contextual sentence ('Inferred from the SingleOps web app's own traffic; confirm results') is a confidence caveat, not a when-to-use rule.

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

singleops_read_get_timesheet_totals_reportGet timesheet totals reportB
Read-onlyIdempotent

Get timesheet totals report. (POST /reports/timesheet_totals_report) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds the non-obvious fact that this read is issued as a POST with filters in the body, plus the exact top-level return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) and a caution that the schema was inferred and should be verified. Those are real behavioral details the annotations cannot convey.

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

Conciseness2/5

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

The purpose and endpoint are front-loaded, but the bulk of the text is a raw, repetitive key enumeration that is both verbose and inconsistent (it stops at columns[6][searchable]). A summarized pattern like 'draw + columns[N][data|name|searchable|orderable|search][value|regex]' would convey the same in a fraction of the space.

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

Completeness4/5

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

With no output schema, the description compensates by naming the response keys and the request-body shape, and flags the POST-for-read quirk. What's missing is semantics — what the columns represent, pagination/sorting expectations, or how the report differs from the summary report — so it is strong on mechanics but not fully complete.

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 body parameter is a free-form object with no defined properties — the description is the only source documenting the DataTables-style body keys (draw, columns[N][data/name/searchable/...]). It is genuinely additive, though the dump is truncated mid-way (columns[6] lists only three sub-keys), leaving the parameter picture incomplete.

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

Purpose3/5

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

The description restates the title ('Get timesheet totals report') and adds the underlying endpoint (POST /reports/timesheet_totals_report). It never says what a timesheet totals report actually contains or how it differs from the sibling singleops_read_get_timesheet_summary_report or the timesheet list tools, so an agent cannot disambiguate on purpose alone.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this report over the many sibling report tools (summary, job labor, client labor, etc.). The only contextual note — 'Inferred from the SingleOps web app's own traffic; confirm results' — is a reliability caveat, not a usage rule.

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

singleops_read_get_tree_inventory_reportGet tree inventory reportB
Read-onlyIdempotent

Get tree inventory report. (POST /reports/tree_inventory_report) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real context: it discloses the read-as-POST pattern, the DataTables-style response keys (draw, recordsTotal, data, meta, table_id, settings), and a provenance caveat that the endpoint was inferred from web traffic and results should be confirmed. That caveat is genuinely useful trust signaling.

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

Conciseness2/5

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

The core purpose and the POST-for-read caveat are front-loaded, but the middle of the description is a 40+ item enumeration of repetitive columns[0..6] keys that could be collapsed to a single sentence. The wall of near-identical key names hurts scanability and buries the useful response-key information at the end.

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

Completeness4/5

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

For a report endpoint with no output schema, the description covers the HTTP method quirk, the request body shape, and the return payload keys, which is close to everything an agent needs to call it. It lacks pagination semantics and any description of the data fields inside 'data', but is otherwise solid.

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?

The schema's body parameter is only a generic free-form object, so the enumerated body keys (DataTables column config: data, name, searchable, orderable, search[value], search[regex], draw) are the only documentation of what goes in the request. This compensates well for the otherwise empty schema, though it lists raw keys without explaining their meaning or which are required.

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

Purpose4/5

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

States a specific verb+resource ('Get tree inventory report') and names the underlying endpoint, which makes it distinguishable from the many other report siblings such as get_items_report or get_inventory_transactions_report. It does not explicitly explain how it differs from those near-neighbors, keeping it at 4 rather than 5.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this report over the roughly 30 other report tools in the sibling list, and no prerequisites or exclusions are given. The only usage-adjacent note is that it is a read query sent as POST, which describes mechanics rather than selection criteria.

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

singleops_read_get_visitGet visit by idA
Read-onlyIdempotent

Get visit by id. (GET /visits/{id}.json) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: id, account_id, job_id, location_id, all_day, start, created_at, updated_at, is_archived, stop, name, visit_stage_id, account_reference_number, qb_list_id, cogs_cost, expenses_cost, actual_total_gross_margin, actual_total_gross_margin_percentage, approved_at, total_price, total_cost, auto_scheduled, last_recalced_at, map_cache, invoice_id, token, exclude_from_ref_num, estimated_workers, exclude_from_calendar, proposal_accepted_by, proposal_accepted_at, custom_invoice_date, is_template_visit, rejected_automatically, accepted_by_ip_address, is_pickup, route_num, lead_converted_at, lead_converted_by_id, initial_visit_stage_id.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, open-world, and non-destructive behavior. The description adds a meaningful caveat that the endpoint was inferred from traffic and results should be confirmed, plus it enumerates returned JSON keys. It does not cover error or auth behavior, but it adds useful context beyond annotations.

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, endpoint, and reliability caveat are front-loaded, which is good. However, the long unformatted enumeration of return keys is unwieldy and would be better represented as an output schema; it is useful but not concise.

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

Completeness4/5

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

For a simple get-by-id tool with rich annotations and no output schema, the description covers purpose, endpoint, reliability caveat, and return fields. It does not explain error cases such as a missing record, but it is otherwise complete enough for invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents id, extra_query, and response_format. The description does not add parameter-specific meaning beyond the schema, so the baseline of 3 applies.

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 description states a specific verb and resource: 'Get visit by id', and supplies the exact HTTP endpoint. The 'by id' phrasing distinguishes it from the many sibling list/search visit tools.

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

Usage Guidelines3/5

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

Usage is implied by 'by id' and the endpoint, but there is no explicit guidance about when to use this tool versus sibling search/list visit tools. An agent can infer it is for direct lookup, but alternatives are not named.

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

singleops_read_get_visit_profit_margin_reportGet visit profit margin reportC
Read-onlyIdempotent

Get visit profit margin report. (GET /reports/visit_profit_margin) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], columns[14][data], columns[14][name], columns[14][searchable], columns[14][orderable], columns[14][search][value], columns[14][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, visit_stages[], assignees, sales_reps, date_filter_column, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
assigneesNoQuery parameter "assignees".
sales_repsNoQuery parameter "sales_reps".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
visit_stages[]NoQuery parameter "visit_stages[]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
columns[14][data]NoQuery parameter "columns[14][data]".
columns[14][name]NoQuery parameter "columns[14][name]".
date_filter_columnNoQuery parameter "date_filter_column".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[14][orderable]NoQuery parameter "columns[14][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[14][searchable]NoQuery parameter "columns[14][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".
columns[14][search][regex]NoQuery parameter "columns[14][search][regex]".
columns[14][search][value]NoQuery parameter "columns[14][search][value]".

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive behavior, so safety is covered. The description adds a valuable caveat that results are inferred from observed traffic and should be confirmed, plus a list of return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) that hints at DataTables-style pagination. It does not explain pagination semantics or defaults beyond that.

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

Conciseness2/5

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

The description is dominated by a 100+ item enumeration of query parameter names that duplicates the schema and buries the one useful caveat and return-key summary. Purpose and endpoint are front-loaded, but the bulk of the text is noise that harms scannability.

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

Completeness3/5

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

Given 108 parameters, no output schema, and DataTables-style nested params, the description provides the endpoint, a reliability caveat, and top-level return keys, which covers the essentials. But it leaves key behavioral questions unanswered: what the default date range is, how table_filter_start/end interact, and what 'visit profit margin' columns mean — gaps that matter for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description merely echoes the parameter names ('Query params seen: draw, columns[0][data], ...') without adding meaning — it does not explain what the DataTables columns/order/search parameters do or how to set date filters. It is a register of names rather than semantic guidance.

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

Purpose3/5

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

States a specific verb+resource ('Get visit profit margin report') and includes the endpoint path, so the basic purpose is clear. However, it does not differentiate from the near-identical sibling singleops_read_get_job_profit_margin_report or explain what a 'visit profit margin' report actually contains versus other reports.

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

Usage Guidelines2/5

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

No when-to-use guidance, no exclusions, and no routing among the many sibling report tools. The only usage-adjacent sentence is the caveat 'Inferred from the SingleOps web app's own traffic; confirm results,' which is a reliability warning rather than an instruction on when to select this tool over alternatives.

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

singleops_read_lead_list_clients_search_by_fieldLead Entry API: search clients. search_field = email | phone (prefix match)B
Read-onlyIdempotent

Lead Entry API: search clients. search_field = email | phone (prefix match). (GET /api/v1/clients/search_by_field) Verified route. Query params seen: search_field, search_term, page. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
pageNoQuery parameter "page".
extra_queryNoAny additional query parameters.
search_termNoQuery parameter "search_term".
search_fieldNoQuery parameter "search_field".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds two useful facts beyond that — the route is 'verified' and matching is prefix-based — but says nothing about pagination behavior (the page param) or what the response shape is beyond 'the endpoint's JSON response'.

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

Conciseness4/5

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

Very short and front-loads the field constraint and verb. It wastes a little space echoing the title verbatim and restating the route, but nothing is padded or buried.

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

Completeness3/5

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

For a zero-required-parameter, open-world search with no output schema, the agent still needs to know what search_term means relative to search_field and how page behaves. The description covers only the field enum, leaving the primary search value and paging undefined.

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

Parameters3/5

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

Schema coverage is nominally 100%, but the schema descriptions are pure restatements ("Query parameter 'search_field'"). The description usefully supplies the allowed values (email | phone) and prefix-match semantics for search_field, which the schema lacks. It says nothing about search_term, page, or extra_query, so it only partially compensates.

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

Purpose4/5

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

States a specific verb and resource ("search clients" via search_by_field) and even constrains the search field to email or phone. However, it never distinguishes itself from the sibling singleops_read_search_clients, so an agent cannot tell the two apart from the text alone.

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

Usage Guidelines2/5

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

There is no statement of when to use this specific endpoint versus singleops_read_search_clients or the other client-listing siblings, and no prerequisites or exclusions are given. The agent must infer that 'prefix match on email/phone' is the selecting condition.

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

singleops_read_lead_list_custom_inputsLead Entry API: list custom input (custom field) definitionsB
Read-onlyIdempotent

Lead Entry API: list custom input (custom field) definitions. (GET /api/v1/custom_inputs) Verified route. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so safety is covered. The description adds only 'Verified route' and 'Returns the endpoint's JSON response', which hints at a pass-through shape but says nothing about pagination, filtering, or result size — modest added value given annotations.

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

Conciseness4/5

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

Three short clauses, purpose front-loaded, nothing redundant. 'Verified route' is minor filler but the overall length is well matched to a simple list endpoint.

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

Completeness3/5

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

There is no output schema, yet the description only says it returns 'the endpoint's JSON response' without any indication of the record shape or fields an agent would get back. For a zero-required-parameter GET this is adequate but leaves a real gap.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (extra_query, response_format) are documented in the schema, so the schema does the heavy lifting. The description adds nothing about parameter usage; baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource (list custom input / custom field definitions) plus the concrete endpoint path, which is more than the name alone conveys. It does not distinguish itself from near neighbors such as singleops_read_get_custom_inputs_report, so an agent must infer that this returns definitions rather than input data.

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

Usage Guidelines2/5

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

No statement of when to call this versus the many sibling read tools, and no prerequisites or exclusions. The agent must derive applicability purely from the name and endpoint path.

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

singleops_read_lead_list_operationsLead Entry API: list operations (divisions)C
Read-onlyIdempotent

Lead Entry API: list operations (divisions). (GET /api/v1/operations) Verified route. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so safety is covered. The description adds only that it hits GET /api/v1/operations and returns 'the endpoint's JSON response', with no detail on volume, pagination, or what 'divisions' means.

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?

It is short and front-loaded, but the title is repeated verbatim and 'Verified route' / 'Returns the endpoint's JSON response' are boilerplate that consumes half the text without adding usable information.

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

Completeness2/5

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

With no output schema and a nested-object parameter (extra_query), the description should explain what the endpoint returns and how to shape filters. Instead it leaves both to the schema and says only that JSON comes back — which also conflicts with the default markdown response_format.

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

Parameters3/5

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

Schema description coverage is 100%, so extra_query and response_format are already documented in the schema, establishing the baseline of 3. The description contributes nothing further about either parameter.

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

Purpose3/5

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

It names a specific resource action ('list operations (divisions)') and gives the underlying GET route, so an agent can tell it fetches data. However, it never distinguishes this from the very similarly named sibling singleops_read_list_operations, and the parenthetical '(divisions)' is the only hint at scope.

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

Usage Guidelines2/5

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

There is no statement of when to use this over singleops_read_list_operations or singleops_call_route, and no prerequisites or filters mentioned. 'Verified route' is metadata about tool generation, not usage guidance.

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

singleops_read_list_account_settings_options_quickbooksList account settings options quickbooksB
Read-onlyIdempotent

List account settings options quickbooks. (GET /api/v1/account_settings/options/quickbooks) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: accounts_receivable, refund_account, undeposited_funds, deposit_item, prepay_item.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly=true, idempotent=true, destructive=false, so the safety profile is covered. The description adds genuinely new context: the underlying HTTP endpoint, the fact that the definition was inferred from observed web-app traffic, and an explicit instruction to confirm results. That inference caveat is a behavioral trait an agent would not otherwise know; only the return-format/pagination behavior is left unstated.

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

Conciseness4/5

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

Three compact sentences with the endpoint and return keys front-loaded and no filler. Minor waste in the first sentence, which simply repeats the tool title word-for-word before the useful content begins.

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

Completeness4/5

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

With no output schema, the description compensates well by enumerating the response keys, so an agent knows what comes back. Annotations cover safety and idempotency, and both optional parameters are fully documented in the schema. The one real gap is the absence of any statement about when this lookup is the right call versus get_qbo_status or accounts_info.

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

Parameters3/5

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

Schema description coverage is 100% for both parameters (extra_query and the response_format enum), so the schema carries the parameter burden completely. The description adds nothing about parameters — the key list it provides describes the response, not the inputs. Baseline 3 is the correct ceiling here.

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

Purpose3/5

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

The description restates the title almost verbatim ("List account settings options quickbooks") and adds no plain-language explanation of what these options are for. The endpoint path and the enumerated return keys (accounts_receivable, refund_account, undeposited_funds, deposit_item, prepay_item) do clarify that it's a set of QuickBooks account-choice lookups, which lifts it above pure tautology. It does not differentiate itself from adjacent siblings like singleops_read_list_accounts_info or singleops_read_get_qbo_status.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool, when not to, or which sibling to prefer for a related question about QuickBooks accounts. The only guidance-like sentence, "Inferred from the SingleOps web app's own traffic; confirm results," is a reliability caveat rather than routing guidance. An agent must infer the use case from the name alone.

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

singleops_read_list_accounts_infoList accounts infoB
Read-onlyIdempotent

List accounts info. (GET /api/v1/accounts/info) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: account_constants, is_open_edge_enabled, is_qbo_connected, is_qbwc_connected, can_save_credit_cards, use_percent_pricing, term_id, tax_location_id, react_feature_flags, signed_up_singleops_financing, has_access_to_multiple_dashboards, invoice_lifespan_in_years, accounts_receivable_quickbooks_account_id, refund_quickbooks_account_id, undeposited_funds_quickbooks_account_id, deposit_item_id, prepay_item_id, signed_up_singleops_payments.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds something genuinely beyond them: the data is 'inferred from the SingleOps web app's own traffic' and results should be confirmed, which warns the agent about staleness/uncertainty. It also gains the full response key surface, since no output schema exists. It still omits auth/tenancy scope and whether the response is per-account or per-user.

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 and endpoint are front-loaded well, but the tail is a 17-item comma-separated key dump that is hard to scan and largely restates field names without explaining them. It is functional padding rather than wasted space, but it is not tight prose.

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

Completeness4/5

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

With no output schema, the enumerated return keys are necessary and the description supplies them, plus an accuracy caveat — enough for an agent to call this zero-required-param read tool correctly. The gap is that the keys are listed without meaning and the mutation-free but openWorld nature of the call is not elaborated.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (extra_query, response_format) are documented in the schema, so the baseline of 3 applies. The description adds nothing about either parameter — no note on which extra query keys are meaningful for this endpoint or when to prefer json over markdown.

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

Purpose4/5

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

States a specific verb+resource ('List accounts info') and backs it with the underlying endpoint (GET /api/v1/accounts/info), and the enumerated return keys make clear this is account-level configuration/feature data rather than a client list. It does not, however, explicitly distinguish itself from near siblings like singleops_read_get_qbo_status or singleops_read_list_account_settings_options_quickbooks.

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

Usage Guidelines2/5

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

There is no when-to-use guidance at all — no stated prerequisites, no condition selecting this over the QBO status or account settings options siblings. The only guidance-ish sentence ('confirm results') is a reliability caveat, not a usage rule.

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

singleops_read_list_client_emailsList client emails for one idB
Read-onlyIdempotent

List client emails for one id. (GET /clients/{id}/emails) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, email_statuses, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
email_statusesNoQuery parameter "email_statuses".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so safety behavior is covered. The description adds a meaningful caveat that results are inferred from app traffic and should be confirmed, plus a list of response keys, but it does not explain pagination, rate limits, or filtering behavior beyond what annotations and schema provide.

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

Conciseness2/5

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

The first two sentences are useful and front-loaded, but the description then dumps a massive, redundant enumeration of roughly 100 query parameter names that are already fully present in the schema. This bloats the definition and makes it harder to scan, though the core purpose and caveat are not entirely buried.

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

Completeness3/5

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

Given 100 parameters and no output schema, the description does provide the endpoint, a reliability caveat, and the top-level response keys. However, it does not explain how the many DataTables-style query parameters (draw, columns, order, start, length, search) affect results, so an agent still lacks behavioral context needed to use this complex tool confidently.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter, albeit mostly with generic labels. The description lists the same query parameter names seen in traffic but adds no syntax, format, defaults, or meaning beyond the schema. With high schema coverage, the baseline of 3 is appropriate.

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

Purpose4/5

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

The description clearly states a specific verb and resource: 'List client emails for one id', and confirms the endpoint GET /clients/{id}/emails. It does not explicitly distinguish itself from nearby sibling tools such as singleops_read_list_emails_report or singleops_read_list_client_text_messages, which keeps it from a 5.

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

Usage Guidelines3/5

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

The description implies usage through its name and endpoint, and adds a useful caution that results are 'Inferred from the SingleOps web app's own traffic; confirm results.' However, it gives no explicit guidance on when to use this tool versus the many sibling reporting/search tools, nor when not to use it.

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

singleops_read_list_client_invoicesList client invoices for one idC
Read-onlyIdempotent

List client invoices for one id. (GET /clients/{id}/invoices) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], columns[14][data], columns[14][name], columns[14][searchable], columns[14][orderable], columns[14][search][value], columns[14][search][regex], columns[15][data], columns[15][name], columns[15][searchable], columns[15][orderable], columns[15][search][value], columns[15][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, invoice_statuses, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
invoice_statusesNoQuery parameter "invoice_statuses".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
columns[14][data]NoQuery parameter "columns[14][data]".
columns[14][name]NoQuery parameter "columns[14][name]".
columns[15][data]NoQuery parameter "columns[15][data]".
columns[15][name]NoQuery parameter "columns[15][name]".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[14][orderable]NoQuery parameter "columns[14][orderable]".
columns[15][orderable]NoQuery parameter "columns[15][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[14][searchable]NoQuery parameter "columns[14][searchable]".
columns[15][searchable]NoQuery parameter "columns[15][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".
columns[14][search][regex]NoQuery parameter "columns[14][search][regex]".
columns[14][search][value]NoQuery parameter "columns[14][search][value]".
columns[15][search][regex]NoQuery parameter "columns[15][search][regex]".
columns[15][search][value]NoQuery parameter "columns[15][search][value]".

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description does add real value by disclosing that the endpoint was inferred from observed traffic and should be verified, and by listing the response keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) in the absence of an output schema. It does not explain the DataTables semantics of the payload, which is the main behavioral unknown.

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

Conciseness2/5

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

The purpose is front-loaded and short, but the body then dumps 100+ raw parameter names verbatim, which is pure duplication of structured schema data and drowns the two genuinely useful sentences (the inference caveat and the return keys).

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

Completeness2/5

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

For a 112-parameter, nested, no-output-schema tool, the description should explain the DataTables paging/sorting/filtering convention that governs nearly every parameter. Instead it only lists names and return keys, leaving an agent unable to tell which of the 111 optional params matter for a basic call.

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

Parameters3/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. However, the description's param list is a verbatim enumeration of schema property names and adds no meaning beyond them — it does not explain what 'draw', 'start'/'length' (paging), 'order[0][dir]' (sorting), or 'invoice_statuses' actually do.

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

Purpose4/5

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

States a specific verb and resource ('List client invoices') plus the scoping key ('for one id') and even the underlying endpoint (GET /clients/{id}/invoices). It implicitly separates itself from the invoice-level siblings like singleops_read_search_invoices, but never names an alternative to route the agent.

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

Usage Guidelines2/5

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

There is no when-to-use guidance: no statement of when to prefer this over singleops_read_search_invoices, singleops_read_list_invoices_invoice_totals, or singleops_read_list_public_client_public_invoices. 'Inferred from the SingleOps web app's own traffic; confirm results' is a reliability caveat, not usage guidance.

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

singleops_read_list_client_jobsList client jobs for one idB
Read-onlyIdempotent

List client jobs for one id. (GET /clients/{id}/jobs) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description still adds real value by disclosing that the route was inferred from observed browser traffic and results should be confirmed, and it enumerates the returned JSON keys, which the annotations cannot convey.

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

Conciseness2/5

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

The first two sentences are well front-loaded, but they are followed by a 60-plus-item dump of query parameter names that duplicates the schema verbatim and buries the useful caveat. This is the definition of unearned length.

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

Completeness3/5

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

For a 72-parameter tool with no output schema, the description does help by listing the return keys. However, it gives no guidance on which handful of parameters (id, start/length, search[value]) an agent should actually use versus the 70 DataTables artifacts, which is the central gap for this tool.

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

Parameters3/5

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

Schema coverage is 100% (baseline 3), and the description's long list of query params merely restates schema keys like columns[0][search][regex] without explaining their meaning or which ones actually matter. The DataTables plumbing is entirely undocumented semantically in both places, so nothing is gained beyond the schema.

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

Purpose4/5

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

States a specific verb ('List') and resource ('client jobs') scoped to one client id, plus the underlying endpoint GET /clients/{id}/jobs. That distinguishes it from siblings like search_jobs or list_client_invoices, though it never names an alternative explicitly.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, and no routing against siblings such as singleops_read_search_jobs or singleops_read_list_client_visits. The only guidance-like text ('Inferred from the SingleOps web app's own traffic; confirm results') is a reliability caveat, not usage direction.

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

singleops_read_list_client_locationsList client locations for one idB
Read-onlyIdempotent

List client locations for one id. (GET /clients/{id}/locations) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
order[0][column]NoQuery parameter "order[0][column]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the description does not need to restate safety. It adds useful context by noting the endpoint was inferred from SingleOps web traffic and that results should be confirmed, and it lists the JSON response keys despite there being no output schema.

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, endpoint, and provenance caveat are front-loaded, which is good. However, the long enumeration of query parameters largely duplicates the input schema and makes the description less concise without adding explanatory value.

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

Completeness4/5

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

For a read-only endpoint wrapper with no output schema, the description supplies the endpoint, provenance caveat, query-parameter list, and return-key list. It is largely complete for invocation, though it could better explain how the optional DataTables parameters affect results.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 30 parameters. The description repeats the observed query-parameter names and return keys but does not explain the meaning of DataTables parameters like draw, start, length, or columns[...], so it adds little semantic value beyond the schema.

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

Purpose4/5

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

The description gives a clear verb and resource: 'List client locations for one id.' The scope is specific enough to distinguish it from broader client searches, though it does not explicitly name or differentiate it from nearby siblings such as list_client_location_stats.

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

Usage Guidelines2/5

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

It states what the tool does but gives no guidance on when to use it versus alternatives like list_client_location_stats, search_clients, or other client list tools. The only implied usage comes from the tool name and the required id parameter.

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

singleops_read_list_client_location_statsList client location stats for one client/locationA
Read-onlyIdempotent

List client location stats for one client/location. (GET /clients/{client_id}/location/{location_id}/stats) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: year. Returns JSON with keys: material, service, total, type.

NameRequiredDescriptionDefault
yearNoQuery parameter "year".
client_idYesPath parameter {client_id} (record id).
extra_queryNoAny additional query parameters.
location_idYesPath parameter {location_id} (record id).
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description adds meaningful context beyond that: the data is 'inferred from the SingleOps web app's own traffic' and should be confirmed, which is a genuine reliability disclosure an agent would not get from annotations.

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

Conciseness4/5

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

Front-loaded with the core action and endpoint, then the caveat and return keys. Mostly efficient, though the 'Inferred from... confirm results' phrasing is slightly informal.

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

Completeness4/5

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

With no output schema, the description helpfully lists return keys (material, service, total, type). Combined with full param coverage and the reliability caveat, an agent has enough to invoke it correctly.

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

Parameters3/5

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

Schema coverage is 100%, so parameters are already documented. The description only notes 'Query params seen: year,' adding essentially no syntax or semantics beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb (List) and resource (client location stats) scoped to one client/location, and names the REST endpoint. It is distinguishable from sibling stat tools like list_client_stat_hours and list_client_stat_revenue, though it never explicitly differentiates itself from them.

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

Usage Guidelines3/5

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

The scoping ('one client/location') implies when to use it, but there is no explicit when-not guidance or mention of the closely related stat siblings (stat_hours/stat_revenue). The 'confirm results' note is a reliability caveat rather than usage guidance.

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

singleops_read_list_client_stat_hoursList client stat hours for one idA
Read-onlyIdempotent

List client stat hours for one id. (GET /clients/{id}/stats/hours.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: year. Returns JSON with keys: data, start_date, end_date.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
yearNoQuery parameter "year".
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world behavior, so the safety profile is covered. The description adds genuinely useful context beyond that: it is 'Inferred from the SingleOps web app's own traffic' and results should be confirmed, and it lists the returned keys (data, start_date, end_date).

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

Conciseness4/5

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

Three short sentences with the purpose front-loaded, followed by the endpoint, reliability caveat and return keys. Nothing is padded, though the endpoint path duplicates information implied by the name.

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

Completeness4/5

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

For a read-only four-parameter endpoint with full schema descriptions, the description covers purpose, novelty/unreliability of the data source and return shape. The only nit is that it says 'Returns JSON' while response_format defaults to markdown, and it does not explain extra_query.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents id, year, extra_query and response_format. The description only notes the observed 'year' query param, adding no syntax, format or semantics beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

Names a specific verb (List), resource (client stat hours) and scope (for one id), plus the underlying endpoint. It implicitly distinguishes itself from sibling stat endpoints by saying 'hours' rather than revenue or location stats, though it never names an alternative.

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

Usage Guidelines2/5

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

No statement of when to use this versus the many sibling stat/report tools (e.g. list_client_stat_revenue, list_client_location_stats, get_client_labor_report). Only the 'for one id' scope gives any hint about selection, and there are no exclusions or prerequisites.

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

singleops_read_list_client_stat_revenueList client stat revenue for one idB
Read-onlyIdempotent

List client stat revenue for one id. (GET /clients/{id}/stats/revenue.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: year. Returns JSON with keys: data, start_date, end_date.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
yearNoQuery parameter "year".
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world behavior. The description adds useful context by noting the endpoint, that the route was inferred from observed web traffic, and the top-level response keys, but it does not cover auth, rate limits, or data freshness.

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

Conciseness4/5

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

The description is compact and front-loaded: purpose, endpoint, reliability caveat, query param, and return keys. It is slightly repetitive with the title, but no sentence is clearly wasteful.

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

Completeness4/5

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

For a simple read-only endpoint with no output schema, the description supplies the route, a reliability warning, and the response key structure. Combined with the fully described input schema and safety annotations, this is sufficient to call the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents id, year, extra_query, and response_format. The description adds only the fact that year was observed as a query parameter, which is marginal beyond the schema baseline.

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

Purpose4/5

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

The description states a specific verb and resource: list client stat revenue for a single client id. It is clear enough to separate from generic client lists, but it does not explicitly contrast with the closely related sibling singleops_read_list_client_stat_hours.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as client stat hours or other client report tools. The only caveat is 'confirm results', which is a reliability warning rather than usage routing.

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

singleops_read_list_client_tasksList client tasks for one idC
Read-onlyIdempotent

List client tasks for one id. (GET /clients/{id}/tasks) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
order[0][column]NoQuery parameter "order[0][column]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds a useful reliability caveat that the operation was inferred from web traffic and results should be confirmed, plus return keys, but it does not discuss pagination behavior or rate limits.

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

Conciseness2/5

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

The purpose and caveat are front-loaded, but the bulk of the description is a long verbatim enumeration of dozens of DataTables query parameters that duplicates the schema. That list does not earn its place and makes the definition unnecessarily bloated.

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

Completeness3/5

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

For a complex read-only tool with 66 parameters, the description supplies return keys and a caveat about inferred behavior. However, it does not explain how to use the DataTables-style parameters effectively, and the parameter documentation is largely a raw list, leaving some practical gaps for an agent.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description enumerates query parameters seen and return keys, but largely repeats what the schema already exposes and does not explain the DataTables parameter semantics or which parameters are practically important.

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

Purpose4/5

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

The description states a specific verb and resource (list client tasks) with a clear scope (for one id), and includes the endpoint. It does not explicitly distinguish itself from task-oriented siblings such as search_tasks or list_tasks_calendar, so it falls just short of a 5.

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

Usage Guidelines2/5

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

It implies usage when a client id is available, but gives no explicit when-to-use or when-not-to-use guidance and names no alternatives among the many sibling task and client list tools. The only guidance is a reliability caveat, not selection guidance.

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

singleops_read_list_client_text_messagesList client text messages for one idB
Read-onlyIdempotent

List client text messages for one id. (GET /clients/{id}/text_messages) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely useful context beyond them: the endpoint was inferred from observed web traffic and results should be confirmed, which tells the agent to treat output as unverified. It also enumerates the return keys despite there being no output schema.

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

Conciseness2/5

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

Purpose and the endpoint are front-loaded, which is good, but roughly 60% of the text is a verbatim re-listing of ~50 query parameter names that already exist in the schema. That bulk crowds out what an agent actually needs, such as which two or three parameters to set for a sane call.

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

Completeness3/5

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

Given 51 parameters and no output schema, the description does supply the return key set (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) and the 'inferred, confirm results' caveat. It still omits message field content, pagination defaults, and which parameters are practically required beyond id, so it is adequate but incomplete for a tool of this complexity.

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

Parameters3/5

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

With 100% schema coverage every one of the 51 parameters is at least named in the schema, so the baseline is 3. However, the description's long param list merely repeats those names (DataTables-style draw/columns/order/search fields) without explaining which of them matter or how columns map to message attributes, so it adds no real meaning.

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

Purpose4/5

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

States a specific verb and resource ('List client text messages') plus the scope ('for one id'), and the endpoint path reinforces a per-client read. It is distinguishable from the report-oriented sibling (singleops_read_list_text_messages_report), though it does not explicitly name that alternative.

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

Usage Guidelines2/5

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

There is no when-to-use/when-not-to-use guidance and no routing to alternatives such as the text messages report tool or other client sub-resources. The only conditional language is the caution 'confirm results', which is a reliability warning, not usage guidance.

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

singleops_read_list_client_visitsList client visits for one idC
Read-onlyIdempotent

List client visits for one id. (GET /clients/{id}/visits) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
order[0][column]NoQuery parameter "order[0][column]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds a useful reliability caveat that the route was inferred from web traffic and results should be confirmed, plus return keys, but it omits auth, rate-limit, and pagination behavior.

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

Conciseness2/5

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

The purpose is front-loaded, but the description then dumps dozens of query parameter names that are already in the schema. This bloats the definition with low-signal repetition rather than explaining how to use the tool.

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

Completeness2/5

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

For a 54-parameter tool with no output schema, the description gives return keys and an endpoint but does not explain how the many DataTables parameters work, how pagination should be used, or what response_format changes. It is not complete enough to support reliable invocation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already names every parameter. The description mostly echoes the query-param names without explaining DataTables semantics, start/length, search/order behavior, or response_format, so it does not add meaningful parameter guidance beyond the schema baseline.

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

Purpose4/5

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

States a specific verb and resource: list client visits for one client id, with the endpoint included. It is clearly scoped to one client's visits, though it does not explicitly distinguish itself from nearby visit/search or get_visit siblings.

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

Usage Guidelines2/5

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

Provides no explicit when-to-use guidance, exclusions, or alternatives. The only guidance-like statement is a caveat to confirm inferred results, leaving the agent to infer usage from the name.

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

singleops_read_list_email_spam_addresses_check_batch_emailsList email spam addresses check batch emailsB
Read-onlyIdempotent

List email spam addresses check batch emails. (POST /email_spam_addresses/check_batch_emails) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: emails[]. Returns JSON with keys: has_spam, spam_list, has_bounced, bounce_list. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive and open-world, so the bar is lower; the description still adds real value by disclosing that the endpoint shape was inferred from observed web traffic and should be verified, and by naming the return keys despite there being no output schema. It stops short of describing auth requirements, rate limits, or batch-size limits.

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?

Four short sentences with no bloat, but the first sentence is pure duplication of the title and should have been replaced with a real purpose statement. The useful facts (inferred-from-traffic caveat, body key, return keys, POST-with-body note) are present but not front-loaded.

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

Completeness3/5

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

For a POST endpoint with a free-form body and no output schema, the description does cover the essential pieces: the body key, the response keys, and the POST semantics. However, it never specifies the format of emails[] (array of strings? max batch size?) nor any permission requirement, which leaves a real gap for a batch-check operation.

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%, but the `body` parameter is a free-form object with additionalProperties and no declared properties, so the schema alone tells the agent nothing about what to put in it. "Body keys seen: emails[]" supplies that missing key name, which is genuine added meaning beyond the schema, though the value type/shape of emails[] is not specified.

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

Purpose3/5

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

The opening sentence is a word-for-word restatement of the title ("List email spam addresses check batch emails"), which reads as a garbled name rather than a purpose statement. The endpoint path and the return keys (has_spam, spam_list, has_bounced, bounce_list) eventually make clear this checks a batch of email addresses for spam/bounce status, but the agent has to reconstruct that meaning from the tail of the description.

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

Usage Guidelines2/5

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

No indication of when to reach for this versus the many sibling read tools (e.g. singleops_read_list_client_emails, singleops_read_list_emails_report). The only guidance is a mechanical note that it is a read-only query sent as POST with filters in the body, plus a generic "confirm results" caveat — neither helps an agent choose this tool over alternatives.

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

singleops_read_list_emails_reportList emails reportC
Read-onlyIdempotent

List emails report. (GET /emails/report) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, email_statuses, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
email_statusesNoQuery parameter "email_statuses".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".

TDQS

C2.6/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds a genuinely useful caveat that the endpoint was inferred from app traffic and results should be confirmed, but says nothing about pagination behavior, rate limits, or what 'confirm' entails.

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

Conciseness2/5

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

The bulk is a ~100-name parameter dump that duplicates the schema verbatim and provides no value, burying the two useful sentences (endpoint caveat and return keys). Badly front-loaded and wasteful for a 99-param tool.

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

Completeness2/5

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

For a 99-param DataTables-backed report, the description gives no guidance on which parameters matter or how paging/search/ordering work. Listing return keys is helpful and there's no output schema, but the parameter mystery remains a serious gap.

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

Parameters3/5

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

Schema coverage is 100%, so the schema documents all 99 params (though tautologically). The description merely re-lists the same parameter names with no added meaning, e.g. no explanation of the DataTables columns/order/search semantics or the response_format enum.

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

Purpose3/5

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

States a verb and resource ('List emails report') plus the underlying endpoint, so the agent knows roughly what it retrieves. But it barely distinguishes from siblings like singleops_read_list_text_messages_report or singleops_read_list_client_emails, and the phrasing essentially restates the title.

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

Usage Guidelines2/5

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

There is no when-to-use vs alternatives guidance at all, despite many overlapping report siblings. The only contextual note is 'confirm results,' which is a data-quality caveat, not a usage rule.

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

singleops_read_list_invoices_invoice_totalsList invoices invoice totalsB
Read-onlyIdempotent

List invoices invoice totals. (POST /invoices/invoice_totals) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: should_clear_cache. Body keys seen: table_filter_start, table_filter_end, visit_stages, operation_id, client_id, sales_rep, deposit, invoice_type, invoice_status, invoice_age, invoice_tile_view, search. Returns JSON with keys: total, count. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
should_clear_cacheNoQuery parameter "should_clear_cache".

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already cover the read-only/idempotent/non-destructive profile, but the description adds genuinely non-obvious behavior: it is a read query sent as POST with filters in the body, and it was inferred from observed app traffic so results should be verified. That is exactly the kind of context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with purpose and endpoint, then caveat, then parameters and return shape — a sensible order. The comma-separated body-key list is dense but the only wasted weight is minimal; every sentence carries information.

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

Completeness3/5

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

It covers endpoint, filter keys, return keys (total, count) and the reliability caveat, which is decent even with no output schema. What is missing is what the totals are grouped by or measured in, and any semantics for ambiguous filters like invoice_age or deposit — for an aggregate endpoint that gap matters.

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 nominally 100%, but the body parameter is a free-form object with `additionalProperties: {}`, so the schema documents nothing about the actual filters. The description compensates by enumerating the observed body keys (table_filter_start/end, invoice_status, invoice_age, search, etc.), which is the only source for them, though it does not say what each key means or its expected types.

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

Purpose3/5

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

The description names the resource and the endpoint (POST /invoices/invoice_totals) and says it returns total and count, so it reads as an invoice-aggregate query. However, "List invoices invoice totals" is close to a restatement of the title and never distinguishes it from the many sibling invoice tools (search_invoices, list_client_invoices), nor explains what the totals aggregate over.

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

Usage Guidelines2/5

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

There is no statement of when to use this endpoint versus the sibling invoice search/list tools, and no prerequisites or exclusions. The only guidance offered is the caveat "confirm results," which warns about reliability rather than telling the agent when to select this tool.

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

singleops_read_list_item_groupsList item groupsB
Read-onlyIdempotent

List item groups. (GET /item_groups) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
order[0][column]NoQuery parameter "order[0][column]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds genuinely useful provenance — these parameters were inferred from the web app's own traffic and results should be confirmed — plus the response keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) despite no output schema.

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

Conciseness2/5

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

The lead sentence and route are well front-loaded, but roughly 60 parameter names are dumped into the description, duplicating the schema key-for-key with no explanatory value. This bulk obscures the two sentences that actually matter (the traffic-inference caveat and the response keys).

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

Completeness3/5

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

For a 59-parameter DataTables-style endpoint with no output schema, the description does supply the return keys and a reliability caveat, which is more than nothing. However, it never explains what an item group is, which parameters are meaningful for filtering, or what the `data` entries contain, leaving real gaps for a complex tool.

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

Parameters3/5

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

Schema description coverage is nominally 100%, but every entry is a tautology (e.g. 'Query parameter "draw"'), so neither schema nor description explains what any parameter does. The description's phrase 'Query params seen' does convey that these are observed and effectively optional, but otherwise it repeats the schema key list verbatim rather than adding meaning.

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

Purpose4/5

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

States a clear verb and resource ('List item groups') and pins it to the underlying route (GET /item_groups), so an agent knows exactly what it retrieves. It does not differentiate from close siblings such as singleops_read_list_items or singleops_read_get_item_groups_report, which keeps it out of 5 territory.

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

Usage Guidelines2/5

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

There is no statement of when to use this versus the sibling item-group report or items list, and no prerequisites or exclusions. The only usage-adjacent content is the caveat 'confirm results', which warns about reliability rather than routing the agent.

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

singleops_read_list_itemsList itemsC
Read-onlyIdempotent

List items. (GET /items) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".

TDQS

C2.4/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered. The description does add one genuinely useful behavioral signal — that this was reverse-engineered from web traffic and results should be confirmed — plus a list of top-level response keys. It does not disclose pagination behavior, default page size, or auth requirements.

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

Conciseness1/5

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

The description is dominated by a 90-plus-item enumeration of raw query parameter names that buries the two sentences of actual information. Nothing is front-loaded beyond the one-word purpose; the useful caveat and return keys are lost in the noise.

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

Completeness2/5

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

For a 95-parameter tool with no output schema, the description should explain the DataTables paging contract (start/length/draw), what the data array contains, and when it beats siblings. It gives only the response key names and a disclaimer, leaving an agent unable to page or interpret results confidently.

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

Parameters2/5

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

Schema coverage is 100%, so the baseline would be 3, but the description merely dumps ~90 DataTables parameter names verbatim with zero explanation — no meaning for draw/start/length, no note that columns[N] indices depend on the UI table, no indication which params matter. This repetition adds no semantics over the schema and actively obscures the few parameters that matter.

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

Purpose3/5

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

The description states a verb and resource ("List items") plus the endpoint GET /items, which is specific enough to act on, but it never says what an "item" is in SingleOps (line items? inventory items?) and gives no hint of how it differs from sibling tools like singleops_read_list_item_groups or singleops_read_get_items_report.

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

Usage Guidelines2/5

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

There is no when-to-use guidance at all — no mention of alternatives, prerequisites, or filtering workflow. The only advisory sentence, "Inferred from the SingleOps web app's own traffic; confirm results," is a reliability caveat rather than usage direction.

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

singleops_read_list_operationsList operationsC
Read-onlyIdempotent

List operations. (GET /api/v1/operations) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: [].id, [].name, [].active, [].tax_location_id, [].display_name, [].location_id, [].location.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld. The description usefully adds the sourced endpoint and a provenance caveat ("Inferred from the SingleOps web app's own traffic; confirm results"), which honestly signals low-confidence derivation. It says nothing about pagination, result volume, or filtering behavior.

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

Conciseness4/5

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

Front-loaded and short, with the endpoint immediately after the purpose. The enumerated return-key list is somewhat noisy but is the tool's only return-value disclosure given there is no output schema.

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

Completeness3/5

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

Annotations carry the safety profile and the description enumerates return keys in lieu of an output schema, which is adequate. Missing the domain meaning of "operations" and any routing versus the many sibling list/search tools leaves the definition only minimally viable.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (extra_query, response_format) are documented in the schema, so the baseline is 3. The description adds no meaning about what query parameters are accepted or how response_format interacts with the returned key list.

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

Purpose3/5

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

States a verb and resource ("List operations") plus the underlying endpoint, but never explains what an "operation" is in this domain. With siblings like singleops_read_get_operation_performance_report and singleops_read_lead_list_operations, the description gives no basis for distinguishing this tool.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool, when not to, or which sibling to prefer. The only directive is a generic caveat to "confirm results," which is not usage guidance.

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

singleops_read_list_portal_accounts_feature_flagsList portal accounts feature flagsB
Read-onlyIdempotent

List portal accounts feature flags. (GET /client/api/v1/accounts/feature_flags) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: show_rich_text_notes.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare this is a read-only, idempotent, non-destructive, open-world operation. The description adds a meaningful caveat that the endpoint was inferred from web app traffic and results should be confirmed, plus a return-key detail. It does not cover permissions, pagination, or other operational behavior beyond that.

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

Conciseness4/5

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

The description is short and front-loaded with purpose and endpoint before the caveat and return detail. It is appropriately sized for a simple read-only listing tool.

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

Completeness4/5

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

For a simple read-only list endpoint with full schema coverage and annotations covering safety, the description is broadly complete: it identifies the resource, path, reliability caveat, and return key. The main missing context is how it differs from the public feature-flags sibling.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented in the input schema. The description does not add any parameter-level meaning beyond the schema, which is acceptable for a high-coverage schema.

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

Purpose4/5

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

The description states a specific verb and resource: list portal accounts feature flags. It also gives the endpoint and an example return key. It does not explicitly distinguish itself from the similar sibling singleops_read_list_public_accounts_feature_flags, so it stops short of a 5.

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

Usage Guidelines2/5

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

The description gives no explicit guidance on when to use this tool versus alternatives, especially the closely named public accounts feature flags sibling. The warning to confirm inferred results is useful context but is not usage guidance.

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

singleops_read_list_public_accounts_feature_flagsList public accounts feature flagsB
Read-onlyIdempotent

List public accounts feature flags. (GET /public/api/v1/accounts/feature_flags) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: twilio_compliance.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds real value beyond that: it discloses the return shape ('Returns JSON with keys: twilio_compliance') despite no output schema, and warns the data is inferred from observed traffic and needs confirmation.

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

Conciseness4/5

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

Two compact sentences with the action and endpoint front-loaded and no filler. Slightly telegraphic, but every clause (endpoint, caveat, return keys) carries information.

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

Completeness4/5

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

For a zero-required-param GET with no output schema, the description supplies the endpoint, the return keys, and a reliability caveat, which is nearly enough to call it correctly. The one gap is sibling differentiation, which matters given how many similar 'list' tools exist.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (extra_query, response_format) are documented in the schema itself. The description adds nothing about parameters, so baseline 3 applies.

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

Purpose3/5

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

States a specific verb and resource ('List public accounts feature flags') plus the endpoint path, so the basic action is clear. However it never distinguishes itself from the near-identical sibling singleops_read_list_portal_accounts_feature_flags, leaving an agent unable to tell 'public' from 'portal' accounts scope.

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

Usage Guidelines2/5

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

There is no guidance on when to call this versus the portal counterpart or singleops_read_list_accounts_info, and no preconditions. The only hint is the caveat that results were inferred from web-app traffic and should be confirmed.

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

singleops_read_list_public_brand_detailsList public brand details for one idA
Read-onlyIdempotent

List public brand details for one id. (GET /public/api/v1/brands/{id}/details) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: address, customer_contact_email, email, logo, name, phone, website_display, website_url.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description nonetheless adds meaningful context the annotations don't: the data is inferred from observed web-app traffic and should be confirmed, which tells the agent the payload may be incomplete or unverified.

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

Conciseness4/5

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

Three short sentences, purpose first, endpoint second, caveat/return shape last. Every sentence carries information, though the return-key list is somewhat long and could have been left to an output schema.

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

Completeness4/5

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

Because no output schema exists, listing the return keys (address, email, logo, name, phone, website_url) is valuable and fills that gap. Combined with the endpoint and provenance caveat, an agent has what it needs to invoke the tool correctly, with only usage routing missing.

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

Parameters3/5

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

Schema description coverage is 100%, so id, extra_query, and response_format are already documented in the schema. The description adds nothing about parameter semantics, leaving the baseline of 3 appropriate.

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

Purpose4/5

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

States a specific verb and resource: lists public brand details for a single id, and includes the concrete endpoint GET /public/api/v1/brands/{id}/details. It does not differentiate itself from the many public-brand/client siblings in the toolset, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this tool over alternatives such as singleops_read_list_public_client_public_invoices or singleops_read_list_accounts_info. The only directive is a generic caveat to 'confirm results', which is a reliability warning rather than usage guidance.

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

singleops_read_list_public_client_public_invoicesList public client public invoices for one idB
Read-onlyIdempotent

List public client public invoices for one id. (GET /public/api/v1/clients/{id}/public_invoices) Inferred from the SingleOps web app's own traffic; confirm results. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds a genuinely useful reliability warning that the endpoint was inferred from traffic and results should be confirmed, but says nothing about pagination, result volume, or what 'confirm results' means in practice.

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

Conciseness4/5

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

Three short sentences, purpose and route front-loaded, with the caveat where it will be read. No filler; the only minor redundancy is naming the endpoint route in addition to the title.

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

Completeness4/5

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

For a single-id GET with no output schema and full schema coverage, the description covers purpose, route and the return envelope ('the endpoint's JSON response') at a level sufficient to invoke it correctly. The reliability caveat is left unexploited, but nothing critical to a correct call is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so id, extra_query and response_format are already documented with their types and enum. The description adds no parameter-level meaning, which is acceptable at this coverage but is not above baseline.

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

Purpose4/5

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

States a specific verb and resource (list public invoices for a single client id) and includes the underlying route, which makes scope unambiguous. The repeated 'public' qualifier loosely separates it from the sibling singleops_read_list_client_invoices, though the distinction is never spelled out.

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

Usage Guidelines2/5

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

Nothing says when to pick this over singleops_read_list_client_invoices or singleops_read_search_invoices. The only guidance is a provenance caveat ('Inferred from the SingleOps web app's own traffic; confirm results'), which describes trustworthiness, not selection.

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

singleops_read_list_purchase_ordersList purchase ordersC
Read-onlyIdempotent

List purchase orders. (GET /purchase_orders) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, operation_id, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
operation_idNoQuery parameter "operation_id".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral context by disclosing that the endpoint was inferred from traffic and that results should be confirmed, plus listing return keys. However, it omits details like pagination behavior, rate limits, or authentication requirements, which keeps it at an adequate but not rich level.

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

Conciseness2/5

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

The description is bloated by an exhaustive enumeration of over 60 query parameters, which is redundant with the input schema and adds noise rather than value. While the purpose is front-loaded, the massive param list makes the description unnecessarily long and hard to scan.

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

Completeness2/5

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

For a tool with 75 parameters, nested objects, and no output schema, the description is incomplete: it lists return key names but does not explain their meaning, and it gives no guidance on how to use the many DataTables parameters. The traffic-inference caveat is helpful, but the description falls well short of what an agent needs to invoke this complex list tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 even though the schema descriptions themselves are tautological ('Query parameter X'). The description lists the full set of query parameters, but only by name—it does not explain DataTables conventions (e.g., draw, start, length, search[value]) or add any semantic meaning beyond what the schema already provides.

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

Purpose4/5

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

The description states a specific verb and resource ('List purchase orders') and includes the endpoint (GET /purchase_orders), making the core action clear. It does not explicitly differentiate this tool from the sibling report tool singleops_read_get_purchase_orders_report, so it falls short of the highest clarity tier.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives (e.g., the purchase orders report tool). The note 'Inferred from the SingleOps web app's own traffic; confirm results' is a reliability caveat, not usage guidance, and no exclusions or prerequisites are mentioned.

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

singleops_read_list_tagsList all tags (id, name, html_color, tag_type). Use the id with update_tag / delete_tagA
Read-onlyIdempotent

List all tags (id, name, html_color, tag_type). Use the id with update_tag / delete_tag. (GET /tags) Verified route. Returns JSON with keys: [].id, [].account_id, [].name, [].html_color, [].created_at, [].updated_at, [].tag_type, [].url.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value beyond that by disclosing the concrete route, that it is a verified route, and the exact response key set — useful for planning the parse.

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

Conciseness4/5

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

Front-loaded with purpose and the key navigation hint before the route and response-key detail. Slightly redundant with the title, and the field-key dump is dense, but every element is useful to an agent.

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

Completeness4/5

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

No output schema exists, and the description compensates by listing the returned JSON keys, so the agent knows the shape. Missing only minor notes such as pagination or empty-list behavior for a zero-required-param read tool.

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

Parameters3/5

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

Schema description coverage is 100%, so extra_query and response_format are already documented with their enum. The description adds nothing about either parameter, so the baseline 3 applies.

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?

Specific verb+resource ("List all tags") with the returned fields enumerated inline (id, name, html_color, tag_type), plus the underlying route. Distinct from sibling list tools like singleops_read_list_items or singleops_read_list_vendors.

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

Usage Guidelines4/5

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

Explicitly points to the follow-on tools (update_tag / delete_tag) and tells the agent to reuse the returned id, which covers the primary downstream use. It stops short of stating when NOT to use this tool versus other list/search endpoints, but the intent is clear.

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

singleops_read_list_tasks_calendarList tasks calendarC
Read-onlyIdempotent

List tasks calendar. (GET /tasks/calendar) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: client_id, tags_any, include_visits, include_tasks, exclude_recurring, exclude_one_offs, exclude_on_hold, exclude_off_hold, start, end, timezone. Returns JSON with keys: [].id, [].name, [].created_at, [].updated_at, [].start, [].all_day, [].status, [].className, [].resourceIds, [].salesResourceIds, [].allDay, [].resources_copy, [].stop, [].end, [].title, [].url, [].type, [].color, [].textColor, [].on_route, [].driver_name, [].stage_id, [].job_name.

NameRequiredDescriptionDefault
endNoQuery parameter "end".
startNoQuery parameter "start".
tags_anyNoQuery parameter "tags_any".
timezoneNoQuery parameter "timezone".
client_idNoQuery parameter "client_id".
extra_queryNoAny additional query parameters.
include_tasksNoQuery parameter "include_tasks".
include_visitsNoQuery parameter "include_visits".
exclude_on_holdNoQuery parameter "exclude_on_hold".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
exclude_off_holdNoQuery parameter "exclude_off_hold".
exclude_one_offsNoQuery parameter "exclude_one_offs".
exclude_recurringNoQuery parameter "exclude_recurring".

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already establish that this is a safe, read-only, idempotent operation. The description adds a useful caveat that the endpoint was inferred from web-app traffic and lists the return fields, but it does not explain pagination, defaults, date-range behavior, or what the many calendar fields mean.

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 description is front-loaded with the endpoint and caveat, which is good, but the long comma-separated query-param list and raw return-key dump are unstructured and could be formatted more usefully. The information is relevant but not tightly edited.

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

Completeness3/5

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

With no output schema, the description does provide the return key list, which helps an agent understand the response shape. However, it omits important context: sibling differentiation, default behavior, how the calendar variant differs from route-planner or search task tools, and what the returned fields represent.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 13 parameters at a baseline level. The description merely repeats the query parameter names without explaining semantics for flags like include_visits, exclude_recurring, or how start/end/timezone interact.

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

Purpose3/5

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

The description states a verb and resource ("List tasks calendar") and the backing endpoint, but "calendar" is not explained and there is no differentiation from close siblings such as singleops_read_list_tasks_route_planner or singleops_read_search_tasks. An agent cannot tell from the text alone which calendar/list variant is appropriate.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus sibling task-listing or calendar-event tools. The only contextual note is a caution that results were inferred from traffic and should be confirmed, which is not usage guidance.

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

singleops_read_list_tasks_route_plannerList tasks route plannerC
Read-onlyIdempotent

List tasks route planner. (GET /tasks/route_planner) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: start, end, timezone. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
endNoQuery parameter "end".
startNoQuery parameter "start".
timezoneNoQuery parameter "timezone".
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, so the safety profile is covered. The description does add the valuable caveat that the endpoint was inferred from web traffic and results should be confirmed, plus notes it returns JSON, but it never explains what the route-planner task list contains or any filter defaults.

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?

It is short and front-loaded, but the first sentence simply restates the tool name and the parenthetical endpoint adds little for an agent. The most useful sentence (the inferred-traffic caveat) is buried in the middle.

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

Completeness2/5

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

With no output schema and only a vague 'Returns the endpoint's JSON response,' the description leaves the agent without the shape of the results or how start/end/timezone constrain them. For a list endpoint whose purpose is itself ambiguous ('route planner'), this is under-specified.

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

Parameters3/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 schema's own parameter descriptions are tautological ('Query parameter "start".'). The description only repeats the parameter names (start, end, timezone) without clarifying that start/end are dates or what timezone format is expected, so it adds little meaning.

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

Purpose3/5

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

The description names the verb ('List') and resource ('tasks route planner') and gives the underlying endpoint, but 'route planner' is never explained, so it's unclear how these tasks differ from those returned by siblings like singleops_read_list_tasks_calendar or singleops_read_search_tasks. It's understandable but not differentiated.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool instead of the many sibling task/visit-route tools. The only context is a caveat to 'confirm results,' which warns of uncertainty but doesn't help an agent choose.

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

singleops_read_list_text_messages_reportList text messages reportC
Read-onlyIdempotent

List text messages report. (GET /text_messages/report.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description does add genuine value with the 'inferred from traffic; confirm results' reliability warning and the return-key list, but says nothing about pagination defaults or how the data/meta fields behave.

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

Conciseness2/5

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

The purpose is front-loaded, but the bulk of the text is a single sprawling sentence dumping all ~50 parameter names that are already fully enumerated in the schema. This is redundant bloat rather than useful concision.

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

Completeness3/5

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

For a read-only report tool with strong annotations and no output schema, listing return keys partially compensates. But with 50 parameters the description gives no help on which params matter (e.g., search[value], start, length for filtering/paging), leaving the agent to reverse-engineer DataTables semantics.

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

Parameters3/5

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

Schema description coverage is nominally 100%, so the baseline of 3 applies. However, the description merely re-lists the same opaque DataTables parameter names (draw, columns[n][...], order[0][dir]) without explaining their meaning, so it adds no semantic value over the schema.

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

Purpose3/5

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

The first sentence 'List text messages report' essentially restates the title, but the endpoint path (GET /text_messages/report.json) and the listed return keys (recordsTotal, recordsFiltered, data) hint at a DataTables-style paginated report. It never distinguishes this from the sibling singleops_read_list_client_text_messages, so an agent cannot easily tell which to pick.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no comparison to alternatives despite a large sibling set of report tools. 'Inferred from the SingleOps web app's own traffic; confirm results' is a reliability caveat, not usage direction.

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

singleops_read_list_timesheet_events_listList timesheet events listC
Read-onlyIdempotent

List timesheet events list. (GET /timesheet_events/list.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: timesheet[date], timesheet[user_id], draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized, include_errors. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
include_errorsNoQuery parameter "include_errors".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
timesheet[date]NoQuery parameter "timesheet[date]".
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
order[0][column]NoQuery parameter "order[0][column]".
timesheet[user_id]NoQuery parameter "timesheet[user_id]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".

TDQS

C2.8/5.0
Behavior4/5

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

Annotations already flag readOnly/idempotent/non-destructive, so the bar is lower. The description adds genuinely useful context: that the endpoint was inferred from traffic and results should be confirmed, plus the exact return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings).

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

Conciseness2/5

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

Purpose is front-loaded, but roughly half the description is a 50+ item comma-dumped parameter list that duplicates the schema verbatim. That noise crowds out the few sentences that actually matter.

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

Completeness3/5

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

For a 56-param tool with no output schema, the description does supply the return keys and a reliability caveat. However, it leaves the overwhelming majority of parameters (the columns/order/search DataTables block) unexplained, so an agent still can't reason about how to use them.

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

Parameters2/5

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

Schema coverage is nominally 100%, but every property description is a placeholder ("Query parameter X"), so no real semantics are conveyed. The description merely repeats the flat list of params without explaining what timesheet[date]/timesheet[user_id] mean or that the columns[N][...] block is DataTables boilerplate.

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

Purpose3/5

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

States verb+resource ("List timesheet events") and the endpoint, so an agent can tell it lists timesheet events. But it does not distinguish this from the sibling singleops_read_list_timesheets_list, and the phrasing largely restates the name/title.

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

Usage Guidelines2/5

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

The only guidance is "Inferred from the SingleOps web app's own traffic; confirm results," which is a reliability caveat, not when-to-use guidance. No mention of when to pick this over the timesheets_list sibling or what filters are typical.

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

singleops_read_list_timesheets_listList timesheets listC
Read-onlyIdempotent

List timesheets list. (GET /timesheets/list.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: timesheet[date], draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
timesheet[date]NoQuery parameter "timesheet[date]".
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already cover readOnly, idempotent, non-destructive, and openWorld, so the safety bar is met elsewhere. The description adds real value by disclosing that the endpoint was inferred from observed app traffic and results should be verified, plus listing the response keys, but it omits paging/pagination behavior and how the DataTables-style params actually affect the result.

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

Conciseness2/5

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

Purpose and endpoint are front-loaded reasonably, but the bulk of the text is a low-value alphabetical dump of every parameter name that merely duplicates the schema. This bloat obscures the one genuinely useful caveat (inferred endpoint, verify results).

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

Completeness3/5

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

For a 62-parameter DataTables list with no output schema, the description does report the returned keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), which is useful. But it never explains what a timesheet is, how paging/search params behave, or the relationship to the timesheet report siblings, leaving real gaps for a complex tool.

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

Parameters3/5

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

Schema coverage is 100%, so the schema carries the parameter burden and baseline 3 applies. The description merely re-dumps 60+ parameter names (draw, columns[i][data], etc.) without explaining DataTables semantics, value formats, or how table_filter_start/end or timesheet[date] should be shaped, adding little beyond the schema.

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

Purpose3/5

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

The description says it lists timesheets and includes the raw endpoint (GET /timesheets/list.json), so verb and resource are identifiable. However, the phrasing 'List timesheets list' is tautological and it does nothing to distinguish this from sibling reads like singleops_read_list_timesheet_events_list or the timesheet summary/totals reports.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus the many timesheet-related siblings (events list, summary report, totals report). The 'confirm results' caveat is a reliability warning, not usage guidance, and no prerequisites or exclusions are given.

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

singleops_read_list_users_crewsList users crewsB
Read-onlyIdempotent

List users crews. (GET /users/crews.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: addUnassignedUser. Returns JSON with keys: [].id, [].account_id, [].name, [].email, [].manager_user_id, [].rate, [].first_name, [].last_name, [].custom_fid, [].vendor_id, [].is_sales_rep, [].office, [].mobile, [].route_capacity, [].color, [].color_priority, [].role_id, [].html_color, [].text_color, [].title.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
addUnassignedUserNoQuery parameter "addUnassignedUser".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, openWorld and non-destructive, so the bar is lower, and the description still adds real value: the underlying endpoint, the disclosure that it was inferred from the web app's own traffic, and an explicit instruction to confirm results. That reliability warning is exactly the kind of behavioral context annotations cannot convey; only the pagination/volume behavior is left unstated.

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

Conciseness4/5

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

Information is front-loaded in a logical order: purpose, endpoint, reliability caveat, query params, return shape. The first sentence duplicates the title verbatim and could be replaced with a substantive scope statement, but the long field list earns its space given there is no output schema.

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

Completeness4/5

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

With no output schema, enumerating the returned keys (id, name, email, role_id, route_capacity, etc.) is genuinely useful and fills that gap. The remaining hole is the core ambiguity of users vs. crews and what the two entity types mean here, which the field list alone does not resolve.

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

Parameters3/5

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

Schema description coverage is 100% and there are only three parameters, so the schema carries the load. The description names addUnassignedUser as a query param seen in traffic, which confirms it is real, but it never explains what the flag does or how extra_query interacts with it.

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

Purpose3/5

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

The opening sentence "List users crews" restates the title and leaves it ambiguous whether this returns users, crews, or a combined roster. The GET path and the note that it was inferred from observed web traffic add some specificity, but nothing distinguishes it from sibling singleops_read_list_users_current, which an agent would plausibly confuse it with.

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

Usage Guidelines2/5

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

There is no statement of when to call this versus singleops_read_list_users_current or singleops_read_search_labor_resources, and no prerequisites or exclusions. The "confirm results" caveat is a reliability note, not usage guidance, so the agent must infer selection from the name alone.

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

singleops_read_list_users_currentList users currentC
Read-onlyIdempotent

List users current. (GET /api/v1/users/current) Inferred from the SingleOps web app's own traffic; confirm results. Returns JSON with keys: id, account_id, name, email, manager_user_id, rate, first_name, last_name, custom_fid, vendor_id, is_sales_rep, office, mobile, route_capacity, color, color_priority, role_id, html_color, text_color, title, operations, sales_reps, operation_id, all_operations, is_super_admin, role, default_dashboard_id.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description adds a meaningful caution that results are inferred from web app traffic and should be confirmed, but it does not explain pagination, authentication, filtering behavior, or why 'current' is scoped as it is.

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 definition is front-loaded with the endpoint and reliability caveat, but the long inline enumeration of return keys is bulky and not structurally broken out. It is efficient in terms of no filler, yet the field list dominates the description.

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

Completeness3/5

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

Because there is no output schema, the description usefully lists returned JSON keys and discloses the inferred-data caveat. However, it leaves 'current' undefined and does not clarify scope, filtering, pagination, or how results relate to sibling user tools.

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

Parameters3/5

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

Schema description coverage is 100%, with both extra_query and response_format fully described in the schema. The description does not mention either parameter, so it adds no parameter semantics beyond what the schema already provides; baseline 3 applies.

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

Purpose3/5

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

The description identifies the resource as users via 'List users current' and adds the endpoint GET /api/v1/users/current. However, 'current' is not explained, and the description does not distinguish this tool from siblings such as singleops_read_whoami or singleops_read_list_users_crews, leaving the exact scope ambiguous.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like singleops_read_whoami or singleops_read_list_users_crews. The only procedural note is 'confirm results,' which is a reliability caveat rather than usage guidance.

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

singleops_read_list_vendorsList vendorsB
Read-onlyIdempotent

List vendors. (GET /vendors) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
order[0][column]NoQuery parameter "order[0][column]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare this as a safe, idempotent read. The description adds valuable context: the data is inferred from web app traffic and results should be confirmed, and it lists return keys. It does not cover auth or rate limits, but with annotations covering safety, this is a strong addition.

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

Conciseness2/5

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

The description is front-loaded with a clear sentence, but then bloats with a 40+ item list of query parameters that duplicates the schema rather than summarizing. This is not appropriately sized; the parameter enumeration could be replaced by a brief note about DataTables conventions.

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

Completeness3/5

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

For a complex tool with 47 optional parameters and no output schema, the description provides the endpoint, a reliability caveat, and return keys. However, it lacks explanation of how to use the DataTables pagination/sorting/search parameters, which is important for correct invocation despite 100% schema coverage.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all 47 parameters. The description merely enumerates the same parameter names without explaining DataTables semantics (e.g., what draw, start, length, or column search params do), adding no meaning beyond the structured data.

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

Purpose4/5

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

The description states a specific verb and resource ('List vendors') and includes the endpoint (GET /vendors), making the tool's purpose clear. There is no sibling vendor tool, so differentiation is inherent, though scope (e.g., all vendors vs. filtered) is not specified.

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

Usage Guidelines2/5

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

The description offers no when-to-use guidance, no alternatives among the many list_* siblings, and no prerequisites. The caveat 'Inferred from traffic; confirm results' is a reliability note, not usage guidance.

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

singleops_read_list_visits_awaiting_scheduling_statsList visits awaiting scheduling statsB
Read-onlyIdempotent

List visits awaiting scheduling stats. (GET /visits/awaiting_scheduling_stats) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: include_visits, include_tasks, exclude_on_hold, month, year. Returns JSON with keys: unscheduled_count, unscheduled_tbd_month_count.

NameRequiredDescriptionDefault
yearNoQuery parameter "year".
monthNoQuery parameter "month".
extra_queryNoAny additional query parameters.
include_tasksNoQuery parameter "include_tasks".
include_visitsNoQuery parameter "include_visits".
exclude_on_holdNoQuery parameter "exclude_on_hold".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare this as a safe, read-only, idempotent, non-destructive operation. The description adds a useful reliability caveat that the endpoint was inferred from web-app traffic and results should be confirmed, but it does not explain filtering behavior, defaults, or freshness beyond that.

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

Conciseness4/5

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

The description is compact and front-loads the tool purpose, endpoint, caveat, and return keys. Some of the parameter listing duplicates what the schema already provides, but the overall structure is efficient.

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

Completeness4/5

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

Given the rich annotations and full schema coverage, the description is largely complete for invocation. Since there is no output schema, including the return keys is valuable, though the precise meaning of the two counts is not explained.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema carries the parameter documentation burden. The description lists the query parameters seen but adds little semantic detail such as how month/year interact or what include_visits/include_tasks actually change.

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

Purpose4/5

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

The description states a specific verb and resource: listing visits awaiting scheduling stats, and names the endpoint. It clearly identifies the resource domain, though it does not explicitly differentiate from related visit-listing siblings.

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

Usage Guidelines2/5

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

It does not explain when to use this tool versus related siblings such as general visit lists, dashboards, or approved-visit searches. The only guidance is a caveat to confirm inferred results, which is not usage guidance.

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

singleops_read_list_visits_index_fullcalendar_eventsList visits index fullcalendar eventsC
Read-onlyIdempotent

List visits index fullcalendar events. (GET /visits/index_fullcalendar_events.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: visit_stage_id, client_id, tags_any, include_visits, include_tasks, exclude_recurring, exclude_one_offs, exclude_on_hold, exclude_off_hold, start, end, timezone. Returns JSON with keys: [].id, [].name, [].created_at, [].updated_at, [].visit_stage, [].job_id, [].location, [].account_reference_number, [].exclude_from_calendar, [].all_day, [].estimated_labor, [].custom_input_values, [].className, [].resourceIds, [].salesResourceIds, [].allDay, [].resources_copy, [].start, [].stop, [].end, [].title, [].is_recurring, [].on_route, [].driver_name, [].variable_recurrence, [].url, [].type, [].color, [].textColor, [].stage_id, [].total, [].can_update_recurrence_info_from_calendar, [].pending_calculation, [].fixed_invoice, [].on_hold.

NameRequiredDescriptionDefault
endNoQuery parameter "end".
startNoQuery parameter "start".
tags_anyNoQuery parameter "tags_any".
timezoneNoQuery parameter "timezone".
client_idNoQuery parameter "client_id".
extra_queryNoAny additional query parameters.
include_tasksNoQuery parameter "include_tasks".
include_visitsNoQuery parameter "include_visits".
visit_stage_idNoQuery parameter "visit_stage_id".
exclude_on_holdNoQuery parameter "exclude_on_hold".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
exclude_off_holdNoQuery parameter "exclude_off_hold".
exclude_one_offsNoQuery parameter "exclude_one_offs".
exclude_recurringNoQuery parameter "exclude_recurring".

TDQS

C2.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds a useful reliability caveat ("confirm results") and enumerates return fields, but does not explain pagination, date-range behavior, authentication, or how FullCalendar filtering works. It adds context without contradicting annotations.

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

Conciseness2/5

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

The description is front-loaded with a redundant purpose sentence, then spends most of its length on a 40+ item return-key dump and a parameter-name list that repeats schema fields. The return-key inventory is useful without an output schema, but the structure is list-heavy rather than prioritized.

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

Completeness3/5

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

No output schema exists, but the description compensates somewhat by naming the endpoint, query parameters, and return keys. It still lacks semantics for the 14 parameters and FullCalendar-specific behavior, so an agent can attempt a call but may need to confirm the results.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3, but the schema descriptions are generic ("Query parameter X"). The description merely repeats the query parameter names and adds no format, allowed values, defaults, or meaning for parameters such as start, end, and timezone.

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

Purpose2/5

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

The opening sentence exactly restates the tool name/title ("List visits index fullcalendar events"), and the endpoint string does not explain what a FullCalendar visit event is or how it differs from sibling holiday/route-planner event tools. The return-key list hints at calendar fields, but the stated purpose remains tautological rather than clarifying.

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

Usage Guidelines2/5

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

The only guidance is the caveat "Inferred from the SingleOps web app's own traffic; confirm results." There is no when-to-use guidance, no exclusion criteria, and no routing to the many sibling visit-listing tools, leaving the agent to infer usage from the name alone.

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

singleops_read_list_visits_index_fullcalendar_holiday_eventsList visits index fullcalendar holiday eventsC
Read-onlyIdempotent

List visits index fullcalendar holiday events. (GET /visits/index_fullcalendar_holiday_events.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: client_id, tags_any, include_visits, include_tasks, exclude_recurring, exclude_one_offs, exclude_on_hold, exclude_off_hold, start, end, timezone. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
endNoQuery parameter "end".
startNoQuery parameter "start".
tags_anyNoQuery parameter "tags_any".
timezoneNoQuery parameter "timezone".
client_idNoQuery parameter "client_id".
extra_queryNoAny additional query parameters.
include_tasksNoQuery parameter "include_tasks".
include_visitsNoQuery parameter "include_visits".
exclude_on_holdNoQuery parameter "exclude_on_hold".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
exclude_off_holdNoQuery parameter "exclude_off_hold".
exclude_one_offsNoQuery parameter "exclude_one_offs".
exclude_recurringNoQuery parameter "exclude_recurring".

TDQS

C2.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description does add real context beyond them: it discloses that the endpoint was inferred from observed web-app traffic and that results should be confirmed, plus that it returns the endpoint's JSON response. It stops short of describing pagination, date-range defaults, or what the holiday data actually contains.

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?

Three short sentences with no padding, and the caveat about inferred behavior is placed early enough to matter. However, the first sentence is pure redundancy with the title, so not every sentence earns its place. Structurally adequate but not optimized.

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

Completeness2/5

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

With 13 parameters, all placeholder-described, no output schema, and a genuinely ambiguous subject ('holiday events'), an agent has little to reason about before calling. The description should explain the include/exclude flag interactions and the distinction from the non-holiday fullcalendar sibling, and does neither.

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

Parameters3/5

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

Schema description coverage is nominally 100%, but every parameter description is a placeholder ('Query parameter "end".'), so the schema conveys names only. The description's enumeration of query params mirrors the schema without explaining the meaning of the boolean include/exclude flags or the expected format of start/end/timezone. Baseline 3 applies since coverage is high and the description does not compensate further.

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

Purpose2/5

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

The description opens by restating the tool name verbatim ('List visits index fullcalendar holiday events'), which is a tautology rather than an explanation. It never clarifies what 'holiday events' means in this context, and it does not distinguish this tool from the closely named sibling singleops_read_list_visits_index_fullcalendar_events. Only the appended HTTP route adds any concrete information beyond the title.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, and despite a near-identical sibling (fullcalendar_events vs fullcalendar_holiday_events) the description gives no rule for choosing between them. The only directive is a generic 'confirm results' caveat, which is not a usage guideline.

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

singleops_read_list_visits_index_route_planner_eventsList visits index route planner eventsC
Read-onlyIdempotent

List visits index route planner events. (GET /visits/index_route_planner_events.json) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: visit_stage_id, start, end, timezone. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
endNoQuery parameter "end".
startNoQuery parameter "start".
timezoneNoQuery parameter "timezone".
extra_queryNoAny additional query parameters.
visit_stage_idNoQuery parameter "visit_stage_id".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already carry readOnly, idempotent, non-destructive, and open-world hints, so the safety profile is covered. The description adds one genuinely useful behavioral fact beyond the annotations: the endpoint shape was reverse-engineered from observed web-app traffic, so results should be verified. It stops short of disclosing pagination, date-format expectations for start/end, or auth requirements.

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

Conciseness4/5

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

Three short sentences with the endpoint path and parameters front-loaded and no filler. The final 'Returns the endpoint's JSON response' is near-tautological but brief and harmless.

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

Completeness3/5

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

For a read-only list endpoint with no required parameters, no output schema, and full schema coverage, the bar is modest and annotations cover safety. Still, the description leaves unclear what an 'event' record contains, whether start/end filter by date range, and how results are ordered or paginated, which matters for an open-world list call.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema is nominally authoritative, though its descriptions are trivial $ref placeholders ('Query parameter "end"'). The description only repeats the parameter names (visit_stage_id, start, end, timezone) without clarifying value formats such as date strings or timezone identifiers. This meets the baseline but adds no semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description restates the tool name and adds the underlying endpoint path (GET /visits/index_route_planner_events.json), which confirms it is a read of route-planner event data. However, it never explains what a 'visit index route planner event' actually is or how it differs from close siblings like singleops_read_list_visits_index_fullcalendar_events or singleops_read_list_visits_route_planner_data. An agent cannot route between those siblings from this text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is the caution 'Inferred from the SingleOps web app's own traffic; confirm results,' which is a reliability warning rather than a when-to-use instruction. There is no statement of when this endpoint is preferable to the other visit/route-planner siblings, and no prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_list_visits_route_planner_dataList visits route planner dataC
Read-onlyIdempotent

List visits route planner data. (GET /visits/route_planner_data) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], include_tasks, include_visits, end, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
endNoQuery parameter "end".
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
include_tasksNoQuery parameter "include_tasks".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
include_visitsNoQuery parameter "include_visits".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
order[0][column]NoQuery parameter "order[0][column]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".

TDQS

C2.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds two things beyond that: provenance ('inferred from the SingleOps web app's own traffic; confirm results'), a genuine trust/reliability signal, and the shape of the return payload (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), which matters since no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is correctly front-loaded, but the bulk of the text is a single ~60-item comma run of query parameter names that simply duplicates the input schema and is hard to scan. That sentence does not earn its place; the useful content (provenance caveat, return keys) is buried around it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 56-parameter, zero-required endpoint with no output schema, the description should at minimum explain pagination defaults and the column/search parameter families. It names the parameters and lists return keys, but leaves an agent unable to construct a meaningful first call without reverse-engineering DataTables conventions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is nominally 100%, but every property description is a tautology ('Query parameter "end".'), so real semantic coverage is near zero. The description merely re-enumerates the same parameter names verbatim; it never explains the DataTables conventions that matter here (draw as an echo token, start/length as pagination, search[value] as global search, columns[N][search][value] as per-column filters), so neither schema nor prose teaches the agent how to drive a 56-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List visits route planner data') plus the underlying endpoint GET /visits/route_planner_data. It is clear what the tool does, but it does not distinguish itself from near-identical siblings such as singleops_read_list_visits_index_route_planner_events, singleops_read_list_tasks_route_planner, or singleops_read_list_visits_user_routes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this versus the other route-planner and visit-listing siblings. The only guidance is a reliability caveat ('confirm results'), which tells the agent to distrust output but not when to pick this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_list_visits_user_routesList visits user routesC
Read-onlyIdempotent

List visits user routes. (GET /visits/user_routes) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: start, end. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
endNoQuery parameter "end".
startNoQuery parameter "start".
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and openWorld behavior, so the safety profile is covered elsewhere. The description does add one piece of genuine context: the endpoint was inferred from web-app traffic and results should be confirmed, which warns the agent about reliability. It says nothing about pagination or result size, though.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, purpose first, with no filler. The parenthetical endpoint and the raw-HTTP framing are slightly redundant with the tool name but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list endpoint with full schema coverage and no output schema, the definition covers invocation adequately and flags result reliability. It still leaves "user routes" undefined and gives no sense of response shape or volume relative to the many similar visit endpoints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the start/end/extra_query/response_format semantics are already documented. "Query params seen: start, end" merely repeats the schema and adds no format or semantics for the date range, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a verb and resource ("List visits user routes") and the underlying endpoint, so the agent knows it is a read of route data. But "user routes" is left undefined, and nothing distinguishes it from close siblings such as singleops_read_list_visits_route_planner_data or singleops_read_list_visits_index_route_planner_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus the many other visit/route list endpoints in the sibling set. The line "confirm results" is a reliability caveat, not usage guidance, and no exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_list_widgetsList widgetsB
Read-onlyIdempotent

List widgets. (GET /api/v1/widgets) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: dashboard_id. Returns the endpoint's JSON response.

NameRequiredDescriptionDefault
extra_queryNoAny additional query parameters.
dashboard_idNoQuery parameter "dashboard_id".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=true, idempotent=true, openWorld=true, so safety is covered. The description adds genuinely useful context that the endpoint was inferred from observed web-app traffic and results should be verified, but says nothing about pagination, result size, or what a widget record contains.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short clauses, front-loaded with the action and endpoint. The parenthetical route and 'Query params seen:' phrasing are terse without being wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing returns and offers only 'the endpoint's JSON response', leaving the shape of widget objects unknown. Adequate to call the tool, thin for interpreting results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description echoes only the dashboard_id query param and adds no semantics (format, filtering effect, whether omitting it returns all widgets) beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List widgets') and gives the underlying endpoint GET /api/v1/widgets, so the agent knows exactly what it fetches. It does not explain what a widget is in this domain or how this differs from dashboard-level siblings like singleops_read_get_dashboard.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance and no named alternatives among the many list_* siblings. The only contextual note is a caution ('confirm results'), which is a reliability warning rather than routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_clientsSearch clients (server-side table query: paging, sorting, filters)B
Read-onlyIdempotent

Search clients (server-side table query: paging, sorting, filters). (GET /clients/data_table) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], columns[12][data], columns[12][name], columns[12][searchable], columns[12][orderable], columns[12][search][value], columns[12][search][regex], columns[13][data], columns[13][name], columns[13][searchable], columns[13][orderable], columns[13][search][value], columns[13][search][regex], columns[14][data], columns[14][name], columns[14][searchable], columns[14][orderable], columns[14][search][value], columns[14][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], sales_rep_ids[], show_inactive_clients, show_on_hold_clients, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
sales_rep_ids[]NoQuery parameter "sales_rep_ids[]".
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
columns[12][data]NoQuery parameter "columns[12][data]".
columns[12][name]NoQuery parameter "columns[12][name]".
columns[13][data]NoQuery parameter "columns[13][data]".
columns[13][name]NoQuery parameter "columns[13][name]".
columns[14][data]NoQuery parameter "columns[14][data]".
columns[14][name]NoQuery parameter "columns[14][name]".
settings_initializedNoQuery parameter "settings_initialized".
show_on_hold_clientsNoQuery parameter "show_on_hold_clients".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
show_inactive_clientsNoQuery parameter "show_inactive_clients".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[12][orderable]NoQuery parameter "columns[12][orderable]".
columns[13][orderable]NoQuery parameter "columns[13][orderable]".
columns[14][orderable]NoQuery parameter "columns[14][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[12][searchable]NoQuery parameter "columns[12][searchable]".
columns[13][searchable]NoQuery parameter "columns[13][searchable]".
columns[14][searchable]NoQuery parameter "columns[14][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".
columns[12][search][regex]NoQuery parameter "columns[12][search][regex]".
columns[12][search][value]NoQuery parameter "columns[12][search][value]".
columns[13][search][regex]NoQuery parameter "columns[13][search][regex]".
columns[13][search][value]NoQuery parameter "columns[13][search][value]".
columns[14][search][regex]NoQuery parameter "columns[14][search][regex]".
columns[14][search][value]NoQuery parameter "columns[14][search][value]".

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description's one genuine addition is provenance and reliability ('inferred from traffic; confirm results'), which is valuable. It omits DataTables mechanics an agent must know: draw echoed for de-duplication, start/length paging defaults, and the distinction between recordsTotal and recordsFiltered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence and the trailing return-keys sentence are well-placed, but the body is a ~100-item verbatim dump of query parameter names that duplicates the schema and buries the genuinely useful caveat. Roughly 90% of the text earns no place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 104-parameter, nested, annotation-light-on-semantics tool with no output schema, the description should tell the agent the minimal viable call (e.g., start/length, optional search[value], optional rep/inactive filters) and what 'data' rows contain. It lists return keys but gives no guidance on columns[0..14] meaning, which is the crux of using a DataTables endpoint correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is nominally 100%, but the schema's own descriptions are placeholders ('Query parameter "draw".'), and the description merely repeats that same list verbatim without adding semantics — it never explains what start/length, draw, search[value], show_inactive_clients, or sales_rep_ids[] actually do. Baseline 3 applies since the structured field nominally covers every parameter, but no real meaning is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Search clients') plus the mechanism ('server-side table query: paging, sorting, filters') and the HTTP route. It does not distinguish itself from client-adjacent siblings such as singleops_read_lead_list_clients_search_by_field or the various list_client_* tools, so an agent still has to guess which client-search surface to use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Server-side table query' implies the large-table / paginated scenario, and the 'Inferred from ... confirm results' note hints at caution, but there is no explicit when-to-use, when-not, or named alternative. With dozens of sibling list/search tools, the absence of routing guidance is a real gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_invoicesSearch invoices (server-side table query: paging, sorting, filters)B
Read-onlyIdempotent

Search invoices (server-side table query: paging, sorting, filters). (POST /invoices/data_table) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real context beyond the annotations: the underlying endpoint (POST /invoices/data_table), the fact that it is a read-only query sent as POST with filters in the body, the response keys (recordsTotal, recordsFiltered, data, etc.), and the caveat that the shape was inferred from web-app traffic and results should be confirmed. The annotations already cover safety/idempotency, so this is a solid supplement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence front-loads well, but the bulk of the description is a machine-dumped, repetitive enumeration of nearly identical column keys that is truncated mid-item. It is noise rather than usable instruction, and a summary like 'DataTables request with per-column search/order config' would convey the same thing in one line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers endpoint, method, response keys and a reliability caveat, which is respectable for a tool with no output schema. But for a nested, free-form body parameter it leaves the agent without enough to construct a working request — valid column identifiers, filter value formats, and paging mechanics are all unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is technically 100%, but the schema itself just says 'Match the fields listed in the description', so the description must carry the parameter burden. It dumps raw DataTables keys (draw, columns[n][data], columns[n][search][value], etc.), which lists names but never explains what values are valid, which column names exist, or what 'draw' means, and the list truncates at columns[6][searchable].

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource ('Search invoices') plus the mechanism: server-side DataTables-style query with paging, sorting and filters. That is far more specific than the title alone. It does not, however, distinguish itself from near-identical siblings such as singleops_read_search_invoices_2 or singleops_read_list_client_invoices, so an agent cannot tell which one to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus the several other invoice search/list tools in the sibling set. The only usage-adjacent statement is 'Read-only query sent as POST (filters go in body)', which explains mechanics rather than selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_invoices_2Search invoices (server-side table query: paging, sorting, filters)B
Read-onlyIdempotent

Search invoices (server-side table query: paging, sorting, filters). (POST /invoices/invoices_datatable) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, and the description adds genuinely new context: this read operation is issued as a POST with filters in the body, and it lists the response keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings). The 'inferred from traffic, confirm results' caveat is a useful honesty signal. It stops short of describing page-size limits or what meta/settings contain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence and return-key list are well front-loaded, but roughly half the text is a repetitive, truncated enumeration of identical per-column keys that adds bulk without adding meaning. It should have been summarized (e.g., 'columns[0..N] each with data/name/searchable/orderable/search[value|regex]') rather than dumped verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description does supply the route, the transport quirk (POST for a read), the response shape, and the traffic-inferred caveat. But for a tool whose title promises paging and sorting, it never explains how to page or sort, and the body key list is incomplete, so an agent would likely need trial and error to build a working request.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is a generic body object that explicitly defers to the description ('Match the fields listed in the description'), so the description is the only source of parameter detail. It enumerates DataTables column keys, but the list is a raw truncated dump (stopping mid-way at columns[6][searchable]) that omits the keys actually needed for the advertised paging and sorting (start, length, order[i][column], order[i][dir]) and explains none of the keys' meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search invoices') and adds the mechanism ('server-side table query: paging, sorting, filters') plus the underlying route POST /invoices/invoices_datatable. It does not distinguish itself from the near-identical siblings singleops_read_search_invoices and singleops_read_search_invoices_archived_invoices, so an agent cannot tell which invoice search to pick from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance and no mention of the sibling invoice-search tools. The only caveat, 'Inferred from the SingleOps web app's own traffic; confirm results,' is a reliability warning rather than a selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_invoices_archived_invoicesSearch invoices archived invoices (server-side table query: paging, sorting, filters)C
Read-onlyIdempotent

Search invoices archived invoices (server-side table query: paging, sorting, filters). (GET /invoices/archived_invoices_data_table) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so safety is covered. The description adds two genuinely useful traits beyond that: the endpoint was inferred from observed web-app traffic ("confirm results") and the response carries DataTables envelope keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings). It does not explain the semantics of those keys (e.g., that draw is an echo counter) or any limits on length/start.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is well-formed and front-loaded, but it is followed by a ~50-item comma-separated dump of parameter names that duplicates the input schema verbatim and consumes most of the text. That bulk earns nothing and buries the one genuinely novel sentence (the inferred-traffic caveat) in the middle.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 50 optional, nested parameters and no output schema, the description should explain how to build a valid DataTables query (what draw/start/length do, sane defaults, which columns map to which invoice fields) and what the returned data rows look like. It instead lists key names and stops, leaving an agent unable to invoke this confidently beyond passing everything through.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, but each schema description is a tautology ("Query parameter \"draw\""), so the schema itself conveys little meaning. The description contributes only a coarse grouping (paging = draw/start/length, sorting = order, filters = search/columns) and then re-lists the raw parameter names without explaining any of them. Baseline 3 is appropriate given coverage, but no real semantic lift is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and a scoped resource ("Search invoices archived invoices") and gives the backing endpoint GET /invoices/archived_invoices_data_table, so an agent can tell this targets archived invoices rather than active ones. It does not explicitly contrast with the many similar siblings (singleops_read_search_invoices, singleops_read_search_invoices_2, singleops_read_list_invoices_invoice_totals), leaving disambiguation to the name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this versus the sibling invoice-search tools, nor any prerequisite, exclusion, or typical scenario. The parenthetical about paging/sorting/filters describes capability, not usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_jobsSearch jobs (server-side table query: paging, sorting, filters)A
Read-onlyIdempotent

Search jobs (server-side table query: paging, sorting, filters). (POST /jobs/jobs_datatable) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: job_id. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
job_idNoQuery parameter "job_id".
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely non-redundant context: that a read-only query is issued as a POST with filters in the body, which keys come back (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), and that the shape was inferred from observed web-app traffic and should be verified. That last point is a valuable trust caveat an agent would otherwise miss.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dominated by a mechanical, repetitive enumeration of columns[0] through columns[6] that is cut off mid-pattern ('columns[6][searchable]'), adding noise rather than structure. The useful facts (method, return keys, inference caveat) are buried after this list and the enumeration should have been summarized as a pattern.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the response key list, HTTP method, param-vs-body split, and a provenance/reliability caveat, which is close to everything an agent needs. The one gap is that the column-index semantics (what each index corresponds to) are never explained, leaving the columnar filter payload opaque.

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% but the top-level body parameter is a free-form object with no meaningful field documentation, so the description's enumeration of observed body keys (draw, columns[n][data|name|searchable|orderable|search][value|regex]) is what actually tells the agent how to build the request. It also clarifies that job_id is a query param while filters go in the body.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search jobs') plus the mechanism ('server-side table query: paging, sorting, filters'), which tells an agent this is the DataTables-style paged query. However, it does not distinguish itself from closely named siblings such as singleops_read_search_jobs_report, singleops_read_search_jobs_invoices, or singleops_read_search_jobs_progress_billing, so the agent cannot be certain which job-search variant to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the 'server-side table query' framing and the endpoint hint (POST /jobs/jobs_datatable). There is no explicit statement of when to prefer this over the other search_jobs_* siblings, nor any prerequisite or exclusion. The 'confirm results' caveat is a reliability warning rather than selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_jobs_invoicesSearch jobs invoices (server-side table query: paging, sorting, filters) for one idB
Read-onlyIdempotent

Search jobs invoices (server-side table query: paging, sorting, filters) for one id. (GET /jobs/{id}/invoices_datatable) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], columns[11][data], columns[11][name], columns[11][searchable], columns[11][orderable], columns[11][search][value], columns[11][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
idYesPath parameter {id} (record id).
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
order[0][column]NoQuery parameter "order[0][column]".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
columns[11][data]NoQuery parameter "columns[11][data]".
columns[11][name]NoQuery parameter "columns[11][name]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[11][orderable]NoQuery parameter "columns[11][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
columns[11][searchable]NoQuery parameter "columns[11][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".
columns[11][search][regex]NoQuery parameter "columns[11][search][regex]".
columns[11][search][value]NoQuery parameter "columns[11][search][value]".

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The read-only, idempotent, non-destructive annotations already cover the safety profile. The description adds meaningful context by noting the endpoint was inferred from web-app traffic and that results should be confirmed, plus it lists the response keys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and reliability caveat are front-loaded, but the description wastes substantial space enumerating query parameter names that are already present in the schema. This redundant list makes it much longer than necessary without adding useful guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 84-parameter server-side table query with no output schema, the description usefully includes the endpoint, return keys, and an inference warning. It still leaves important invocation details unclear, especially how to use the DataTables column, order, search, and paging parameters semantically.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema technically documents every parameter. However, most parameter descriptions are tautological ('Query parameter "..."'), and the description only lists parameter names without explaining DataTables semantics, defaults, or column meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: searching jobs invoices for one job id, with server-side table query behavior. The scope makes it distinguishable from broader siblings like search_jobs or search_invoices, though it does not explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scope: use this when listing invoices associated with a specific job id and needing table-style paging, sorting, or filtering. It provides no explicit when-not-use guidance or comparison to sibling invoice/job search tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_jobs_progress_billingSearch jobs progress billing (server-side table query: paging, sorting, filters)C
Read-onlyIdempotent

Search jobs progress billing (server-side table query: paging, sorting, filters). (GET /jobs/progress_billing_datatable) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], columns[8][data], columns[8][name], columns[8][searchable], columns[8][orderable], columns[8][search][value], columns[8][search][regex], columns[9][data], columns[9][name], columns[9][searchable], columns[9][orderable], columns[9][search][value], columns[9][search][regex], columns[10][data], columns[10][name], columns[10][searchable], columns[10][orderable], columns[10][search][value], columns[10][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], all_stage_ids_dropdown, operation_id, client_id, assignee_id, sales_rep_id, from_date, to_date, date_filter_on, search_custom_input_id, search_custom_input_term, include_tag_ids, exclude_tag_ids, tags_any, manual_progress_type, milestone_progress_type, items, item_groups, include_recurring, include_one_offs, include_proposal_groups, include_on_hold, include_off_hold, include_unlimited_job, include_pickups, include_deliveries, requires_deposit, deposit_paid, unpaid_deposit, flyout, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
itemsNoQuery parameter "items".
startNoQuery parameter "start".
flyoutNoQuery parameter "flyout".
lengthNoQuery parameter "length".
to_dateNoQuery parameter "to_date".
tags_anyNoQuery parameter "tags_any".
client_idNoQuery parameter "client_id".
from_dateNoQuery parameter "from_date".
assignee_idNoQuery parameter "assignee_id".
extra_queryNoAny additional query parameters.
item_groupsNoQuery parameter "item_groups".
colReorder[]NoQuery parameter "colReorder[]".
deposit_paidNoQuery parameter "deposit_paid".
operation_idNoQuery parameter "operation_id".
sales_rep_idNoQuery parameter "sales_rep_id".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
date_filter_onNoQuery parameter "date_filter_on".
unpaid_depositNoQuery parameter "unpaid_deposit".
exclude_tag_idsNoQuery parameter "exclude_tag_ids".
include_on_holdNoQuery parameter "include_on_hold".
include_pickupsNoQuery parameter "include_pickups".
include_tag_idsNoQuery parameter "include_tag_ids".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
columns[8][data]NoQuery parameter "columns[8][data]".
columns[8][name]NoQuery parameter "columns[8][name]".
columns[9][data]NoQuery parameter "columns[9][data]".
columns[9][name]NoQuery parameter "columns[9][name]".
include_off_holdNoQuery parameter "include_off_hold".
include_one_offsNoQuery parameter "include_one_offs".
order[0][column]NoQuery parameter "order[0][column]".
requires_depositNoQuery parameter "requires_deposit".
columns[10][data]NoQuery parameter "columns[10][data]".
columns[10][name]NoQuery parameter "columns[10][name]".
include_recurringNoQuery parameter "include_recurring".
include_deliveriesNoQuery parameter "include_deliveries".
manual_progress_typeNoQuery parameter "manual_progress_type".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[8][orderable]NoQuery parameter "columns[8][orderable]".
columns[9][orderable]NoQuery parameter "columns[9][orderable]".
include_unlimited_jobNoQuery parameter "include_unlimited_job".
all_stage_ids_dropdownNoQuery parameter "all_stage_ids_dropdown".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[10][orderable]NoQuery parameter "columns[10][orderable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[8][searchable]NoQuery parameter "columns[8][searchable]".
columns[9][searchable]NoQuery parameter "columns[9][searchable]".
search_custom_input_idNoQuery parameter "search_custom_input_id".
columns[10][searchable]NoQuery parameter "columns[10][searchable]".
include_proposal_groupsNoQuery parameter "include_proposal_groups".
milestone_progress_typeNoQuery parameter "milestone_progress_type".
search_custom_input_termNoQuery parameter "search_custom_input_term".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".
columns[8][search][regex]NoQuery parameter "columns[8][search][regex]".
columns[8][search][value]NoQuery parameter "columns[8][search][value]".
columns[9][search][regex]NoQuery parameter "columns[9][search][regex]".
columns[9][search][value]NoQuery parameter "columns[9][search][value]".
columns[10][search][regex]NoQuery parameter "columns[10][search][regex]".
columns[10][search][value]NoQuery parameter "columns[10][search][value]".

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description usefully discloses that the shape was inferred from observed app traffic and should be confirmed, and it lists return JSON keys (draw, recordsTotal, data, meta, table_id, settings) since no output schema exists. It does not explain pagination behavior or response size limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is dominated by a verbatim dump of every DataTables query parameter, which duplicates the schema wholesale. Front-loading is poor: the useful caveat and return keys are buried after dozens of redundant param names, and much of the text earns no place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 106-parameter tool with no output schema, the description is thin where it matters: no explanation of how to construct a meaningful query, no defaults, no paging guidance, and no note on which of the massive param set actually affect results. The return-key list helps but the operational guidance is inadequate for this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the baseline is 3, but the coverage is largely tautological ("Query parameter X") and the description merely repeats the 100+ param names without explaining any semantics — e.g., date formats, what manual_progress_type or include_recurring actually filter on, or the response_format option. It adds essentially no meaning over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Search jobs progress billing") plus the mechanism (server-side DataTables query) and the underlying endpoint. However, it never explains what 'progress billing' data contains or how it differs from the many sibling search/report tools, so an agent must infer differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus the ~20 sibling search/report tools (search_jobs, search_jobs_report, get_job_profit_margin_report, etc.). Aside from a generic "confirm results" caveat, nothing tells the agent conditions for selection or exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_jobs_reportSearch jobs report (server-side table query: paging, sorting, filters)B
Read-onlyIdempotent

Search jobs report (server-side table query: paging, sorting, filters). (POST /jobs/jobs_report_datatable) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds real context: it clarifies the read is issued as POST with filters in the body, warns that the shape was inferred from app traffic, and enumerates return keys. The 'confirm results' reliability caveat is a valuable disclosure beyond the annotations, though it stops short of error/pagination behavior.

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?

Purpose and endpoint are front-loaded well, but the exhaustive columns[N][...] key dump is repetitive bulk that could be summarized as 'per-column objects with data/name/searchable/orderable/search[value]/search[regex].' The verbosity dilutes the otherwise useful content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by listing the return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) and the POST-with-body read pattern. For a read-only query tool this is nearly complete, only missing a note on paging defaults or error handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/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. The description does add value by enumerating the expected DataTables body keys (draw, columns[n][data|name|searchable|orderable|search][value|regex]), which helps construct the free-form body — but the list is truncated mid-structure (stops at columns[6][searchable]) and doesn't explain value semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (search jobs report) and adds scope (server-side table query with paging, sorting, filters), so the agent knows it's a DataTables-style query. It does not differentiate from look-alike siblings such as singleops_read_search_jobs or singleops_read_get_archived_jobs_report, leaving ambiguity about which report to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance or reference to alternatives, despite many sibling report/search tools. The only usage-adjacent signal is the caveat 'Inferred from traffic; confirm results,' which tells the agent to verify output but not when this tool beats singleops_read_search_jobs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_jobs_visits_reportSearch jobs visits report (server-side table query: paging, sorting, filters)A
Read-onlyIdempotent

Search jobs visits report (server-side table query: paging, sorting, filters). (POST /jobs/visits_report_datatable) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavior: a read is issued as POST with filters in the body, results are proxy-observed traffic-derived and should be confirmed, and the returned JSON key set (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) is disclosed. The main omission is error/auth behavior and pagination limits.

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?

Purpose and endpoint are front-loaded, which is good, but the bulk of the text is a long comma-separated key dump that is only partially complete and hard to scan. It earns its place functionally, yet a structured or summarized form would communicate the same contract far more efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully lists return keys, and it explains the POST-with-body quirk of a read query. The truncated columns list and absence of paging-size limits or error semantics are the remaining gaps, but the essentials for invoking it are present.

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%, but the body schema is a free-form object that only says 'Match the fields listed in the description' — so the enumerated DataTables keys (draw, columns[n][data|name|searchable|orderable|search][value|regex]) are the actual contract and add real meaning. The enumeration is cut off mid-way at columns[6], leaving later columns unspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Search jobs visits report') and disambiguates it as a server-side table query with paging, sorting, and filters, plus the underlying endpoint. It doesn't explicitly contrast itself with the very similar siblings singleops_read_search_jobs_report or singleops_read_search_visits_approved, so an agent still has to guess which report variant to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never states when to use this tool versus the many overlapping report/search siblings. The only guidance-adjacent sentence, 'Inferred from the SingleOps web app's own traffic; confirm results,' is a reliability caveat rather than a usage rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_labor_resourcesSearch labor resources (server-side table query: paging, sorting, filters)B
Read-onlyIdempotent

Search labor resources (server-side table query: paging, sorting, filters). (GET /labor_resources/data_table) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
order[0][column]NoQuery parameter "order[0][column]".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely new behavioral context: the endpoint was reverse-engineered from observed traffic and results should be verified, and it enumerates the response keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings) in the absence of an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and endpoint are correctly front-loaded, but the bulk of the text is a verbatim dump of forty column/order/search parameter names that already exist in the input schema and carry zero semantic information. This is significant noise that dilutes an otherwise compact definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 41-parameter tool with no output schema, the description does the right thing by listing return keys and flagging the reverse-engineered provenance. However, it leaves the bulk of the DataTables parameter contract (draw echoing, column index mapping, regex vs. plain search) unexplained, which is the main thing an agent needs to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is nominally 100%, but every schema description is a tautological placeholder ("Query parameter \"draw\"."), so the baseline of 3 applies only because the formal coverage metric is satisfied. The description adds the framing that the parameters implement paging, sorting and filtering, but it explains no individual parameter — not draw, start/length, order[0][dir], or the search[regex] semantics — so an agent still has to infer DataTables conventions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("Search labor resources") plus the query paradigm (server-side table query with paging, sorting, filters) and the underlying endpoint. That is enough to distinguish it from the many labor *report* siblings, though it never explicitly says how it differs from tools like singleops_read_get_client_labor_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance and no named alternative among the ~70 sibling tools. The only advisory sentence, "Inferred from the SingleOps web app's own traffic; confirm results," is a reliability caveat, not selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_tasksSearch tasks (server-side table query: paging, sorting, filters)A
Read-onlyIdempotent

Search tasks (server-side table query: paging, sorting, filters). (POST /tasks/data_table/all) Inferred from the SingleOps web app's own traffic; confirm results. Body keys seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable]. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings. Read-only query sent as POST (filters go in body).

NameRequiredDescriptionDefault
bodyNoRequest body as a JSON object. Match the fields listed in the description.
extra_queryNoAny additional query parameters.
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint false), so the bar is lower, but the description still adds real value: it explains the unusual read-as-POST pattern ('filters go in body'), warns that the shape was inferred from observed web traffic and must be confirmed, and lists the response keys. It stops short of describing pagination limits, rate behavior, or default result sizes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The useful content is front-loaded, but roughly two-thirds of the text is a mechanical, repetitive enumeration of columns[0] through columns[6] sub-keys that could have been summarized in one sentence. The list is also truncated mid-pattern ('columns[6][searchable]'), which wastes space without being complete.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description does supply the return keys (draw, recordsTotal, recordsFiltered, data, meta, table_id, settings), which is adequate. However, a tool whose headline promise is 'paging' lists no offset/limit keys and gives no guidance on how to actually page, and it offers no field semantics for the task columns an agent would filter on.

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 nominally 100%, but the schema's 'body' property is an empty object that explicitly defers to the description ('Match the fields listed in the description'), so the key dump is the only real parameter documentation available. It enumerates the DataTables-style keys but does not explain their meaning (that draw is an echo counter, that search[value] is the actual filter, that ordering is per-column), and it omits start/length paging keys entirely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (search tasks) plus the mechanism (server-side table query with paging, sorting, filters) and the concrete endpoint POST /tasks/data_table/all. It is clear what the tool does, but it never distinguishes itself from the many sibling task readers such as singleops_read_list_tasks_calendar, singleops_read_list_tasks_route_planner, or singleops_read_list_client_tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'server-side table query: paging, sorting, filters' suggests reaching for this when you need a filtered/paged task table rather than a fixed report. There is no explicit when-to-use, when-not-to-use, or pointer to an alternative sibling, and the 'confirm results' caveat gives no routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_search_visits_approvedSearch visits approved (server-side table query: paging, sorting, filters)C
Read-onlyIdempotent

Search visits approved (server-side table query: paging, sorting, filters). (GET /visits/approved/data_table) Inferred from the SingleOps web app's own traffic; confirm results. Query params seen: draw, columns[0][data], columns[0][name], columns[0][searchable], columns[0][orderable], columns[0][search][value], columns[0][search][regex], columns[1][data], columns[1][name], columns[1][searchable], columns[1][orderable], columns[1][search][value], columns[1][search][regex], columns[2][data], columns[2][name], columns[2][searchable], columns[2][orderable], columns[2][search][value], columns[2][search][regex], columns[3][data], columns[3][name], columns[3][searchable], columns[3][orderable], columns[3][search][value], columns[3][search][regex], columns[4][data], columns[4][name], columns[4][searchable], columns[4][orderable], columns[4][search][value], columns[4][search][regex], columns[5][data], columns[5][name], columns[5][searchable], columns[5][orderable], columns[5][search][value], columns[5][search][regex], columns[6][data], columns[6][name], columns[6][searchable], columns[6][orderable], columns[6][search][value], columns[6][search][regex], columns[7][data], columns[7][name], columns[7][searchable], columns[7][orderable], columns[7][search][value], columns[7][search][regex], order[0][column], order[0][dir], start, length, search[value], search[regex], table_filter_start, table_filter_end, report_range_cache, colReorder[], settings_initialized. Returns JSON with keys: draw, recordsTotal, recordsFiltered, data, meta, table_id, settings.

NameRequiredDescriptionDefault
drawNoQuery parameter "draw".
startNoQuery parameter "start".
lengthNoQuery parameter "length".
extra_queryNoAny additional query parameters.
colReorder[]NoQuery parameter "colReorder[]".
order[0][dir]NoQuery parameter "order[0][dir]".
search[regex]NoQuery parameter "search[regex]".
search[value]NoQuery parameter "search[value]".
response_formatNoOutput format: "markdown" (default, readable tables) or "json" (full raw response).
columns[0][data]NoQuery parameter "columns[0][data]".
columns[0][name]NoQuery parameter "columns[0][name]".
columns[1][data]NoQuery parameter "columns[1][data]".
columns[1][name]NoQuery parameter "columns[1][name]".
columns[2][data]NoQuery parameter "columns[2][data]".
columns[2][name]NoQuery parameter "columns[2][name]".
columns[3][data]NoQuery parameter "columns[3][data]".
columns[3][name]NoQuery parameter "columns[3][name]".
columns[4][data]NoQuery parameter "columns[4][data]".
columns[4][name]NoQuery parameter "columns[4][name]".
columns[5][data]NoQuery parameter "columns[5][data]".
columns[5][name]NoQuery parameter "columns[5][name]".
columns[6][data]NoQuery parameter "columns[6][data]".
columns[6][name]NoQuery parameter "columns[6][name]".
columns[7][data]NoQuery parameter "columns[7][data]".
columns[7][name]NoQuery parameter "columns[7][name]".
order[0][column]NoQuery parameter "order[0][column]".
table_filter_endNoQuery parameter "table_filter_end".
report_range_cacheNoQuery parameter "report_range_cache".
table_filter_startNoQuery parameter "table_filter_start".
settings_initializedNoQuery parameter "settings_initialized".
columns[0][orderable]NoQuery parameter "columns[0][orderable]".
columns[1][orderable]NoQuery parameter "columns[1][orderable]".
columns[2][orderable]NoQuery parameter "columns[2][orderable]".
columns[3][orderable]NoQuery parameter "columns[3][orderable]".
columns[4][orderable]NoQuery parameter "columns[4][orderable]".
columns[5][orderable]NoQuery parameter "columns[5][orderable]".
columns[6][orderable]NoQuery parameter "columns[6][orderable]".
columns[7][orderable]NoQuery parameter "columns[7][orderable]".
columns[0][searchable]NoQuery parameter "columns[0][searchable]".
columns[1][searchable]NoQuery parameter "columns[1][searchable]".
columns[2][searchable]NoQuery parameter "columns[2][searchable]".
columns[3][searchable]NoQuery parameter "columns[3][searchable]".
columns[4][searchable]NoQuery parameter "columns[4][searchable]".
columns[5][searchable]NoQuery parameter "columns[5][searchable]".
columns[6][searchable]NoQuery parameter "columns[6][searchable]".
columns[7][searchable]NoQuery parameter "columns[7][searchable]".
columns[0][search][regex]NoQuery parameter "columns[0][search][regex]".
columns[0][search][value]NoQuery parameter "columns[0][search][value]".
columns[1][search][regex]NoQuery parameter "columns[1][search][regex]".
columns[1][search][value]NoQuery parameter "columns[1][search][value]".
columns[2][search][regex]NoQuery parameter "columns[2][search][regex]".
columns[2][search][value]NoQuery parameter "columns[2][search][value]".
columns[3][search][regex]NoQuery parameter "columns[3][search][regex]".
columns[3][search][value]NoQuery parameter "columns[3][search][value]".
columns[4][search][regex]NoQuery parameter "columns[4][search][regex]".
columns[4][search][value]NoQuery parameter "columns[4][search][value]".
columns[5][search][regex]NoQuery parameter "columns[5][search][regex]".
columns[5][search][value]NoQuery parameter "columns[5][search][value]".
columns[6][search][regex]NoQuery parameter "columns[6][search][regex]".
columns[6][search][value]NoQuery parameter "columns[6][search][value]".
columns[7][search][regex]NoQuery parameter "columns[7][search][regex]".
columns[7][search][value]NoQuery parameter "columns[7][search][value]".

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior, so the safety profile is covered. The description adds a meaningful caveat that the route was inferred from observed traffic and results should be confirmed, and lists the return keys; it does not explain pagination semantics or query behavior. This is useful added context but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

After a reasonable first sentence, the description dumps dozens of parameter names verbatim into a long run-on sentence. This is not front-loaded and does not earn its space, since the same names appear in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 62-parameter paginated table endpoint with no output schema, the description does not explain how to use the DataTables-style controls meaningfully, what formats or defaults apply, or which filters actually matter. Listing parameter names and return keys is not enough to call this completely documented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is nominally 100%, so the baseline is 3, but the schema descriptions are tautologies ('Query parameter draw'), and the description merely re-enumerates the same parameter names without explaining DataTables semantics such as draw, start/length, or search[value]. It adds no real meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource (search approved visits) and characterizes the operation as a server-side table query with paging, sorting, and filters, plus the endpoint GET /visits/approved/data_table. It does not distinguish this from near siblings such as singleops_read_list_client_visits or singleops_read_search_jobs_visits_report, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives, and no prerequisites or exclusions. The only hint is the caveat that the endpoint was inferred from web traffic and results should be confirmed, which is a reliability warning, not usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

singleops_read_whoamiSingleOps connection statusA
Read-onlyIdempotent

Connection status: session presence/expiry and auth scheme (no secret values), gates, write budget, and a live probe of one GET route.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description adds meaningful context beyond that: it reports session expiry, auth scheme without secret values, gates, write budget, and performs a live probe against one GET route. It does not state whether the probe can fail or consume anything, but the added behavioral detail is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence with the key concept front-loaded: connection status, then the specific components. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must convey what the tool returns, and it does so by listing the status fields. It is adequate for an agent to understand the tool's payload, though it does not describe response format or failure modes in detail.

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?

The tool has zero parameters, so the baseline is 4. The description correctly does not invent parameter semantics and the empty schema is consistent with a no-argument status endpoint.

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 description states a specific diagnostic resource—connection status—and enumerates what is reported: session presence/expiry, auth scheme without secrets, gates, write budget, and a live GET probe. This clearly distinguishes it from the many data-query siblings, which list or search domain objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The diagnostic nature is strongly implied by 'Connection status' and 'live probe', but the description never explicitly says when to use this tool versus alternatives or when not to use it. An agent can infer it is a health/status check, but no routing guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 87 tool updatesv1.0.0
    • First observedsingleops_call_route
    • First observedsingleops_discover_tools
    • First observedsingleops_read_contract_test
    • First observedsingleops_read_get_archived_jobs_report
    • First observedsingleops_read_get_batch_renew_jobs_report
    • First observedsingleops_read_get_client_labor_report
    • First observedsingleops_read_get_custom_inputs_report
    • First observedsingleops_read_get_customer_history_report
    • First observedsingleops_read_get_customer_type_report
    • First observedsingleops_read_get_dashboard
    • First observedsingleops_read_get_equipment_utilization_report
    • First observedsingleops_read_get_global_planner_report
    • First observedsingleops_read_get_inventory_transactions_report
    • First observedsingleops_read_get_item_groups_report
    • First observedsingleops_read_get_items_report
    • First observedsingleops_read_get_job_expenses_report
    • First observedsingleops_read_get_job_labor_report
    • First observedsingleops_read_get_job_profit_margin_report
    • First observedsingleops_read_get_master_line_item_report
    • First observedsingleops_read_get_net_sales_report
    • First observedsingleops_read_get_operation_performance_report
    • First observedsingleops_read_get_payment_records_report
    • First observedsingleops_read_get_payment_totals_report
    • First observedsingleops_read_get_purchase_orders_report
    • First observedsingleops_read_get_qbo_status
    • First observedsingleops_read_get_sales_rep_report
    • First observedsingleops_read_get_task
    • First observedsingleops_read_get_timesheet_summary_report
    • First observedsingleops_read_get_timesheet_totals_report
    • First observedsingleops_read_get_tree_inventory_report
    • First observedsingleops_read_get_visit
    • First observedsingleops_read_get_visit_profit_margin_report
    • First observedsingleops_read_lead_list_clients_search_by_field
    • First observedsingleops_read_lead_list_custom_inputs
    • First observedsingleops_read_lead_list_operations
    • First observedsingleops_read_list_account_settings_options_quickbooks
    • First observedsingleops_read_list_accounts_info
    • First observedsingleops_read_list_client_emails
    • First observedsingleops_read_list_client_invoices
    • First observedsingleops_read_list_client_jobs
    • First observedsingleops_read_list_client_location_stats
    • First observedsingleops_read_list_client_locations
    • First observedsingleops_read_list_client_stat_hours
    • First observedsingleops_read_list_client_stat_revenue
    • First observedsingleops_read_list_client_tasks
    • First observedsingleops_read_list_client_text_messages
    • First observedsingleops_read_list_client_visits
    • First observedsingleops_read_list_email_spam_addresses_check_batch_emails
    • First observedsingleops_read_list_emails_report
    • First observedsingleops_read_list_invoices_invoice_totals
    • First observedsingleops_read_list_item_groups
    • First observedsingleops_read_list_items
    • First observedsingleops_read_list_operations
    • First observedsingleops_read_list_portal_accounts_feature_flags
    • First observedsingleops_read_list_public_accounts_feature_flags
    • First observedsingleops_read_list_public_brand_details
    • First observedsingleops_read_list_public_client_public_invoices
    • First observedsingleops_read_list_purchase_orders
    • First observedsingleops_read_list_tags
    • First observedsingleops_read_list_tasks_calendar
    • First observedsingleops_read_list_tasks_route_planner
    • First observedsingleops_read_list_text_messages_report
    • First observedsingleops_read_list_timesheet_events_list
    • First observedsingleops_read_list_timesheets_list
    • First observedsingleops_read_list_users_crews
    • First observedsingleops_read_list_users_current
    • First observedsingleops_read_list_vendors
    • First observedsingleops_read_list_visits_awaiting_scheduling_stats
    • First observedsingleops_read_list_visits_index_fullcalendar_events
    • First observedsingleops_read_list_visits_index_fullcalendar_holiday_events
    • First observedsingleops_read_list_visits_index_route_planner_events
    • First observedsingleops_read_list_visits_route_planner_data
    • First observedsingleops_read_list_visits_user_routes
    • First observedsingleops_read_list_widgets
    • First observedsingleops_read_search_clients
    • First observedsingleops_read_search_invoices
    • First observedsingleops_read_search_invoices_2
    • First observedsingleops_read_search_invoices_archived_invoices
    • First observedsingleops_read_search_jobs
    • First observedsingleops_read_search_jobs_invoices
    • First observedsingleops_read_search_jobs_progress_billing
    • First observedsingleops_read_search_jobs_report
    • First observedsingleops_read_search_jobs_visits_report
    • First observedsingleops_read_search_labor_resources
    • First observedsingleops_read_search_tasks
    • First observedsingleops_read_search_visits_approved
    • First observedsingleops_read_whoami

TDQS

C2.6/5.0

Scored across 87 tools

Disambiguation2/5

Many tools overlap heavily: search_invoices, search_invoices_2, and search_invoices_archived_invoices target near-identical invoice table queries, and list_operations vs read_lead_list_operations both hit /api/v1/operations. There are also multiple parallel fullcalendar/timesheet list tools whose boundaries are unclear, plus a generic call_route that can reach anything, making tool selection ambiguous.

Naming Consistency3/5

The singleops_read_<verb>_<resource> pattern is broadly applied, but verbs mix list_/get_/search_ for essentially the same operation and some names are awkward duplicates (list_timesheet_events_list, list_timesheets_list, search_invoices_2). It is readable but not reliably predictable.

Tool Count1/5

87 tools is far beyond a well-scoped surface; many are mechanical one-per-endpoint dumps of the web app's internal traffic. This volume invites selection errors and could be collapsed via call_route or grouping.

Completeness2/5

The surface is almost entirely read-only listing/reporting; there are no create/update/delete tools for clients, jobs, visits, invoices, or tasks, so an agent cannot perform lifecycle operations without the generic call_route escape hatch. Read coverage is broad, but the actionable surface is thin.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Exposes standard MCP tools for secure calculation, knowledge-base retrieval, document statistics, and sensitive operations like email, export, and deletion with human-in-the-loop approval.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables turning selected OpenAPI operations into authenticated MCP tools with branded OAuth, operation allowlisting, and live schema refreshes.
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to inspect operational status and channels, lint human-reviewed plans, search and query ledger data, and run queue-based writes with dry-run defaults and safeguards against unverified or unapproved campaigns.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables MCP clients to manage Google Ads accounts through guarded tools for GAQL reporting, keywords, ads, budgets, callouts, and sitelinks, with dry runs and paused-by-default creates.
    Apache 2.0