SetLuca
OfficialThis server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
SetLuca MCP server
SetLuca runs DM sales for coaches, creators, and experts. This MCP server connects SetLuca to an AI assistant, so you can ask it about your workspace and get help with the work waiting there.
You can ask it what needs attention, pull up a lead's conversation before a call, draft a reply that sounds like you, or explain how a campaign is doing. It can also help plan your next campaign or follow up on calls that still need an outcome.
Your assistant must get your approval before it takes an action that reaches a lead, such as sending a message or launching a broadcast. A reply your assistant drafts waits in your SetLuca review queue until you approve it.
Get connected
SetLuca works with assistants such as Claude, ChatGPT, and Cursor. Some connect when you sign in with SetLuca. Others use an API key you create in SetLuca. The connection guide walks through both and helps you pick the one your assistant supports.
Once connected, try asking:
"What needs my attention this morning?"
"Show me the review queue and recommend what to approve."
"Pull up everything about this lead before my call."
"Draft a short, warm reply for this lead."
"How is my broadcast performing?"
If a connection stops working, check the steps in the connection guide. You can manage or revoke connected assistants in SetLuca → Settings → Connected agents, and revoke an API key in SetLuca → Settings → Developer API keys.
Related MCP server: LeadMind MCP
Your data and your choices
The assistant only sees what the SetLuca access you give it allows. This server keeps no copy of your workspace data. It passes your requests to SetLuca and returns the results to your assistant. Review the privacy policy of any assistant you connect before sharing a live workspace with it.
Read SetLuca's privacy policy for details about how SetLuca handles your data. For support, email support@setluca.com.
For people building with SetLuca
Start with the documentation index. It points to setup, tool examples, the privacy and security guides, development instructions, tests, and release steps. AGENTS.md gives coding agents a short checklist. The changelog lists changes by version, including changes to tool names that may affect saved prompts.
You can browse the SetLuca API docs if you want to build a direct integration.
This server is licensed under the Apache License 2.0.
Available Tools
223 toolsluca_analytics_benchmark_consentCheck benchmark sharing consentARead-onlyIdempotentInspect
The coach's cross-coach benchmark opt-in state (whether this workspace contributes to and sees anonymized niche cohort percentiles). Read-only; the opt-in is changed from the app, not through this key surface.
Luca operation: GET /api/analytics/benchmark-consent Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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, yet the description still adds real behavioral context: required scopes (analytics:read, luca:read), data sensitivity (redacted), and the fact that idempotency is not required. That is meaningful disclosure beyond the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and sentences are short. The trailing block of operation/scopes/idempotency lines reads as generated boilerplate but each line carries distinct information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with a full output schema and complete safety annotations, the description supplies the remaining pieces an agent needs: auth scope, sensitivity, and workspace override behavior. Only the lack of explicit sibling routing keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds one useful nuance (workspaceId/workspaceSlug override the environment-configured default workspace), which is slightly more than the schema's bare 'Optional Luca workspace id override' but not substantial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (read the coach's cross-coach benchmark opt-in state) and clarifies the semantics of that state with a parenthetical definition. It implicitly separates itself from luca_analytics_benchmarks by scoping itself to consent rather than benchmark data, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear exclusion: the opt-in 'is changed from the app, not through this key surface,' telling the agent not to attempt a mutation here. It lacks a positive 'use when' statement or a named alternative tool, so the routing guidance is one-directional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_benchmarksRead peer benchmarksARead-onlyIdempotentInspect
This coach's own cross-coach benchmark percentiles (e.g. 'top 15% for response speed among fitness coaches'), never another coach's data. comingSoon: true with an empty metrics list is the honest, expected state until the cross-coach benchmark pipeline populates this coach's row — never a fabricated comparison.
Luca operation: GET /api/analytics/benchmarks Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint=false), and the description adds real context beyond them: required scopes (analytics:read, luca:read), 'data sensitivity: redacted', the fact that no idempotency key is required, and the expected pre-population state of the benchmark pipeline. That last point in particular prevents an agent from misreporting an empty result as an error or fabricating a comparison.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening prose sentence is front-loaded with the core distinction and the comingSoon semantics before the metadata block, which is compact and scannable. Minor slack exists in the near-duplicate scope lines ('Required scopes: analytics:read' vs 'Required OAuth scope: luca:read') and the idempotency line, which largely restates idempotentHint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is correctly omitted, and the description supplies the pieces the schema cannot: required scopes, sensitivity level, workspace-override behavior, and the expected empty/comingSoon state. Complete enough to invoke correctly, though it stops short of naming adjacent tools an agent might confuse it with.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description genuinely adds meaning the terse schema does not: it tells the agent these two parameters override 'the default workspace configured by environment', which explains why passing neither is valid. It does not explain precedence between workspaceId and workspaceSlug if both are supplied, which keeps it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('cross-coach benchmark percentiles') and pins the scope hard with 'this coach's own... never another coach's data', reinforced by a concrete example ('top 15% for response speed among fitness coaches'). It is only slightly weaker than a 5 because it never names a sibling (e.g. luca_analytics_benchmark_consent) to route the agent away from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this is the tool for peer percentile comparisons, and the note that 'comingSoon: true with an empty metrics list is the honest, expected state' is useful invocation guidance. There is no explicit when-to-use/when-not, and no differentiation from sibling analytics tools such as luca_analytics_benchmark_consent or luca_analytics_funnel.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_call_intelligenceRead call intelligenceBRead-onlyIdempotentInspect
Post-call intelligence for a period: show rate, close rate, average rating and rating distribution, call-to-close lag, repeat-call cohort, day-of-week and call-sequence show rates, and surprise patterns, derived from post-call events and coach-recorded outcomes.
Luca operation: GET /api/analytics/call-intelligence Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior. The description adds useful operational context: the underlying GET endpoint, required OAuth scopes, and redacted data sensitivity. It does not describe return values, but an 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the metric surface and then adds endpoint, scope, and workspace override details. The long metric list is dense but justified for an analytics tool, and no sentence is obviously wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytics endpoint with annotations and an output schema, the description covers the metric surface and auth requirements well. However, it leaves query-parameter interaction and sibling selection implicit, so an agent still needs to infer some invocation details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the query object is nested, yet the description only mentions 'for a period' and workspace overrides. It does not explain how start and end interact with period, nor what the channel filter does, leaving the schema to carry most parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific analytics resource (post-call intelligence) and enumerates the metrics it returns, so the agent can tell what data it produces. It does not explicitly distinguish itself from the closely named luca_analytics_call_intelligence_calls sibling, leaving some ambiguity about aggregate vs per-call views.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the metric list and period/channel context, but it never states when to choose this tool over nearby analytics siblings such as luca_analytics_funnel, luca_analytics_revenue, or luca_analytics_call_intelligence_calls. Usage is inferred rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_call_intelligence_callsList calls behind call intelligenceARead-onlyIdempotentInspect
Most recent completed calls with a generated summary, newest first: the coach-facing summary, attendance outcome, rating, and lead name.
Luca operation: GET /api/analytics/call-intelligence/calls Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered; the description goes further by disclosing required scopes (analytics:read, luca:read), data sensitivity (full_content), the completed-with-summary filter, and newest-first ordering. This is useful behavioral context beyond the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and scope in the first sentence, followed by compact metadata lines. Efficient overall, though the boilerplate operation/idempotency lines are somewhat mechanical rather than decision-relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description covers scopes, sensitivity, ordering, and workspace override. The only real gap is the undocumented limit semantics, otherwise it is complete enough for a read-only listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with workspaceId/workspaceSlug already documented in the schema, and the description usefully explains the override intent ('override the default workspace configured by environment'). However the limit parameter (1–50, no default stated) is left undescribed in both schema and text, so it does not fully compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (calls behind call intelligence) and further narrows scope to 'most recent completed calls with a generated summary, newest first,' even naming the returned fields. That is clear enough for an agent to know what it retrieves, though it never contrasts itself with the related luca_analytics_call_intelligence or the call_events_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (to surface recent, summarized, completed calls) and gives workspace-override guidance, but offers no explicit when-not or alternatives despite a very crowded sibling set of call/analytics tools. Usage is inferable but not routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_content_attributionRead which content brings leadsARead-onlyIdempotentInspect
Per-content rollup (leads touched, qualified, booked, revenue) of attributed touches for a period. Content is attributed automatically from an Instagram comment or Story reply that carries a real media id, or tagged manually; an honest empty list means no content is attributed yet, not zero performance.
Luca operation: GET /api/analytics/content-attribution Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 genuine value beyond that: how attribution is derived (Instagram comment or Story reply with a real media id, or manual tagging), the empty-list semantics, data sensitivity (redacted), and required scopes. These are behavioral facts an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, followed by attribution mechanics, then a compact metadata block (operation, scopes, idempotency, workspace). Mostly efficient, though the 'Does not require idempotency' line is slightly redundant against the idempotentHint=true annotation and mildly confusing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out. Given that, the description covers the essentials: what is computed, how attribution works, the meaning of an empty result, scopes, and workspace targeting. Only the period enum values remain unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so the baseline is 3. The description clarifies the workspaceId/workspaceSlug purpose as an override of the environment-configured default, which adds meaning. The 'period' parameter and its enum values carry no descriptive detail in either the schema or the description, leaving a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation ('Per-content rollup') with the exact metrics returned (leads touched, qualified, booked, revenue) and the scope ('attributed touches for a period'). This is far more concrete than a tautology. It does not, however, differentiate itself from the close sibling luca_analytics_content_performance, which an agent would need to disambiguate against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the read-analytics framing. The description does add a useful interpretation rule ('an honest empty list means no content is attributed yet, not zero performance') and workspace override guidance, but it never states when to choose this over alternatives like luca_analytics_content_performance or luca_analytics_topic_performance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_content_performanceRead content performanceARead-onlyIdempotentInspect
Per-post rollup (reach, engagement rate, likes/comments/saves/shares, attributed leads/bookings/revenue) for each Instagram post, reel, story, or carousel over a period. Insight fields stay null until the coach's account grants Instagram insights access — read that as not connected yet, not zero engagement.
Luca operation: GET /api/analytics/content-performance Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint, so the safety profile is covered. The description adds genuinely non-derivable behavior: insight fields stay null until the account grants Instagram insights access 'read that as not connected yet, not zero engagement' — a critical interpretation hint that prevents a false zero-engagement reading. It also discloses required scopes and data sensitivity ('redacted').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence is front-loaded and information-dense, but it crams a long metric enumeration into one run-on. The operational block contains partly wasteful lines: 'Does not require idempotency' merely restates the idempotentHint annotation, and the endpoint path adds little for an agent choosing a tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shapes need not be described, and there are zero required parameters, lowering the burden. Between the metric list, the null-insights caveat, the workspace override note and the scope declaration, an agent has enough to call it correctly; only the missing differentiation from the related attribution/topic tools leaves a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% and all three parameters are named in the schema, including the workspace override semantics the description repeats verbatim. The description says the rollup happens 'over a period' but does not add meaning to the period enum (this_week, last_month, etc.) beyond what the schema already lists, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('per-post rollup ... for each Instagram post, reel, story, or carousel over a period') and enumerates the metrics returned, which is far more than a restated name. However, it lists 'attributed leads/bookings/revenue' — material that overlaps heavily with the sibling luca_analytics_content_attribution — without any sentence distinguishing the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the metric inventory and the period parameter, but there is no explicit when-to-use statement nor any when-not guidance or named alternative among the many analytics siblings (content_attribution, topic_performance, benchmarks). The only actionable guidance ('Use workspaceId or workspaceSlug to override...') is parameter mechanics 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.
luca_analytics_crm_sync_healthCheck CRM sync healthARead-onlyIdempotentInspect
Aggregate CRM-sync health for the coach's post-call summaries: counts of synced, pending, local-only, failed, and permanently-failed pushes. All zeros is the honest, expected state for a coach with no synced summaries yet — never a fabricated status.
Luca operation: GET /api/analytics/crm-sync-health Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the safety profile is covered; the description nonetheless adds real context beyond them: required scopes (analytics:read, luca:read), 'data sensitivity: redacted', the underlying GET endpoint, and that no idempotency key is needed. The idempotency line mildly duplicates idempotentHint=true, keeping this short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the enumerated counters lead, followed by compact operational metadata lines (endpoint, scopes, sensitivity, idempotency, workspace override). Every line carries information, though the blocky metadata formatting is slightly heavier than prose would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, a full output schema, and 100% param coverage, the description only needs to add auth/behavior context, which it does (scopes, redaction, default workspace). It is essentially complete for calling the tool correctly; the main omission is routing guidance against sibling CRM-health/sync tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns above that by explaining the semantic role of both params — they override the default workspace derived from the environment, a fact absent from the schema's terse 'optional override' text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (aggregate CRM-sync health) and enumerates the exact counters returned (synced, pending, local-only, failed, permanently-failed), which lets an agent predict the payload. It scopes the tool to the coach's post-call summaries, though it never explicitly contrasts itself with near-neighbors like luca_integrations_crm_connections_health or luca_integrations_crm_sync_runs_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line about all-zeros being the expected state for coaches with no synced summaries is useful interpretive guidance, and the workspaceId/workspaceSlug override sentence establishes a default-workspace behavior. However, there is no explicit when-to-use vs. an alternative (e.g., sync_runs_list for run-level detail), so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_deep_diveRun a deep-dive analytics investigationARead-onlyIdempotentInspect
Answer a specific business question by composing all seven analytics reads in one call: pipeline funnel, revenue and ROI, response-speed impact, a point-in-time revenue forecast, call intelligence (show/close rates), ghosted-lead recovery, and coach trust/auto-send status. Use it when the coach asks a specific question that needs several of these numbers side by side, rather than the fixed weekly report. Example: call with {question: "why did close rate drop this month?", period: "this_month"}.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Period for the period-scoped reads (funnel, revenue, speedImpact, callIntelligence, ghostedLeads, trustScore). Forecast ignores this — it is always point-in-time. Defaults to this_month. | |
| question | No | Optional. The coach's question behind this investigation, e.g. 'why did close rate drop this month?'. Not sent to any API; it only records what the coach asked. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's added value is telling the agent this is a composite that fans out to seven reads in one call — i.e. a heavier, broad-result operation. It does not mention latency, cost, or whether any read can be skipped, which would complete the picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the usage rule, then an example — a sensible order with no filler. The seven-item enumeration makes the first sentence dense, but each item earns its place by telling the agent what data comes back.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return values are covered by the existing output schema and the safety profile by annotations, so the description only needed to state purpose, scope of aggregation, and when to pick it — all present. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains that period scopes six reads while forecast is point-in-time, and that question is metadata only. The description's example call ({question, period}) adds a little practical framing but no semantics beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and job ('Answer a specific business question by composing all seven analytics reads in one call') and then enumerates exactly which seven reads are aggregated. This makes it immediately distinguishable from the individual analytics siblings like luca_analytics_funnel or luca_analytics_revenue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear selection rule — use it when the coach asks a specific question needing several numbers side by side, 'rather than the fixed weekly report' — and provides a concrete call example. The gap is that it never names the single-metric siblings (luca_analytics_rollup, the individual analytics reads) as the alternative for simple one-number questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_forecastRead the revenue forecastARead-onlyIdempotentInspect
Point-in-time pipeline revenue forecast with on-track, optimistic, and conservative scenarios based on pipeline stage probabilities and historical conversion rates.
Luca operation: GET /api/analytics/forecast Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior. The description adds useful operational detail beyond them: required analytics and OAuth scopes, redacted data sensitivity, and the fact that no idempotency key is required. It does not mention rate limits or freshness, so it is not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core forecast concept, followed by concise operational metadata. Every line is useful and there is no redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and rich annotations, the description sufficiently covers what the tool returns, required scopes, sensitivity, and workspace override behavior. An agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both optional workspace parameters. The description adds meaning by explaining that workspaceId or workspaceSlug override the environment default workspace, which goes beyond the per-parameter schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific resource and output: a point-in-time pipeline revenue forecast with on-track, optimistic, and conservative scenarios. It does not explicitly differentiate this tool from sibling analytics tools like luca_analytics_revenue, so it falls short of the sibling-differentiation bar for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides invocation prerequisites such as required scopes and how to override the default workspace, which implies usage context. However, it does not explicitly state when to choose this forecast tool versus alternatives such as luca_analytics_revenue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_funnelRead the funnelARead-onlyIdempotentInspect
Pipeline funnel stage counts with period and channel filters. Returns counts and conversion rates for each funnel stage plus period-over-period deltas.
Luca operation: GET /api/analytics/funnel Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/destructive profile, and the description supplements it with genuinely useful context: required scopes (analytics:read, luca:read), data sensitivity (redacted), the underlying GET operation, and default-workspace override behavior. 'Does not require idempotency' is slightly redundant against idempotentHint=true but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return shape are front-loaded in the first sentence, followed by a compact metadata block. It is well organized with no wasted prose, though the trailing metadata lines are status boilerplate rather than decision-relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed in prose, and the annotations carry the safety profile. The description still names the return payload and documents auth/scoping, leaving little an agent needs to call it correctly missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% – the two workspace parameters carry descriptions while the nested period/channel properties show only enums with no prose. The description names 'period and channel filters', bridging part of that gap, but adds no format or default meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence states a specific resource (pipeline funnel stage counts) plus the filters and returns (counts, conversion rates, period-over-period deltas). Clear and actionable, but it does not explicitly differentiate from sibling analytics tools such as luca_analytics_rollup or luca_analytics_deep_dive that could plausibly overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 analytics tools. The only usage-adjacent line is the workspace override note, which concerns parameters, not tool selection. An agent is left to infer fit 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.
luca_analytics_ghosted_leadsAnalyze leads who stopped replyingARead-onlyIdempotentInspect
Summarize leads who stopped replying during a period, including their count, follow-up recovery rate, estimated lost revenue, and common reasons conversations stalled. This is an aggregate report, not a list of individual leads.
Luca operation: GET /api/analytics/ghosted-leads Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior. The description goes further by disclosing required scopes (analytics:read, luca:read), data sensitivity (full_content), and the absence of an idempotency-key requirement, which an agent needs before calling. It does not describe pagination or rate limits, but for an aggregate read that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the substance (what is measured, and that it is an aggregate) before the routing sentence and the operational metadata block. The operation/scope/idempotency lines are somewhat boilerplate but each carries actionable info; nothing is redundant with the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description instead covers scope, sensitivity, workspace resolution, and report shape. Remaining gaps are the optionality/defaults of period and channel, which the schema does not fill in either.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the nested query object's period/channel enum properties carry no descriptions. The description mentions period filtering only in passing ('during a period') and never explains channel, so it does not compensate for the gap. It does add real meaning for the workspace override ('override the default workspace configured by environment'), which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Summarize leads who stopped replying') and enumerates the exact outputs: count, follow-up recovery rate, estimated lost revenue, and stall reasons. The explicit contrast 'This is an aggregate report, not a list of individual leads' separates it from luca_leads_list and other list-shaped siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('during a period') and an explicit negative: it is an aggregate report, not a per-lead list, which steers agents away from list tools. It does not name a concrete alternative or state when to prefer this over neighboring analytics tools such as luca_analytics_loss_reasons or the action-oriented luca_rescue_silent_leads, so guidance stops short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_insightsList insightsARead-onlyIdempotentInspect
The coach's proactive-insights feed (metric drops/spikes, opportunities, risks, milestones) surfaced by the daily insight-detection cron, newest first. Optionally filter to one status via the status query param (e.g. unread). An empty items list is the honest, expected state for a coach nothing has been flagged for yet — never a fabricated alert.
Luca operation: GET /api/insights Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds real behavioral context: the empty-list-is-expected semantics to prevent fabricated alerts, the data source/refresh cadence, required scopes, and 'data sensitivity: redacted'. It does not describe pagination/truncation behavior, which is a minor gap given the maxPages parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The prose portion is front-loaded and efficient, leading with what the feed is and following with the filter and empty-state caveat. The template metadata lines (operation, scopes, idempotency note) add bulk but each carries operational information; the 'Does not require idempotency' line sits awkwardly next to idempotentHint=true.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema, the description covers what the agent most needs: scope requirements, workspace override, ordering, and the honest-empty-state warning. It is essentially complete, with pagination behavior left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so several params (maxPages, workspaceId, workspaceSlug) are documented in-schema while nested query fields (limit, cursor, status) are not. The description explains the status filter's meaning and the workspace override, adding some value, but says nothing about limit/cursor pagination semantics, so the baseline 3 is right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource (the coach's proactive-insights feed) and lists its content categories (metric drops/spikes, opportunities, risks, milestones) plus its source and ordering (daily cron, newest first). It clearly distinguishes itself from the mutation siblings (mark_read, dismiss, mark_actioned), though it never explicitly names the closest read sibling, luca_insights_unread_count.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the optional status filter with an example ('unread') and how to override the default workspace, which is useful invocation context. However, it gives no explicit when-to-use/when-not guidance relative to alternatives such as luca_insights_unread_count or the triage/recommendations tools, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_lead_scoreRead a lead's scoreARead-onlyIdempotentInspect
Predictive booking-likelihood score (0-100) for one lead from the coach's trained bucket-rate model, with a confidence tier and the top contributing features. Honest about insufficient data: an under-trained model returns a null score and low confidence instead of a fabricated number.
Luca operation: GET /api/analytics/lead-score/{leadId} Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/openWorld=false, but the description adds material behavioral context beyond them: the model admits insufficient data by returning a null score and low confidence rather than fabricating a value, notes data sensitivity 'redacted', and lists required scopes. This exceeds what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core value proposition is front-loaded in the first sentence, and the operational block (endpoint, scopes, idempotency, workspace override) is compact. The 'Does not require idempotency' line is somewhat redundant with idempotentHint=true, a minor waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure needn't be explained, and the description covers scopes, workspace overriding, and the null/low-confidence edge case. It is essentially complete for a single-lead read; only explicit alternative-tool guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; workspaceId and workspaceSlug are already documented in the schema, and the description only restates their override role. leadId is required but has no textual meaning in either place, so the description does not fully compensate for the gap. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a predictive booking-likelihood score (0-100) for one lead, derived from a trained bucket-rate model, plus its return components (confidence tier, top features). This is highly distinctive; no sibling analytics or leads tool returns a per-lead model score, so an agent can identify it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives usage context for the workspace override ('Use workspaceId or workspaceSlug to override the default workspace configured by environment'), which is helpful. However, it never states when to use this tool versus adjacent options such as luca_leads_explain or the other analytics tools, leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_learning_insightsRead what Luca has learnedARead-onlyIdempotentInspect
Read-only rollup of the agent-improvement signals mined from post-call feedback for a period: total/applied/pending signal counts, a per-type breakdown (qualification, objection handling, lead quality, general), and recent example notes. An empty rollup is the honest, expected state until the coach submits call feedback — never fabricated learning.
Luca operation: GET /api/analytics/learning-insights Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/destructive/openWorld, so the bar is lower; the description still adds required scopes (analytics:read, luca:read), data sensitivity redacted, the underlying endpoint, and the honest-empty-state behavior. It adds real operational context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and payload are front-loaded, then operational facts (endpoint, scopes, idempotency, workspace override) follow in compact lines. It is a bit list-heavy but every line carries information an agent can use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value documentation is not strictly required, yet the description still summarizes the shape and the empty-state semantics. Auth, workspace targeting, and scope requirements are covered, making it complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: workspaceId/workspaceSlug are documented in the schema, and the description mirrors that they override the environment default workspace. The start/end period parameters are only obliquely referenced via 'for a period' and left entirely to the schema, so the description adds little beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('read-only rollup of agent-improvement signals mined from post-call feedback') and enumerates the payload (counts, per-type breakdown, example notes). It is clear about scope, but it never distinguishes itself from near-neighbors like luca_learning_panel, luca_learning_framework_performance, or luca_analytics_insights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides useful context that an empty rollup is the expected state until feedback is submitted, and notes workspace override, but it gives no explicit when-to-use or when-not-to-use guidance relative to the many sibling analytics/learning tools. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_loss_reasonsRead why deals are lostARead-onlyIdempotentInspect
Category breakdown of automatic 'why you lost' analyses for a period: count and estimated lost revenue per category (price objection, ghosted after a call-to-action, competitor, slow reply, bad fit, other), derived from a per-lead loss analysis generated when a lead goes silent or lost.
Luca operation: GET /api/analytics/loss-reasons Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 required scopes (analytics:read, luca:read), the redacted data sensitivity level, that idempotency is not required, and the data's provenance (derived from per-lead loss analysis generated when a lead goes silent/lost). Only rate limits or refresh cadence are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and category list are front-loaded in the opening sentence, followed by compact metadata lines (operation, scopes, idempotency, workspace override). Some density in the first sentence but no wasted filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, annotations, and covered parameters, the description supplies the remaining essentials: auth scopes, sensitivity, and how the data is produced. Only the period semantics and sibling disambiguation are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; both workspaceId and workspaceSlug already have their own descriptions, and the description merely restates the override behavior. The period parameter and its five enum values are not explained in the description, so it adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (category breakdown of 'why you lost' analyses) and enumerates the exact categories returned plus the metric (count and estimated lost revenue). It is clearly not a generic analytics tool, though it never explicitly contrasts itself with close siblings like luca_analytics_objections or luca_analytics_ghosted_leads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it is a read analytics call for a given period, and the last line gives a concrete hint for overriding the default workspace. There is no statement of when to prefer this over the sibling loss/objection analytics tools, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_magic_mondayRead the weekly business reportARead-onlyIdempotentInspect
Return the current week's business report (called Magic Monday in Luca): pipeline funnel, revenue and ROI, response-speed impact, a point-in-time revenue forecast, and call intelligence (show/close rates). Composes five analytics reads into a single call. Example: call with {} for the weekly report.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds useful context beyond them — the aggregation of five reads and the 'current week' time scope — but says nothing about cost, latency, or rate behavior of the composite call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope in the first sentence, enumerates contents compactly, then gives the empty-args example. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description makes clear the scope is the current week and the call is optional-argument. Adequate for a zero-required-param read tool; only minor missing detail such as how workspace context is otherwise resolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both optional workspace override params are documented in the schema. The description's '{} for the weekly report' reinforces that no arguments are required, but adds no syntax or 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the current week's business report'), enumerates the exact contents (funnel, revenue/ROI, speed impact, forecast, call intelligence), and explicitly says it composes five analytics reads. An agent can distinguish it from luca_analytics_funnel/revenue/forecast etc. purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Composes five analytics reads into a single call' plus the '{} for the weekly report' example tells the agent this is the aggregate entry point versus the individual analytics siblings. It stops short of an explicit 'use this instead of X when Y', so it is clear context without full routing rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_objection_drilldownDrill into one objection typeARead-onlyIdempotentInspect
Per-conversation drilldown for one objection bucket: one row per matching conversation with the lead's display name, the verbatim objection quote, whether the draft was sent without an edit, and the lead's most recent call outcome. Bounded by a limit with a hasMore truncation flag; an empty list is the honest, expected state for a bucket with no conversations in the window.
Luca operation: GET /api/analytics/objections/{type} Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new operational context: required scopes (analytics:read, luca:read), full_content data sensitivity, limit-bounded results with a hasMore truncation flag, and the empty-state contract. Only return-format/pagination mechanics are left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the semantically valuable row-shape sentence, then groups the operational metadata (operation, scopes, idempotency, workspace override) in a compact block. Slightly boilerplate-heavy ('Luca operation: GET /api/...', 'Does not require idempotency') but every line is short and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not restate return values, yet it still covers access prerequisites (both scope layers), sensitivity class, pagination behavior, the default-workspace override path, and the empty-state contract. For a nested-schema, read-only analytics tool this leaves nothing material an agent needs before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% (only workspaceId/workspaceSlug are documented). The description adds that limit bounds results, that hasMore signals truncation, and that workspace override is possible – but it says nothing about the period or channel sub-parameters or the objection type enum values, leaving half the surface to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('per-conversation drilldown for one objection bucket') and enumerates the row shape (lead name, verbatim objection quote, draft-edited flag, latest call outcome), which makes it distinguishable from the aggregate sibling luca_analytics_objections without opening the schema. It never names that sibling explicitly, so the contrast is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the use case (getting per-conversation detail behind one objection bucket) and notes the empty-list case is expected plus that workspaceId/workspaceSlug override the environment default. It gives no explicit when-to-use-this-vs-luca_analytics_objections routing or prerequisites beyond scope declarations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_objectionsRead objection patternsARead-onlyIdempotentInspect
Objection-bucket rollup over the review queue's qualifier signals for a period (price, timing, trust, fit, authority, smokescreen): per-bucket occurrence count, distinct leads, handled rate, wins, and up to three of the most frequent verbatim lead quotes. Filter by channel. An empty bucket list is the honest, expected state until objections are raised — never fabricated.
Luca operation: GET /api/analytics/objections Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, but the description adds real value beyond that: required scopes (analytics:read, luca:read), data sensitivity (full_content), workspace override behavior, and the notable empty-state expectation ('never fabricated'). It stops short of rate limits 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence with the key output fields, followed by a compact metadata block (operation, scopes, idempotency, workspace override). Slightly dense but every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytics rollup with an output schema present, the definition covers scope, auth requirements, sensitivity, and the semantics of an empty result. Nothing critical to invoking it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the description compensates by explaining that period governs the rollup window, that channel is a filter, and that workspaceId/workspaceSlug override the environment-configured default. It does not add format or default-value detail beyond the schema's enums.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (objection-bucket rollup over review-queue qualifier signals) and enumerates the exact buckets and output metrics, so the agent knows precisely what it returns. It does not explicitly name or contrast the closely-named sibling luca_analytics_objection_drilldown, so sibling differentiation is only implicit through 'rollup'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a filter condition ('Filter by channel') and workspace override guidance, which implies usage context for an analytics read. However there is no explicit when-to-use/when-not guidance and no routing toward alternatives such as the drilldown variant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_recommendationsRead recommendationsARead-onlyIdempotentInspect
The coach's active prescriptive recommendations for a week (what to change and why), generated weekly from detected insights and deduped by title. An empty list is the honest, expected state when nothing is recommended for the window — never a fabricated action.
Luca operation: GET /api/analytics/recommendations Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description goes beyond that with the authorization surface (analytics:read, luca:read, full_content sensitivity), the weekly generation cadence, dedup semantics, and the empty-list expectation. It stops short of describing pagination or response shape, but the output schema exists for that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the what-it-is sentence, followed by clearly delineated operational metadata on separate lines. The empty-state sentence is the one addition that carries genuine interpretive value. Slightly more surface area than needed, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description correctly focuses on auth scopes, workspace override, cadence and empty-state semantics. The remaining gap is routing: with dozens of analytics siblings available, the description never tells the agent which one to reach for instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so the baseline is 3. The description usefully adds the default-workspace behavior and the override intent for workspaceId/workspaceSlug — a real semantic gain over the schema's terse "optional override" wording. It says nothing about weekStart or includeDismissed, which the schema also leaves undocumented, so a portion of the parameters remain opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific resource and scope: the coach's active prescriptive recommendations for a given week, deduped by title, generated from detected insights. An agent knows exactly what this returns. It does not explicitly distinguish itself from close siblings like luca_analytics_insights or luca_analytics_learning_insights, so a 5 is not warranted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives real interpretive guidance — an empty list is the expected, honest state and never a fabricated action — which is useful for an agent deciding whether to act. However, it never states when to prefer this tool over the many adjacent analytics siblings (insights, trends, learning_insights, objections). Usage is implied by the weekly-recommendation framing rather than addressed explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_revenueRead revenueARead-onlyIdempotentInspect
Revenue attribution and plan ROI for a period. Returns total revenue, ROI, and a per-channel revenue breakdown.
Luca operation: GET /api/analytics/revenue Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint, openWorldHint), so the bar is lower; the description still adds auth requirements (analytics:read, luca:read), the redacted data sensitivity, and the workspace-override fallback behavior. It does not describe rate limits or pagination, but for a read-only endpoint that is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return shape are front-loaded in the first two sentences, followed by an operation/scope metadata block. No sentence is wasted, though the metadata reads as boilerplate stacked after the useful content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not explain return values, and annotations cover safety, so purpose + auth scopes + workspace behavior covers most needs. The one missing element is differentiation from the many sibling analytics endpoints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the description only lightly touches parameters: it says results are 'for a period' and explains workspaceId/workspaceSlug as overrides. The nested query.period and query.channel enums (five period values, four channels) are left entirely to the schema. Baseline 3 is appropriate given the medium coverage and modest descriptive contribution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Revenue attribution and plan ROI for a period' and enumerates outputs (total revenue, ROI, per-channel breakdown). It's clear what the tool does, but it does not distinguish this from sibling analytics tools like luca_analytics_rollup, luca_analytics_forecast, or luca_analytics_content_attribution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 alternatives despite a dense set of analytics siblings. The only operative sentence concerns workspace override parameters, which is parameter behavior rather than usage selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_rollupGet campaign and broadcast analyticsARead-onlyIdempotentInspect
Roll up performance across the coach's campaigns (per-campaign analytics for up to 5 recent campaigns) and recent broadcasts. When one half fails to load, the other still comes back and failedSections names the one that is missing. Example: call with {} for the default rollup, or { campaignLimit: 3 }.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| campaignLimit | No | How many recent campaigns to include (default 5). | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 genuinely non-obvious behavior: a partial-failure mode where one half still returns and failedSections names the missing section, which is exactly the kind of operational context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the purpose, then the failure behavior, then a concrete invocation example. Every sentence carries information, with only mild overlap against the schema's own default-limit note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value documentation is unnecessary, and the description still flags the failedSections field for degraded responses. Scope, default behavior, and invocation are all covered; the only real gap is routing against sibling analytics tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 workspaceId, campaignLimit, and workspaceSlug, establishing a baseline of 3. The description only reinforces the default limit and gives a concrete example ({ campaignLimit: 3 }), adding marginal value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (roll up) and the two resources combined (per-campaign analytics for up to 5 recent campaigns plus recent broadcasts), so an agent knows the scope is a combined rollup. However, it never names or contrasts with the close sibling luca_campaigns_analytics, which also returns campaign performance, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'roll up' framing and the example invocation, giving a sense of what the tool is for. But there is no explicit when-to-use/when-not guidance and no routing to alternatives such as luca_campaigns_analytics or luca_broadcasts_list, despite many overlapping analytics siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_speed_impactRead what reply speed is worthARead-onlyIdempotentInspect
Fast-vs-slow first-reply booking-rate impact for a period. Returns fast- and slow-reply conversion rates, a lost-opportunity estimate, and the peak performance reply window.
Luca operation: GET /api/analytics/speed-impact Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds valuable context beyond annotations: the required analytics:read / luca:read OAuth scopes, redacted data sensitivity, and the fact that no idempotency key is needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and returns are front-loaded in the first sentence, followed by compact operational metadata. The 'Does not require idempotency' line is marginally redundant given idempotentHint=true, but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytics tool with an output schema, the return values needn't be explained (though they are), and the description supplies scopes, sensitivity, and workspace override. The main gap is the unaddressed 'channel' filter and period enum values, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (mid-range). The description echoes the period dimension ('for a period') and explains the workspaceId/workspaceSlug override purpose, but the 'channel' filter is never mentioned in the description, so a parameter visible in the schema is not contextualized. Adds modest value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific analysis ('Fast-vs-slow first-reply booking-rate impact for a period') with a clear verb-like action and resource, and enumerates the concrete outputs (fast/slow conversion rates, lost-opportunity estimate, peak reply window). It is clearly distinct from funnel/revenue/forecast siblings by its narrow focus, though it never names an alternative to route the agent explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'for a period' plus the note to use workspaceId/workspaceSlug to override the environment default. There is no explicit when-to-use versus other analytics tools (e.g. ghosted_leads, benchmarks) and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_topic_performanceRead topic performanceARead-onlyIdempotentInspect
Weekly rollup by normalized content topic (post count, average engagement rate, attributed leads/bookings/revenue per theme). Defaults to the most recently computed week when weekStart is omitted; an empty items list is the honest, expected state until content topics are extracted, not zero performance.
Luca operation: GET /api/analytics/topic-performance Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, non-destructive, idempotent, closed-world, but the description adds real context: required scopes (analytics:read, luca:read), redacted data sensitivity, and the important semantics that an empty items list is expected until topics are extracted rather than a signal of zero performance. The idempotency note is about idempotency keys rather than operation semantics and is slightly at odds with idempotentHint=true wording, but it is not a true contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the rollup and its metrics, then layers defaults, state semantics, and auth in short sentences. Slightly boilerplate-heavy (operation path, idempotency line) but each line carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape need not be explained, and the description still covers scope, sensitivity, default week behavior, workspace override, and the empty-result state. Complete enough for a read-only aggregate tool, with only sibling differentiation left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 67%, and the undocumented parameter is weekStart; the description compensates by explaining its default-to-most-recent-week behavior. The workspace override parameters are documented in the schema, so the remaining description text adds marginal value there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (weekly rollup) and resource (normalized content topic) and enumerates the returned metrics (post count, engagement rate, leads/bookings/revenue per theme). It does not explicitly distinguish itself from close siblings like luca_analytics_content_performance or luca_analytics_content_attribution, which an agent could easily confuse with a topic-level rollup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives useful operating context (weekStart defaults to the most recently computed week; workspaceId/workspaceSlug override the configured default workspace) but never says when to prefer this tool over the sibling content/attribution analytics tools. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_trendsRead trendsARead-onlyIdempotentInspect
The coach's weekly metrics as a trend series (leads, qualified, booked, revenue, and rates week over week) for charting direction of travel. An empty series is the honest, expected state until enough weeks of history accrue — never fabricated points.
Luca operation: GET /api/analytics/trends Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world). The description adds genuinely useful behavioral context beyond them: an empty series is the 'honest, expected state' and points are 'never fabricated.' It also surfaces required scopes and data sensitivity (redacted).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose in the first sentence, then the empty-state caveat, then operational metadata. Every sentence carries some value, though the metadata block (operation, scopes, idempotency) is boilerplate-heavy and slightly inflates length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained. The description covers the workspace override, the empty-state expectation, scopes, and data sensitivity — enough for an agent to call it correctly. The underexplained 'weeks' parameter is the only modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (weeks is undocumented in schema, workspaceId/workspaceSlug are documented), placing the baseline at 3. The description adds meaning for the workspace params by explaining they override the environment-configured default, but gives no semantic guidance on the 'weeks' window itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: weekly metrics (leads, qualified, booked, revenue, rates) delivered as a week-over-week trend series. The 'for charting direction of travel' framing distinguishes it as a time-series read, separable from point-in-time siblings like analytics_revenue or analytics_funnel. It stops short of naming those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage via 'for charting direction of travel' but never states when to choose this over the many other luca_analytics_* siblings (funnel, forecast, rollup, deep_dive). No when-not or alternative routing is given, so usage is inferred rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_analytics_trust_scoreRead the trust scoreARead-onlyIdempotentInspect
Draft approval, edit, and rejection rates plus the auto-send gate flag for a period.
Luca operation: GET /api/analytics/trust-score Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds genuine behavior-relevant context beyond them: required scopes ('analytics:read', 'luca:read'), the data sensitivity level ('redacted'), and the note that no idempotency is required — all useful to an agent planning the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The human-readable purpose is front-loaded, followed by compact metadata lines (operation, scopes, idempotency, workspace override). Slight redundancy exists — 'Does not require idempotency' echoes the idempotentHint annotation — but overall it is tight and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no prose explanation, and annotations carry the safety profile. Combined with the scope/sensitivity/workspace details, the description gives an agent enough to invoke it correctly; only the channel-filter semantics are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (workspaceId/workspaceSlug are documented), but the nested period and channel enums have no descriptions. The prose repeats the workspace-override hint and mentions 'for a period', adding only marginal meaning beyond the schema and leaving the channel filter unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific set of metrics ('draft approval, edit, and rejection rates plus the auto-send gate flag') and a scope ('for a period'), so the agent knows exactly what data this produces. It does not, however, explicitly differentiate itself from the many other analytics siblings (e.g. lead_score, funnel), which is the only reason it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description adds operational guidance — 'Use workspaceId or workspaceSlug to override the default workspace configured by environment' — which is actionable. But it never states when to reach for this tool versus the other analytics endpoints, and there are no exclusions or prerequisites beyond the scope note, so usage remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_approve_and_sendApprove a drafted reply and send itADestructiveInspect
Approve a pending review-queue draft and dispatch it through the lead's channel. THIS SENDS A REAL MESSAGE TO A REAL PERSON — only call it after a human has reviewed and intends to send. Pass confirm: true to proceed. Optional finalBody replaces the draft text before sending. Example: { reviewQueueId, confirm: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| finalBody | No | Optional edited body to send instead of the drafted text. | |
| workspaceId | No | Optional Luca workspace id override. | |
| reviewQueueId | Yes | The review-queue item to approve. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Reuse the same key when retrying this exact approval. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint and openWorldHint, but the description adds critical context beyond them: the message goes to a REAL person, human review is mandatory, and confirm: true is a hard gate. This is exactly the kind of real-world impact and workflow constraint an agent needs before invoking a destructive send.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the safety warning, then states the confirm requirement and an example. No filler. The example is short and reinforces the calling pattern; minor room to trim without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. All six parameters are documented in the schema, and the description covers purpose, safety, and the confirm gate. It could note retry/idempotency behavior, but overall it 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description restates confirm: true and that finalBody replaces the draft text, plus gives a usage example, but it adds little meaning beyond what the parameter descriptions already supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Approve a pending review-queue draft and dispatch it through the lead's channel.' The action is unambiguous. However, it does not differentiate itself from the sibling luca_review_queue_approve, leaving the agent to infer how approve-and-send differs from plain approve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition: only call after a human has reviewed and intends to send, and requires confirm: true. This is a strong when-to-use gate, but no alternative tool (e.g. luca_review_queue_approve or luca_conversations_send) is named for cases where the draft should not be sent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_book_callBook a call with a leadADestructiveInspect
Book a call on the coach's calendar provider and have the provider invite the lead's email; the lead also gets Luca's booking confirmation. Works for call types on Calendly, Cal.com, or Google Calendar. Reads the open slots of the call type first and books the one that starts at slotAt. When that slot is taken it books nothing and returns the open slots instead, so pick one of them and call again. The answer is usually pending while the provider confirms; check it with luca_bookings_provider_requests_get. The booking puts an event on the coach's calendar and invites the lead, so pass confirm: true only after the coach approves this exact slot. If a retry answers slot_not_available, the first attempt may have taken the slot, so check luca_bookings_list before booking again. To record a call that is already on a calendar, use luca_bookings_create instead. Example: call with { leadId, bookingTypeId, slotAt: "2026-07-14T15:00:00Z", inviteeEmail: "sam@example.com", confirm: true } after the lead agreed to a time.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead to book. | |
| slotAt | Yes | ISO-8601 start time for the call, with an offset. It must be an open slot of the call type, as luca_bookings_managed_availability lists them. | |
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| timezone | No | IANA time zone the booking is shown in, such as Europe/Madrid. Defaults to UTC. | |
| inviteeName | No | The lead's name as the invite should show it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| inviteeEmail | Yes | The lead's email. The provider sends the invite there. | |
| bookingTypeId | Yes | The call type to book, from luca_bookings_types_list. Its provider is the calendar the call lands on. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Reuse the same key when retrying this exact booking, so a repeat of a request that already reached the API cannot book the call twice. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/openWorld/non-idempotent, but the description adds what those flags actually mean here: it reads open slots first, creates a real calendar event, messages the lead, returns open slots instead of booking when the slot is taken, and may be pending while the provider confirms. The confirm:true gating requirement is stated with its precondition (coach approval of this exact slot), which the schema's generic confirm blurb does not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and provider scope, then failure handling, then the confirm gate and alternative tool. Nine sentences is on the long side for a tool description, and the pending-status and retry sentences overlap slightly, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A high-stakes mutation with 10 params and 4 required fields; the description covers preconditions, side effects, fallback behavior, retry safety, and the sibling to use instead. Return values are covered by the output schema, so nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns a bump by adding a full example call showing the four required params together and by clarifying that slotAt must match a slot the availability listing returned. It does not add meaning for the less-obvious params (workspaceId/workspaceSlug overrides, timezone), leaving that to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (book a call on the coach's calendar provider) plus the side effects (provider invites the lead's email, lead gets Luca's confirmation). It also names the providers covered and distinguishes itself from luca_bookings_create, which records calls already on a calendar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit about when to call (after the lead agreed to a time and the coach approved this exact slot), when not to (use luca_bookings_create to record an existing call), and what to do on the two failure paths (slot taken → pick from returned slots; slot_not_available on retry → check luca_bookings_list first). It also points to luca_bookings_provider_requests_get for pending confirmations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_availabilityRead open call slotsARead-onlyIdempotentInspect
List open slots the coach can actually be booked into. Check this before booking.
Luca operation: GET /api/bookings/availability Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's added value is the auth surface: required scopes bookings:read and luca:read, data sensitivity 'redacted', no idempotency key needed, and the fact it falls back to an environment-configured default workspace. It still doesn't describe the returned shape or how availability is computed (calendar sync state, provider differences).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The actionable sentence is front-loaded, but several lines are generated metadata (Luca operation, required scopes, idempotency boilerplate) that pad the definition. Still efficiently short overall with no filler prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it covers purpose, ordering relative to booking, auth scopes, and workspace defaults. The remaining gap is guidance on the filter parameters that drive what slots come back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and only start/end carry inline descriptions. The description compensates for workspaceId/workspaceSlug by explaining the default-workspace override, but the nested query parameters (leadId, provider, timezone, calendarId, eventTypeId) are undocumented in both the schema and the description, leaving real gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('List open slots the coach can actually be booked into'), and 'actually be booked into' distinguishes it from a static schedule listing. It is not explicitly differentiated by name from close siblings like luca_bookings_managed_availability or luca_bookings_types_schedule, which would be needed for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Check this before booking' gives a concrete ordering constraint relative to the write tools (luca_bookings_create, luca_book_call). It does not name when-not to use it or point at luca_bookings_managed_availability / luca_bookings_types_schedule as alternatives for differing needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_briefRead a pre-call briefARead-onlyIdempotentInspect
Read the pre-call brief: who the lead is, what they want, and the objections to expect.
Luca operation: GET /api/bookings/{id}/brief Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the core safety profile is covered. The description adds valuable behavioral context beyond annotations: API operation, required scopes, OAuth scope, and data sensitivity 'full_content', which tells the agent this returns sensitive personal data. It does not describe the return shape, but an 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the key purpose sentence and then provides structured technical metadata. It is appropriately sized for a simple read tool, though some operational notes (such as 'Does not require idempotency') are less essential given annotations and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only endpoint with full annotations, an output schema, and three simple parameters, the description covers purpose, auth scopes, data sensitivity, and workspace override behavior. No critical information needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, with the workspaceId and workspaceSlug parameters already described. The description adds meaningful context by explaining that these parameters override the default environment-configured workspace. The required 'id' parameter is not described in the description, but its role is clear from the endpoint path and schema format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Read the pre-call brief') and elaborates on the brief's contents, making the tool's purpose clear. It does not explicitly differentiate itself from sibling tools such as luca_bookings_get, which likely returns broader booking details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose statement, but there is no explicit guidance on when to use this tool versus alternatives like luca_bookings_get or when a pre-call brief is available. The required scopes and workspace override notes add operational context but not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_calendars_listList connected calendarsARead-onlyIdempotentInspect
List the calendars Luca reads for conflicts, and which one it writes new events to.
Luca operation: GET /api/bookings/calendars Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered; the description adds genuinely new context beyond that, namely required scopes (bookings:read, luca:read) and the 'data sensitivity: redacted' handling. The 'Does not require idempotency' line simply restates the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first line, and the remaining metadata (endpoint, scopes) is scannable. One line, 'Does not require idempotency,' is redundant with idempotentHint=true and could be dropped, but the overall size is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the annotations cover the safety profile; the description fills in scope/auth requirements and default-workspace behavior. Only the absence of sibling-routing guidance keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description adds meaning beyond the schema: workspaceId/workspaceSlug are overrides of an environment-configured default workspace, which clarifies the default behavior an agent would otherwise have to guess.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List), a specific resource (calendars Luca reads for conflicts), and adds a distinguishing detail: which calendar it writes new events to. An agent can place it against siblings like luca_bookings_calendars_select/remove without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (a read-only listing of connected calendars) and it does note when to use the workspace override, but it never states when to prefer this over the related calendars_select/calendars_remove siblings or what prerequisites exist. Guidance is present but shallow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_calendars_removeRemove a booking calendarADestructiveIdempotentInspect
Stop using a calendar for conflict checks or as the booking destination. The calendar itself is left alone in Google; only Luca's selection changes.
Luca operation: DELETE /api/bookings/calendars Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and idempotentHint=true, but the description adds important context: only Luca's selection changes and the Google calendar is untouched. It also discloses required scopes and idempotency-key behavior, which helps the agent understand the side effects and retry semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and side-effect clarification, followed by operation metadata and retry/workspace guidance. It is efficient overall, though the metadata lines make it slightly less crisp than a pure prose definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, schema, and an output schema present, the description supplies the key operational context: side effects, scopes, idempotency, and workspace override. It is complete enough for correct invocation, though it could explicitly point to the select/list siblings for related workflows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already documents most parameters. The description reinforces idempotencyKey and workspace override behavior, but it does not add meaning for the required body fields provider and calendarId beyond what is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and scope: stop using a calendar for conflict checks or as the booking destination. It also clarifies that the Google calendar itself is left alone, distinguishing this from actual calendar deletion and from the sibling selection operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly describes the situation in which to use the tool: when a calendar should no longer be used for conflict checks or as the booking destination. It does not explicitly name luca_bookings_calendars_select as the alternative, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_calendars_selectSelect a booking calendarADestructiveIdempotentInspect
Add or update a calendar selection, either for conflict checks or as the destination new bookings are written to. The destination has to be writable: a read-only calendar returns 400, and a Google connection needing attention returns 409.
Luca operation: PUT /api/bookings/calendars Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (destructive, idempotent, open-world), so the bar is lower, and the description still adds real value: error semantics (400/409), required scopes, and idempotency-key handling. It does not say what happens to a previously selected destination/conflict calendar when this upsert runs, which is the remaining meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the behavioral sentence, then a compact block of operational facts (endpoint, scopes, idempotency, workspace override). Every line adds something, though the metadata block is slightly boilerplate-heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since an output schema exists, return values need not be explained, and the description covers auth, retries, workspace scoping, and failure codes for a nested-body mutation. It is not fully complete for the complex body schema — the semantics of the required calendar fields are left to the caller to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level params (workspaceId, workspaceSlug, idempotencyKey) are covered by schema descriptions and echoed in the prose. However, the nested body object contains seven required fields with zero property descriptions in the schema, and the description explains none of them — notably accessRole and the distinction between conflictEnabled and defaultDestination, which are only hinted at by the 'conflict checks / destination' framing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair and resource: 'Add or update a calendar selection', with the two distinct purposes spelled out (conflict checks vs. destination for new bookings). It is clearly distinct from the list/remove siblings by implication, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete eligibility conditions for the destination role: it must be writable, a read-only calendar returns 400, and a Google connection needing attention returns 409. It also explains the workspace override and idempotency key, though it offers no explicit 'use X instead when...' routing to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_cancelCancel a bookingADestructiveInspect
Cancel a booking. A Google Calendar or Cal.com booking is cancelled on that calendar too, and the calendar can email the lead about it.
Luca operation: DELETE /api/bookings/{id} Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it explains that external calendars are mutated, that the connected calendar may email the lead (a side effect the agent cannot see from destructiveHint alone), that an Idempotency-Key is required but server-generated if omitted, and that the call is rejected without confirm: true. These are exactly the behavioral facts an agent needs before committing a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the cross-system side effect, then lists operational requirements in a scannable block. There is minor redundancy — the confirm and idempotencyKey rules are repeated in the schema descriptions — but nothing is padded or irrelevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and annotations already cover readOnly/openWorld/idempotent/destructive. What remains thin is the write-side aftermath: whether guest links, reminders, or outcomes tied to the booking are affected. Strong but not exhaustive for a destructive multi-system operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3; the description earns an extra point by restating the confirm gate as a hard rejection condition and explaining the idempotency-key fallback behavior and the workspace default-override semantics. Only the 'id' parameter's meaning is left entirely to the schema, which is acceptable for a path identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel a booking') and immediately discloses the downstream consequence: the booking is also cancelled in the connected Google Calendar or Cal.com. This distinguishes it clearly from siblings like luca_bookings_update, luca_reschedule_call, and luca_bookings_get without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives operational preconditions (bookings:write scope, Idempotency-Key, confirm: true, workspace override) which is useful invocation guidance. However it never says when to choose this over alternatives — e.g. no mention of luca_reschedule_call for moving a booking instead of cancelling, or what to do if the booking is already cancelled. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_createBook a callADestructiveInspect
Create a provider-neutral booking record. Body requires leadId and slotAt.
Luca operation: POST /api/bookings Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds genuinely new behavior: required OAuth scope luca:queue_ops, full_content data sensitivity, the Idempotency-Key requirement including server-side generation when omitted, and that the call is rejected without confirm: true. Idempotency behavior in particular is not expressible via the idempotentHint=false annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in sentence one, then organized into short labeled lines for endpoint, scopes, idempotency, confirmation and workspace override. Slight redundancy: the confirm requirement is stated both in the description and in the confirm parameter's schema description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the top-level parameters are well covered. However the nested body object carries 13 properties (provider, status, timezone, locationType, calendly/provider event IDs) that the description never touches, so an agent gets no guidance on the provider-neutral payload shape beyond the two required fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema already documents confirm, workspaceId, workspaceSlug and idempotencyKey almost verbatim as the description restates them. The mention that leadId and slotAt are required just repeats the schema's required array. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ("Create a provider-neutral booking record") and adds the two required body fields. "Provider-neutral" usefully sets it apart from provider-sync siblings like luca_bookings_provider_requests_create, but it never names luca_book_call or luca_reschedule_call, which an agent could easily confuse with this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the operational requirements (scopes, confirm, workspace override) but there is no explicit when-to-use / when-not-to-use guidance and no routing against the many booking siblings (luca_book_call, luca_bookings_update, luca_bookings_cancel, luca_bookings_guest_links_create). The agent must infer selection from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_getGet a bookingARead-onlyIdempotentInspect
Read one booking: its slot, status, provider, and lead.
Luca operation: GET /api/bookings/{id} Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/not-destructive/idempotent, so the description adds real value beyond them: the underlying operation (GET /api/bookings/{id}), required scopes (bookings:read, luca:read), the 'full_content' data sensitivity, and an explicit idempotency note. It omits pagination/field-expansion behavior, but the safety and auth profile is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the payload of the tool in one sentence, followed by clearly labeled metadata lines. Every line carries operational information; no filler or duplicated prose. Slightly boilerplate-heavy but appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description supplies the operation, auth scopes, sensitivity, and workspace-override context. Only the ambiguity around workspaceId vs workspaceSlug precedence and item-level filtering keeps it short of full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the description's only parameter-relevant line restates the workspaceId/workspaceSlug override that the schema already documents. It adds nothing for 'id' (uuid/pattern) and doesn't clarify precedence when both workspaceId and workspaceSlug are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one booking') and enumerates the returned facets (slot, status, provider, lead). The word 'one' distinguishes it from the sibling luca_bookings_list, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the required 'id' and the single-item framing, but there is no explicit when-to-use guidance, no statement of when to prefer luca_bookings_list or luca_bookings_brief instead, and no exclusions. The workspace override note concerns parameters, not usage selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_guest_links_createCreate a guest link for a bookingAInspect
Mint revocable reschedule and cancel links for one booking, so a lead can move the call without an account.
Luca operation: POST /api/bookings/{id}/guest-links Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial value beyond annotations: endpoint path, required scopes/bookings:write, OAuth scope, data sensitivity, and the fact that links are revocable and that an Idempotency-Key is required. The idempotentHint=false annotation is consistent with the description telling the caller to supply a key for safe retries, not contradicted by it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, with operational metadata (scopes, idempotency, workspace) following efficiently. Slightly dense but every line carries operational weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers auth, idempotency, and workspace scoping for a mutating tool. The only meaningful gap is the lifetime semantics of the generated links, which are left to the schema's numeric bounds.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%. The description clarifies idempotencyKey and workspaceId/workspaceSlug beyond the schema, but says nothing about expiresInHours (default 168, max 720), which is the one body parameter lacking a schema description and matters for guest link lifetime.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (mint/create) plus resource (guest reschedule/cancel links) and the business reason (let a lead move the call without an account). It is clearly distinguishable from the sibling luca_bookings_guest_links_revoke and from generic booking mutations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for use: scopes, workspace override, and retry behavior are spelled out. It does not explicitly name when NOT to use it versus revoke/update alternatives, so it stays below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_guest_links_revokeRevoke a booking's guest linksADestructiveIdempotentInspect
Kill every outstanding guest link on a booking at once.
Luca operation: DELETE /api/bookings/{id}/guest-links Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=true, so the safety profile is covered. The description adds genuinely useful operational context: required scopes (bookings:write, luca:queue_ops), that an Idempotency-Key is mandatory with server-side generation as fallback, and that data is redacted. It stops short of saying whether revocation is reversible or what happens to already-used links, but the additions are substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive action and its bulk scope are front-loaded in one sentence, followed by compact structured lines for endpoint, scopes, idempotency, and workspace. Every line carries information; the 'data sensitivity: redacted' fragment is the only piece of ambiguous boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it does cover auth scopes, idempotency, workspace targeting, and destructive scope. The remaining gap is outcome semantics—whether previously issued or already-accepted links are also invalidated—but the definition 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the three optional parameters (workspaceId, workspaceSlug, idempotencyKey) each carry their own schema description. The description restates the idempotency-key behavior and workspace override without adding format or precedence rules beyond the schema. Adequate at the baseline, but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence states a specific verb ('kill'/'revoke'), resource ('guest links'), and scope ('every outstanding ... on a booking at once'), and the DELETE endpoint line pins the exact operation. This clearly separates it from the sibling luca_bookings_guest_links_create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The bulk nature ('every outstanding guest link at once') implies when this tool is appropriate, and the workspace-override line tells the agent how to target a non-default workspace. However, there is no explicit when-to-use versus create/update, and no stated preconditions (e.g. what happens if the booking already started). Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_lifecycle_attentionList bookings needing attentionARead-onlyIdempotentInspect
List bookings where Luca's record and the provider's disagree and a human has to decide.
Luca operation: GET /api/bookings/lifecycle-attention Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent and non-destructive, so the bar is lower. The description still adds real operational context: required scopes (bookings:read, luca:read), full_content data sensitivity, and that no idempotency key is needed. It does not disclose pagination, result volume, or whether the disagreements are pre-filtered by severity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The distinguishing definition is front-loaded in one sentence, followed by a compact metadata block (endpoint, scopes, idempotency, workspace override). Most lines earn their place, though 'Does not require idempotency' is partly redundant against the idempotentHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description supplies the endpoint, auth scopes, sensitivity level and workspace override behavior. What remains thin is the relationship to the resolution/retry siblings and any hint about how many items or how often to re-check.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both optional parameters are already documented, giving a baseline of 3. The description's 'Use workspaceId or workspaceSlug to override the default workspace configured by environment' adds the useful fact that a default exists and these are overrides, but nothing about precedence when both are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb+resource and a genuinely distinguishing scope: bookings where Luca's record and the provider's disagree and a human must decide. That clearly separates it from luca_bookings_list and luca_bookings_needs_outcome. It stops short of naming the sibling it feeds into (luca_bookings_lifecycle_resolution), so it is not a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent can infer this is the read step before calling luca_bookings_lifecycle_resolution, but the description never says when to use this versus that resolution tool, nor whether it should be polled or is event-driven. No explicit when/when-not guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_lifecycle_resolutionResolve a booking's lifecycle flagADestructiveInspect
Settle one booking whose record disagrees with the provider's: retry the sync, dismiss the duplicate, or keep Luca's version.
Luca operation: POST /api/bookings/{id}/lifecycle-resolution Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: required scope bookings:write, luca:queue_ops OAuth scope, full_content sensitivity, the Idempotency-Key requirement, and the mandatory confirm:true gate. These are operationally important disclosures the annotations alone (readOnly=false, destructive=true, idempotent=false) do not convey. It does not describe reversibility or what state changes actually occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The intent sentence is front-loaded and the remaining operational requirements are broken into short, scannable lines. The API path and scope/sensitivity metadata are somewhat boilerplate-heavy but still earn their place for a write operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a destructive booking mutation with annotations, the description covers auth, idempotency, confirmation and workspace scoping, leaving only the precise body-shape semantics under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so the schema already documents confirm, idempotencyKey and the workspace overrides, which the description largely restates. The core `body` parameter (status/action/reason enums) has no schema description, and the description's three-option phrasing only loosely maps to it, so it does not compensate for that gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Settle one booking whose record disagrees with the provider's") and enumerates three resolution outcomes, which distinguishes it from generic siblings like luca_bookings_update and luca_bookings_provider_sync_retry. However, the listed options ("retry the sync, dismiss the duplicate, keep Luca's version") map imperfectly onto the schema's actual enums (action=dismiss_duplicate, status=confirmed/cancelled/completed/no_show), so the naming of the alternatives is slightly imprecise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an implied trigger condition (a booking whose record disagrees with the provider's) but never names a competing tool or says when NOT to use this one, even though luca_bookings_provider_sync_retry and luca_bookings_update are obvious neighbors. Usage is inferable but not routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_listList bookingsARead-onlyIdempotentInspect
List bookings. Query supports limit, cursor, status, and upcoming.
Luca operation: GET /api/bookings Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, and the description adds genuinely non-structured context: required scopes, 'data sensitivity: full_content', and the workspace-override default. It omits any note on pagination/truncation behavior at the description level, though maxPages in the schema partially covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then compact metadata lines. Some lines ('Does not require idempotency') are near-redundant with the idempotentHint annotation, but nothing is verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, an output schema, and nested query schema already present, the description's remaining job is auth/scope and default-workspace context, which it supplies. The one real gap is filter value semantics for status and upcoming.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% and the description names limit, cursor, status, upcoming, workspaceId and workspaceSlug, but never explains what values status/upcoming accept (no enums) and omits leadId entirely. It repeats schema-known parameter names rather than adding filter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List bookings') and even names the underlying operation (GET /api/bookings), so the agent knows exactly what happens. It does not, however, distinguish itself from nearby siblings such as luca_bookings_brief, luca_bookings_get, or luca_bookings_lifecycle_attention.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful preconditions (scope bookings:read, luca:read) and tells the agent how to override the default workspace, but it never says when to choose this list over sibling retrieval tools like luca_bookings_get or luca_bookings_brief. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_managed_availabilityRead Luca-managed call slotsARead-onlyIdempotentInspect
List open slots for one of Luca's own call types, with calendar conflicts already removed.
Luca operation: GET /api/bookings/managed-availability Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the bar is lower, and the description still adds real context: required scopes, redacted data sensitivity, workspace override behavior, and the meaningful detail that calendar conflicts are pre-removed. The line "Does not require idempotency" sits awkwardly beside idempotentHint=true but is about idempotency keys, not the operation's nature, so it reads as redundant rather than contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by a compact metadata block. The scope/sensitivity lines are boilerplate but each carries actionable constraint information; nothing is padding, though the block format is denser than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers auth scope, workspace selection, and the conflict-free semantics. The remaining gap is guidance on the two required nested parameters and on choosing this tool over luca_bookings_availability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the baseline is roughly met. The description restates the workspaceId/workspaceSlug override that the schema already documents, but says nothing about the nested `query` object's required fields (bookingTypeId, timezone) or what timezone controls — the most error-prone part of the call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List open slots") scoped to "one of Luca's own call types" and adds the key behavioral qualifier that calendar conflicts are already removed. It does not, however, distinguish itself from the sibling luca_bookings_availability, so an agent still has to infer which availability endpoint applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Use is only implied by "for one of Luca's own call types" — an agent can guess this is for Luca-managed booking types rather than externally synced calendars, but the description never says when not to use it or names luca_bookings_availability as the alternative. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_needs_outcomeList calls with no outcome recordedARead-onlyIdempotentInspect
List attended calls with no outcome recorded yet. The work list for closing revenue attribution.
Luca operation: GET /api/bookings/needs-outcome Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real context beyond that: required OAuth scopes, 'data sensitivity: full_content', and the fact that no idempotency key is required. The phrase 'Does not require idempotency' sits in mild tension with idempotentHint=true (one describes the caller's obligation, the other the operation's nature), but it is not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the operational metadata is compact and scannable. The 'Does not require idempotency' line is the one near-filler item, since annotations already carry idempotency semantics, but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers the remaining unknowns: auth scopes, sensitivity level, read-only nature, and workspace defaulting. Pagination or result-size behavior for this list is not mentioned, which is the only notable gap for a read-list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description adds semantics the schema lacks: workspaceId/workspaceSlug are overrides of a default workspace configured by the environment. That fallback behavior is genuinely useful for deciding whether to pass either parameter at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource with a precise scope: 'List attended calls with no outcome recorded yet,' which cleanly separates it from luca_bookings_list (all bookings), luca_bookings_outcome_get (one booking's outcome), and luca_bookings_outcome_record (the write side). 'The work list for closing revenue attribution' adds the business intent, so an agent knows what this list is for without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear: this is the work list an agent pulls when it needs to close out revenue attribution, and the required scopes (bookings:read, luca:read) are stated as prerequisites. It does not name alternatives or state when not to use it (e.g. versus luca_call_events_needing_feedback), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_outcome_getGet a booking's outcomeARead-onlyIdempotentInspect
Read where the sale stands on a booking, plus the version you send back to correct it.
Luca operation: GET /api/bookings/{id}/outcome Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower; the description still adds real context by listing required scopes (bookings:read, luca:read), noting data sensitivity is redacted, and confirming no idempotency key is needed. It does not describe error or not-found behavior, but the added auth/sensitivity detail is genuinely beyond the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded, followed by operation path, scopes, idempotency and workspace override as short scannable lines. Slightly boilerplate-heavy, but every line carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations carry the safety profile. The description supplies the remaining essentials an agent needs: auth scopes, sensitivity, idempotency posture and workspace override semantics. Only minor gaps remain (no explicit sibling routing), so it is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: workspaceId and workspaceSlug are already documented as 'Optional Luca workspace ... override'. The description restates the override and adds the useful fact that the fallback is the environment-configured default workspace, but the required `id` parameter carries no description anywhere. Net value over the schema is marginal, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read where the sale stands on a booking') and adds the useful detail that it also returns 'the version you send back to correct it', which points at the optimistic-concurrency token consumed by luca_bookings_outcome_record. It stops short of naming sibling tools like outcome_history or outcome_record, so an agent must infer the boundary rather than read it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mention of 'the version you send back to correct it' implicitly signals the read-before-update workflow, and the workspace override note gives a usage condition. However, there is no explicit when-to-use guidance or routing versus the many sibling outcome tools (history, record, reasons_list, needs_outcome), leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_outcome_historyRead a booking's outcome historyARead-onlyIdempotentInspect
Read every outcome ever recorded on a booking, in order. Corrections append rather than overwrite.
Luca operation: GET /api/bookings/{id}/outcome/history Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety bar is low; the description still adds real value with 'Corrections append rather than overwrite' and the scope/data-sensitivity disclosures. It does not mention pagination or result volume for an 'every outcome ever' read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core behavior in the first sentence, then layers operation/scope/workspace metadata compactly. Slightly boilerplate-heavy but every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be described; scopes, auth, and workspace resolution are covered. Only the absence of pagination/volume hints for a potentially unbounded history leaves a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (id is undocumented, workspace params have descriptions), so the schema does part of the work. The description explains the workspaceId/workspaceSlug override against the environment-configured default, adding meaning the schema alone doesn't convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read every outcome ever recorded on a booking, in order') and adds the append-only nuance. It is clearly distinguishable in intent, though it does not explicitly name the nearest sibling (luca_bookings_outcome_get) to contrast history-vs-current outcome.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides operational context (required scopes, workspace override, idempotency not required) but gives no explicit when-to-use/when-not guidance versus outcome_get, outcome_record, or outcome_reasons_list. Usage is only implied by the 'history' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_outcome_reasons_createCreate a loss reasonAInspect
Add a lost-sale or cancellation reason in the workspace's own wording. A code already in use returns 409.
Luca operation: POST /api/bookings/outcome-reasons Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Going beyond the annotations, the description discloses a concrete failure mode (409 when the code is already in use), the required OAuth scopes (bookings:write, luca:queue_ops), and idempotency-key handling for retries. This is meaningful behavioral context that the structured fields do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, followed by compact operation metadata (endpoint, scopes, idempotency, workspace override). Well structured and largely waste-free, though the metadata lines are somewhat boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the definition covers scopes, idempotency, conflict behavior, and workspace targeting. It omits a few body fields and any note on the kind enum's meaning, but is sufficient to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema largely documents the parameters. The description adds useful semantics to 'code' (uniqueness/409) and 'label' (workspace's own wording) and explains the workspaceId/workspaceSlug override, but says nothing about kind, displayOrder, or bookingTypeId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Add a lost-sale or cancellation reason in the workspace's own wording.' This clearly distinguishes the create action from siblings like outcome_reasons_list and outcome_reasons_update, though it doesn't explicitly call those siblings out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is present but indirect: it explains the 409 behavior on duplicate codes, when to supply an idempotencyKey for safe retries, and how to override the default workspace. It never states when to use this tool versus the update/list siblings or what preconditions (e.g., existing code set) apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_outcome_reasons_listList loss reasonsARead-onlyIdempotentInspect
List the reasons a sale can be lost or a call cancelled. Use one of these codes when recording an outcome.
Luca operation: GET /api/bookings/outcome-reasons Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, non-open-world. The description adds scope requirements (bookings:read, luca:read), data sensitivity, and the absence of an idempotency requirement, which is real context beyond the structured annotations. No caveats about pagination or result limits are given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in a single sentence, followed by the usage hint and compact operation metadata. The boilerplate scope/idempotency lines are justified as they carry information absent from annotations, though 'Does not require idempotency' borders on redundant for a GET.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need not be described, and the description covers auth scopes, workspace override, and safety. What is missing is any statement of the shape or size of the returned reason list and the meaning of the kind filter's third value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: workspaceId and workspaceSlug carry their own schema descriptions, and the description reinforces the override behavior. The `kind` query parameter (lost_sale/cancelled_call/no_show) has no schema description, and the description only implicitly gestures at two of the three values, leaving no_show undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the reasons a sale can be lost or a call cancelled'), which cleanly separates this reference-list tool from luca_bookings_outcome_reasons_create/update. It stops short of 5 because the schema's third enum value, no_show, is never mentioned, so the enumerated scope is under-stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use one of these codes when recording an outcome' gives a concrete downstream usage context that tells the agent why to call it before luca_bookings_outcome_record. It does not name that sibling explicitly or state when not to call it, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_outcome_reasons_updateUpdate a loss reasonADestructiveInspect
Rename, reorder, or archive an outcome reason. Archiving hides it from the picker and leaves recorded outcomes alone.
Luca operation: PATCH /api/bookings/outcome-reasons/{id} Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds real value: archiving's non-destructive effect on existing outcomes, the required idempotency key with retry semantics, required scopes, and data sensitivity. That is meaningful behavioral context beyond the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The functional sentence is front-loaded ahead of the operational metadata block, and each line earns its place. The scopes/sensitivity lines are dense but relevant to correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description supplies the remaining essentials: mutation semantics, idempotency requirement, auth scopes, and workspace override. Only the body field mapping is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description implicitly maps its verbs to the body fields (label=rename, displayOrder=reorder, active=archive) without naming them, and restates the workspaceId/workspaceSlug/idempotencyKey semantics already documented in the schema. Adequate but adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (rename, reorder, archive) against a specific resource (an outcome reason), and clarifies the archive semantics. An agent can distinguish this from siblings like luca_bookings_outcome_reasons_create or _list without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what archiving does (hides from picker, leaves recorded outcomes alone), which implies when to use it, but gives no explicit when-to-use/when-not guidance or named alternatives. Usage must be inferred from the operation list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_outcome_recordRecord a booking's outcomeADestructiveInspect
Record what the call was worth: won, lost with a reason, or still open. Won and lost outcomes can update a connected CRM deal stage, so pass confirm: true for those outcomes. To correct an earlier outcome send the expectedVersion you read; a stale version returns 409 with the current one.
Luca operation: POST /api/bookings/{id}/outcome Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive when status is won or lost (can update a connected CRM deal): has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses that won/lost can propagate to a CRM deal stage, that the call is rejected without confirm, that a stale expectedVersion yields a 409 carrying the current version, and that an Idempotency-Key is required but auto-generated if omitted. It also states required scopes (bookings:write, luca:queue_ops) and redacted data sensitivity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the metadata block is scannable. However, the confirm/CRM-deal point is stated twice (once in the opening, once in the 'Destructive when...' block), which is mild redundancy in an otherwise tight description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, versioned, authenticated write with an output schema present, the description covers the side effects, confirmation gate, concurrency control, idempotency, and workspace scoping. Nothing an agent needs to invoke it correctly is missing, and return values are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage, the description carries real weight: it explains confirm's rejection behavior, expectedVersion's 409/stale semantics, idempotencyKey's retry role, and the workspaceId/workspaceSlug override. Body-level fields (amountMinor, currency, lossReasonDefinitionId) are only implied by the outcome enumeration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource and enumerates the three outcome states ('won, lost with a reason, or still open'), so the agent knows exactly what is being written. It does not explicitly name the sibling it differs from (e.g. luca_bookings_outcome_get, luca_bookings_outcome_history, or luca_call_events_undo_outcome), which keeps it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives conditional guidance: pass confirm: true for won/lost because those touch a connected CRM deal, and pass expectedVersion when correcting a prior outcome. It does not say when to prefer this over outcome_history/undo_outcome, so exclusions and alternatives are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_provider_requests_createBook a call on the coach's calendarADestructiveInspect
Book one exact slot from luca_bookings_managed_availability on the coach's Calendly, Cal.com, or Google Calendar, which sends the invite to the lead's email; the lead also gets Luca's booking confirmation. Pass the slot's id, startsAt, endsAt, and timezone as returned by a read of exactly that slot's window, since a slot id is tied to the window it was read in. The answer is usually pending while the provider confirms; read it again with luca_bookings_provider_requests_get. A slot taken in the meantime returns 409 slot_unavailable.
Luca operation: POST /api/bookings/provider-requests Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the invite is emailed to the lead, the lead also receives Luca's confirmation, the response is typically pending, and a race condition returns 409 slot_unavailable. It also restates the confirm:true and idempotency requirements in the flow of the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core booking instruction is front-loaded in the first sentence, and error/retry guidance follows. It is dense and somewhat run-on, particularly the first sentence, but every clause carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world, non-idempotent mutation with an output schema, the description covers the async pending state, the required re-read tool, the conflict error, idempotency, confirmation, and workspace overrides. An agent has everything needed to call and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3, and the description adds real meaning by explaining that slotId, startsAt, endsAt, and timezone must come from a read of exactly that slot's window because the id is tied to the window. It does not explain the leadId/bookingTypeId/inviteeEmail relationship, but those are largely self-evident UUID/email fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (book one exact slot on the coach's Calendly/Cal.com/Google Calendar) and ties it to the exact upstream read (luca_bookings_managed_availability), which differentiates it from siblings like luca_bookings_create and luca_book_call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear sequencing guidance: read the slot's window first, pass the slot fields as returned, then re-read with luca_bookings_provider_requests_get because the answer is usually pending. It does not explicitly contrast itself against luca_bookings_create or luca_book_call, so a sibling choice must still be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_provider_requests_getCheck a calendar bookingARead-onlyIdempotentInspect
Read where a calendar booking request stands. pending_provider turns into confirmed, handoff_required, or failed once the provider answers, and a confirmed request carries the booking id and meeting link.
Luca operation: GET /api/bookings/provider-requests/{id} Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description correctly focuses on adding new information: required scopes (bookings:read, luca:read), redacted data sensitivity, absence of an idempotency requirement, and a state machine describing what a confirmed request returns. This is genuine context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral sentence is front-loaded and reads naturally. The operational block (endpoint, scopes, sensitivity, idempotency, workspace override) is boilerplate but each line carries distinct actionable information for the caller, so there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is not required, yet the description still flags what a confirmed request contains (booking id and meeting link). Combined with scope, sensitivity and workspace-resolution details, an agent has enough to call this correctly; a pointer to the follow-up booking-read tool is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and both workspace parameters carry their own descriptions, so the schema does most of the work. The description adds the meaningful detail that workspaceId/workspaceSlug override the environment-configured default workspace, but says nothing about the required id parameter's semantics beyond the endpoint path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Read where a calendar booking request stands'), which distinguishes it from the booking-reading sibling luca_bookings_get by naming the provider-request state resource. It never explicitly names an alternative tool, so differentiation is implied through terminology rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: it describes the pending_provider → confirmed/handoff_required/failed lifecycle, which tells an agent this is the polling endpoint for a request it already created. However, there is no explicit 'use this when' guidance, no exclusion telling the agent to switch to luca_bookings_get once confirmed, and no mention of the counterpart luca_bookings_provider_requests_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_providers_getGet a booking providerARead-onlyIdempotentInspect
List the event types and calendars in one connected provider account.
Luca operation: GET /api/bookings/providers/{provider} Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds value beyond them: required scopes (bookings:read, luca:read), 'data sensitivity: redacted' for the returned data, and the workspace-override behavior. 'Does not require idempotency' is not a contradiction of idempotentHint=true (it means no idempotency key is needed), though the phrasing is loose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the operational metadata is compressed into short labeled lines. There is mild boilerplate redundancy between 'Required scopes: bookings:read' and 'Required OAuth scope: luca:read', but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value shape needn't be documented, and annotations carry the safety profile. Combined with scopes, sensitivity level, and workspace-override semantics, the agent has enough to invoke it correctly; only the lack of routing guidance relative to sibling list tools leaves a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: both workspace parameters carry their own descriptions, while the required `provider` enum (manual, calendly, cal_com, google_calendar, iclosed, gohighlevel) is undocumented. The description explains the meaning of the workspace override ('the default workspace configured by environment') but adds nothing about the provider enum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource ('the event types and calendars in one connected provider account'), so an agent knows what data comes back. It doesn't distinguish itself from sibling readers such as luca_bookings_providers_list, luca_bookings_types_list, or luca_bookings_calendars_list, and the 'list' framing sits awkwardly against the title 'Get a booking provider'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage instruction is 'Use workspaceId or workspaceSlug to override the default workspace configured by environment,' which is real but narrow guidance. Nothing tells the agent when to call this instead of the providers/types/calendars list tools, so selection guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_providers_listList booking providersARead-onlyIdempotentInspect
List every booking provider, what each can do, and whether this coach's connection is healthy.
Luca operation: GET /api/bookings/providers Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint, so the safety profile is covered. The description adds genuinely new operational context: the underlying GET endpoint, the required bookings:read and luca:read scopes, and the 'redacted' data-sensitivity classification, which matters for an agent reasoning about what it may see.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line, followed by a compact block of endpoint, scope, idempotency and workspace notes. The 'Does not require idempotency' line is the weakest, but the metadata lines are terse and each carries an actionable fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the annotations carry the safety profile. The description still supplies endpoint, auth scopes, data sensitivity and the workspace-override rule, leaving nothing an agent needs to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description goes slightly beyond the schema by explaining that workspaceId/workspaceSlug override a default workspace 'configured by environment', which tells the agent why these params exist rather than just what they are.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource ('List every booking provider') and then extends scope to include capability and connection health, which lets an agent distinguish it from the sibling luca_bookings_providers_get without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the call for enumerating providers and their health, and the last line explains how to override the environment-default workspace. There is no explicit when-to-use versus luca_bookings_providers_get, luca_bookings_provider_sync_retry, or the calendars list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_provider_sync_retryRetry a booking's provider syncADestructiveInspect
Retry a failed write-back to the booking provider. A permanent failure returns 409 rather than retrying forever.
Luca operation: POST /api/bookings/{id}/provider-sync/retry Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing permanent-failure 409 semantics, the idempotency-key generation fallback, required OAuth scopes, data sensitivity, and the confirm: true gate. Annotations already flag destructive/openWorld, and the description adds real operational context on top.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and failure semantics are front-loaded, followed by structured auth and parameter notes. Slightly boilerplate-flavored (scope lines, workspace override) but each line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description covers what an agent needs: what it does, the confirm requirement, idempotency, and the 409 outcome. Only marginally missing is guidance on success side effects or preconditions of the retry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema already documents confirm, workspaceId, workspaceSlug and idempotencyKey. The description mostly restates those in prose (server-generated key, workspace override) without adding format or behavioral detail the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Retry a failed write-back to the booking provider') and names the exact endpoint, making it unmistakable from siblings like luca_bookings_update or luca_bookings_cancel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'retry a failed write-back' clearly scopes when to use it, and the 409 behavior tells the agent when retrying is pointless. It stops short of naming an alternative tool or stating preconditions such as verifying the booking is actually in a failed state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_recovery_getRead a no-show recoveryARead-onlyIdempotentInspect
Read a booking's no-show recovery: whether it is active, paused for review, stopped, or done, which follow-up is next, and when the last one went out.
Luca operation: GET /api/bookings/{id}/recovery Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by declaring required scopes (bookings:read, luca:read), data sensitivity (redacted), and that no idempotency key is needed. Those are auth/safety facts an agent cannot get from readOnlyHint/idempotentHint alone. It adds little about failure modes (e.g. behavior when a booking has no recovery), but the bar is lower given full annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is well front-loaded and dense with useful return-value detail, but the trailing block of operation line, OAuth scope, sensitivity, and idempotency notes is partly boilerplate that repeats annotation territory. Every line is not equally earning its place, though none is harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return shape, and it still describes the fields of interest; params and auth needs are covered. The main omission is how the recovery read relates to the stop sibling and what happens when no recovery exists, but for a simple read this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description compensates by explaining that workspaceId or workspaceSlug override the environment-default workspace, which is more than the schema's 'Optional Luca workspace id override.' The required id is implicitly the booking being read. Enum/format details for id remain schema-only, which is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (a booking's no-show recovery) and then enumerates the exact state values returned: active, paused, stopped, done, plus next follow-up and last-send time. This lets an agent picture the response without opening the schema. It does not explicitly name a sibling (e.g. luca_bookings_recovery_stop), leaving differentiation to be inferred from the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the tool is a read of recovery state and 'Does not require idempotency' hints it can be called freely, but there is no explicit when-to-use or when-not, and no routing to the mutation sibling luca_bookings_recovery_stop. An agent in the bookings-recovery area would pick the right tool, but the definition does not do the routing for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_recovery_stopStop a no-show recoveryADestructiveIdempotentInspect
Stop a booking's no-show recovery so no further follow-up is scheduled. A follow-up already being sent may still arrive. Send recovery.id as recoveryCaseId and recovery.outcomeVersion from luca_bookings_recovery_get; a recovery that changed since that read returns 409 booking_recovery_changed.
Luca operation: POST /api/bookings/{id}/recovery/stop Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond annotations: it warns that a follow-up already being sent may still arrive, documents the 409 booking_recovery_changed conflict, requires an Idempotency-Key for safe retries, and lists required scopes. These details materially improve safe invocation of a destructive, idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, caveat, and parameter mapping, followed by operational metadata. It is appropriately sized for a destructive mutation with conflict handling, though some operational details are dense and could be separated from the core behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the mutation's complexity, nested body, annotations, and output schema, the description provides enough context to call it correctly. It covers the prerequisite read, conflict case, idempotency, workspace override, and required scopes without needing to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains the critical mapping of recovery.id to recoveryCaseId and recovery.outcomeVersion from luca_bookings_recovery_get, and it explains the conflict behavior when the recovery has changed. It also clarifies idempotencyKey and workspace override behavior, adding meaning beyond the nested input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: stopping a booking's no-show recovery so no further follow-up is scheduled. It also names luca_bookings_recovery_get as the source of recovery identifiers, distinguishing this tool from the read operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context and a prerequisite: retrieve recovery.id and recovery.outcomeVersion from luca_bookings_recovery_get before calling. It does not explicitly state when not to use this tool or name an alternative beyond the prerequisite read, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_types_attendeesList a call type's attendeesARead-onlyIdempotentInspect
List the people invited to every call of this type, on top of the lead.
Luca operation: GET /api/bookings/types/{id}/attendees Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds value beyond them by disclosing required scopes, the redacted data-sensitivity level, and that idempotency keys are not required, all of which affect how the call should be made.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The primary operation sentence is front-loaded, followed by compact metadata lines (operation, scopes, idempotency, workspace). Slightly boilerplate but every line carries operational meaning and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a read-only list tool the description covers scope, auth, sensitivity and workspace targeting; the only residual gap is the lack of a stated when-to-use versus the add/remove siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with workspaceId/workspaceSlug documented in the schema and the description reinforcing their purpose as overrides of the environment default. The required id is not explicitly described, but the phrase 'every call of this type' ties it to a call-type id, so semantics are largely clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (List) and resource (people invited to every call of this type), which is precise enough to separate it from its write siblings luca_bookings_types_attendees_add and _remove. The scope note 'every call of this type, on top of the lead' clarifies exactly which attendees are returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies prerequisites (bookings:read, luca:read) and workspace-override guidance, which are useful usage cues, but it never explicitly says when to choose this tool versus the add/remove/update siblings. The read-vs-write distinction is only implied by the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_types_attendees_addAdd a booking type attendeeAInspect
Add a standing attendee to one booking type, so they are invited to every call booked against it. Returns the full attendee list.
Luca operation: POST /api/bookings/types/{id}/attendees Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=false). The description adds real operational context: required scopes (bookings:write, luca:queue_ops), data sensitivity of redacted, the Idempotency-Key requirement with server-side generation fallback, and the fact that the full attendee list is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose sentence before the generated operational block, and every line is actionable (endpoint, scopes, idempotency, workspace override). Slightly dense with boilerplate metadata, but nothing is padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, nested-body tool this covers the essentials: auth scope, idempotency handling, workspace targeting, and the effect on future bookings. With an output schema present it need not describe return values, though the body fields' semantics and duplicate handling remain unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60%, so no automatic baseline applies. The description explains the idempotencyKey and workspaceId/workspaceSlug override behavior, but those are already documented in the schema descriptions, and it says nothing about the nested body fields (email, name, optional) or what the path `id` refers to. It therefore adds little meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Add a standing attendee to one booking type') and then clarifies the semantics that distinguish it: the attendee is invited to every call booked against that type. This separates it cleanly from luca_bookings_types_attendees (list) and luca_bookings_types_attendees_remove, and from per-booking guest handling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the semantic explanation ('standing attendee ... every call booked against it'), so an agent can infer this is for permanent type-level attendees rather than one-off invites. However, there is no explicit when-to-use/when-not, no mention of the remove counterpart, and no guidance on duplicate-email behavior or whether the attendee must already exist as a lead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_types_attendees_removeRemove a booking type attendeeADestructiveIdempotentInspect
Remove a standing attendee from one booking type and get back the ones that are left. Calls already booked keep the invitees they were created with.
Luca operation: DELETE /api/bookings/types/{id}/attendees/{attendeeId} Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| attendeeId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description's extra value is the clarification that already-booked calls retain their invitees — a genuinely non-obvious side effect. It also states the idempotency-key requirement and required scopes. It could go further on irreversibility/restore paths for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The most valuable behavior (booked calls keep invitees) is front-loaded, followed by a compact metadata block. The idempotency sentence repeats the idempotencyKey schema description, a small redundancy against otherwise tight prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotent mutation with an output schema, the description covers effect scope, retry safety, scopes, and workspace override, and notes that remaining attendees are returned. Nothing critical for correct invocation is missing; only explicit alternative routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%; id and attendeeId carry only format/pattern and no descriptions. The DELETE path template ('/api/bookings/types/{id}/attendees/{attendeeId}') materially clarifies what those two required params mean. The workspaceId/workspaceSlug guidance partially duplicates existing schema descriptions but is still useful in context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: remove a standing attendee from one booking type. It also draws a sharp, non-obvious line ('Calls already booked keep the invitees they were created with') that distinguishes it from luca_bookings_types_attendees_add and luca_bookings_types_attendees without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope is clear from 'standing attendee from one booking type,' but there is no explicit when-to-use vs alternatives or prerequisite statement (e.g., how this differs from deleting the booking type). Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_types_createCreate a booking typeAInspect
Define a bookable call: how long it runs, where it happens, and how it looks to the lead. Give it a schedule next — a booking type with no schedule offers no slots and will never appear in availability.
Luca operation: POST /api/bookings/types Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write/destructive/openWorld/idempotent flags, so the bar is lower; the description still adds real behavioral context — required scopes, an Idempotency-Key requirement, and workspace override semantics. This goes beyond the structured annotations, though it doesn't detail what the response returns or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, with the scheduling caveat immediately after, and the operational metadata is kept short. Every block (schedule note, endpoint/scope line, idempotency, workspace) earns its place, though the multi-line metadata is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers the key operational concerns (idempotency, workspace scoping, scope requirements) plus the critical schedule dependency. It remains thin on the complex nested policy objects, but it is adequate for a create tool of this shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema does most of the work; the description echoes workspaceId/workspaceSlug and idempotencyKey which the schema already documents, and loosely maps "how long/where/how it looks" to duration/location/name. It adds little meaning to the large nested agentPolicy/guestPolicy/provider fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Define a bookable call") and characterizes the object's facets (duration, location, appearance), which maps clearly to a create operation. It also references the schedule sibling, hinting at its boundary with luca_bookings_types_schedule, though it doesn't explicitly distinguish itself from types_update or types_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use and a sequencing cue ("Give it a schedule next") plus the consequence of skipping that step (no slots, never appears in availability), which is effectively a when-to-use prerequisite. No explicit when-not or named alternative, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_types_deleteDelete a booking typeADestructiveIdempotentInspect
Remove a booking type and get back the types that are left. Calls already booked against it are not cancelled.
Luca operation: DELETE /api/bookings/types/{id} Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description adds meaningful context beyond them by scoping the blast radius (booked calls survive) and explaining that a key is required but auto-generated if omitted. It does not cover post-delete authorization or partial-failure behavior, keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The sentence that matters — the deletion and its non-effect on existing bookings — is first, and the operational block is compact and scannable. The scope/sensitivity/metadata lines add bulk but are individually informative, not filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover safety, so the description needn't explain return values; it still adds the scope requirement, idempotency contract, and workspace defaulting an agent needs to call it correctly. Minor omission: no note on what happens if the id is unknown or already deleted, which matters for retry reasoning.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 75% schema coverage the schema documents all four parameters, but the description adds behavior the schema can't: that idempotency is enforced server-side and a key is generated when omitted, plus that workspaceId/workspaceSlug override the environment default. That is real value over the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Remove a booking type") and adds the return shape ("get back the types that are left"), which distinguishes it from luca_bookings_types_list/create/update without opening a schema. The DELETE endpoint line reinforces exactly what is being removed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: it says existing booked calls are not cancelled (an important precondition for choosing this over a cancellation tool), and it explains both the idempotencyKey path and the workspace override. It stops short of naming an explicit alternative (e.g., to cancel a booked call use luca_bookings_cancel), so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_types_listList call typesARead-onlyIdempotentInspect
List the call types a booking can use, with their duration and provider.
Luca operation: GET /api/bookings/types Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, and the description usefully adds the required OAuth scopes (bookings:read, luca:read), the redacted data-sensitivity level, and that no idempotency key is needed. That is genuine context beyond the structured fields, though return shape and pagination are left unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by compact metadata lines (operation, scopes, idempotency, workspace override). Nothing is bloated, though the 'Does not require idempotency' line partly restates the idempotentHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't document return values, and annotations cover the safety profile; the added auth scopes, sensitivity, and workspace-default semantics make it sufficiently complete for a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description adds real meaning by explaining that workspaceId/workspaceSlug override the environment-configured default workspace. That default-behavior context is not obvious from the schema's 'Optional ... override' phrasing alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List the call types a booking can use') and even previews the returned fields (duration, provider), so the purpose is unambiguous. However, it never names or contrasts a sibling (e.g., luca_bookings_providers_list or luca_bookings_types_create), so it lands 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the operation name and scopes; there is no explicit when-to-use or when-not-to-use statement, nor a pointer to an alternative tool for related data. The workspace-override sentence is parameter guidance 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.
luca_bookings_types_scheduleRead a call type's scheduleARead-onlyIdempotentInspect
Read a call type's weekly schedule: the hours it can be booked and its time zone.
Luca operation: GET /api/bookings/types/{id}/schedule Required scopes: bookings:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 goes further by disclosing the underlying operation (GET /api/bookings/types/{id}/schedule), the OAuth scope requirement, the redacted data sensitivity, and that no idempotency key is required. Only return-level behavior (what an unconfigured call type yields) 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by short scannable lines for operation, scopes, idempotency and workspace override. No sentence is redundant with another, and the format maps directly onto how an agent decides and calls.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with an output schema, the description needs only to establish identity, auth scope and workspace resolution, all of which are present, and it does not waste words explaining return values. It lacks the one routing sentence that would separate it from availability/schedule-replace siblings, keeping it short of fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema description coverage the schema already documents the two workspace parameters, and the description adds the key semantic the schema lacks: that workspaceId/workspaceSlug are overrides of an environment-configured default workspace. The required id parameter is only named via the URL template, which is a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (Read) and resource (a call type's weekly schedule) plus the payload contents (bookable hours and time zone). It is clearly distinguishable from mutating siblings such as luca_bookings_types_schedule_replace and from luca_bookings_availability, but it never names an adjacent sibling to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies required scopes (bookings:read, luca:read) and the condition under which workspaceId/workspaceSlug should be used, which is useful precondition context. However it never states when to prefer this tool over luca_bookings_availability or the other schedule-related siblings, so the when-to-use guidance remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_types_schedule_replaceReplace a booking type scheduleADestructiveIdempotentInspect
Replace a booking type's schedule outright. Send every rule and override you want to keep — anything left out is dropped, which is also how you clear a day. Read the current schedule first unless you mean to start over.
Luca operation: PUT /api/bookings/types/{id}/schedule Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true, yet the description still adds the crucial operational detail: omitted rules and overrides are dropped, so this is a full overwrite and not a merge. It also discloses the Idempotency-Key requirement and the workspace override behavior, which 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening two sentences are front-loaded and high value, with the destructive consequence stated before the prerequisite. The trailing block is operational boilerplate (operation path, scopes, idempotency, workspace) that is useful but not tightly integrated with the prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, nested-body mutation with 2 required parameters, the description covers the replacement contract, the clearing behavior, the read-first prerequisite, and auth/idempotency requirements. An output schema exists, so return values need not be described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description compensates by explaining the replace semantics of the body arrays ("send every rule and override you want to keep") which is exactly the non-obvious part of the rules/overrides contract. It does not clarify field encoding such as weekday integers or minute offsets, leaving that to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Replace a booking type's schedule outright") and immediately signals total-replacement semantics, which differentiates it from the read sibling luca_bookings_types_schedule and from the partial luca_bookings_types_update. An agent can pick this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Read the current schedule first unless you mean to start over" gives a clear precondition and a clear exclusion, and "how you clear a day" explains the destructive use case. It stops short of naming the sibling tool (luca_bookings_types_schedule) explicitly, so the routing hint is inferential rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_types_updateUpdate a booking typeADestructiveInspect
Update only the fields you send on one booking type. Sending location replaces the whole location, because its shape depends on the type.
Luca operation: PATCH /api/bookings/types/{id} Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing required scopes, data sensitivity, workspace override behavior, idempotency-key requirements, and — most valuably — that `location` is fully replaced rather than merged, which explains the destructiveHint. Minor tension: idempotentHint=false while an idempotency key is required, which could confuse an agent about retry safety, but it is not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the two facts that matter (partial update, location replacement) in a short opening, then a compact metadata block. The idempotency sentence partially repeats the schema's own description of idempotencyKey.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations and an output schema present, the description covers the remaining unknowns an agent needs: auth scopes, workspace scoping, retry key, and the one surprising field behavior. Nothing blocking is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description compensates on the highest-risk parameter by explaining location's replace-not-merge semantics and echoing workspace/idempotency overrides. The deeper nested objects (agentPolicy, guestPolicy) still carry no explanation in either place, so it is not fully compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update only the fields you send on one booking type') and pins down PATCH partial-update semantics. It distinguishes itself from related booking-type tools like delete/schedule by scope, though it never names a sibling directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The partial-update rule ('update only the fields you send') plus the note that sending `location` replaces it wholesale gives real guidance on how to call it. But there is no explicit when-to-use/when-not or routing to alternatives such as create, delete, or schedule_replace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_bookings_updateReschedule or edit a bookingADestructiveInspect
Reschedule or update booking status. A Google Calendar or Cal.com booking changes on that calendar too, and the calendar can email the lead about it.
Luca operation: PATCH /api/bookings/{id} Required scopes: bookings:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing the real-world consequence chain: the change propagates to a connected Google Calendar or Cal.com calendar and the calendar may email the lead. It also explains the idempotency-key behavior (server generates one if omitted) and the confirm-gate rejection, all of which are behavioral details annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the consequence, then broken into scannable labeled lines for scopes, idempotency, confirm, and workspace override. There is mild redundancy, since the confirm requirement is restated from the schema's own description, but every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with an output schema, the description covers side effects, auth/scopes, idempotency, and the confirm gate, which is most of what an agent needs. The remaining gap is mutation semantics on the body: with additionalProperties false, it is unstated whether partial edits clear unset fields, and the status/provider enum usage is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter handling is handled largely by the schema, which documents confirm, workspaceId, workspaceSlug, and idempotencyKey at 67% coverage. The description mentions confirm and idempotencyKey but adds no meaning to the body fields (status enum values, provider, slotAt/endAt, rawPayload, provider*Id), so it neither compensates for the remaining coverage gap nor adds value on top of the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (reschedule / update booking status) and names the concrete endpoint (PATCH /api/bookings/{id}), which distinguishes it from the sibling create/cancel tools in the bookings family. An agent can tell from the first sentence alone what this tool mutates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational context: required scopes (bookings:write, luca:queue_ops), the mandatory Idempotency-Key, the confirm: true gate, and workspaceId/workspaceSlug overrides. It stops short of naming an alternative (e.g., luca_bookings_cancel) or saying when a status change should go through this tool rather than the cancel path, so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_approveApprove a broadcastBDestructiveInspect
Approve a safe broadcast draft and snapshot recipients.
Luca operation: POST /api/broadcasts/{id}/approve Required scopes: broadcasts:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, so the safety bar is partly covered; the description adds real value beyond them by disclosing the required scopes (broadcasts:write, luca:queue_ops), data sensitivity (full_content), the idempotency-key requirement and server-generated fallback, and the recipient-snapshot side effect. It stops short of saying what state the draft must be in or what happens if the preview is stale.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the operational facts follow in short, scannable lines with no filler. The separate 'Required scopes' and 'Required OAuth scope' lines are slightly redundant but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema and annotations exist, so return values and the safety profile need not be restated. However, for a destructive state transition with a nested body object, the description omits the precondition (draft must have a current preview) and the error/re-approval behavior, which an agent needs before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 60% schema description coverage, the description clarifies idempotencyKey behavior and the workspace override precedence, but says nothing about the two required parameters: `id` (which broadcast) and `body.previewVersion` (presumably the version returned by luca_broadcasts_preview, which is the crux of a correct call). The important contract for previewVersion is left entirely to the schema's format/pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Approve a safe broadcast draft') plus the concrete side effect ('snapshot recipients'), which is more informative than the bare title. It does not explicitly distinguish itself from close siblings such as luca_broadcasts_launch or luca_broadcasts_preview, leaving the approve-vs-launch boundary implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when this tool should be chosen over luca_broadcasts_preview, luca_broadcasts_launch, or luca_review_queue_approve. The only usage-level advice is mechanical (supply idempotencyKey for retries, use workspaceId/workspaceSlug to override the default workspace), not decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_cancelCancel a broadcastADestructiveIdempotentInspect
Cancel a draft, approved, running, paused, or failed broadcast.
Luca operation: POST /api/broadcasts/{id}/cancel Required scopes: broadcasts:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true and non-read-only, and the description adds material context beyond them: required scopes, data sensitivity level, the Idempotency-Key requirement with server-side fallback, and the workspace override mechanism. It does not disclose what happens to in-flight or already-sent messages, which is the key irreversibility question for a destructive cancel.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical scope statement is front-loaded in the first line, and each subsequent line carries distinct operational information. The 'Required scopes' / 'Required OAuth scope' / 'data sensitivity' block is somewhat boilerplate-heavy and could be compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-value explanation is correctly omitted, and the description covers auth, idempotency, and workspace scoping for a destructive mutation. The remaining gap is the undocumented cancel reason payload and the absence of any statement about the effect on messages already dispatched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description compensates by explaining idempotencyKey retry semantics and the workspaceId/workspaceSlug override behavior, which the schema only gestures at. The `body.reason` field is left entirely unexplained in both description and schema, which keeps this below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel ... broadcast') plus the exact state set it applies to (draft, approved, running, paused, failed). This clearly separates it from siblings like luca_broadcasts_pause, launch, retry, and approve without needing to inspect their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The enumeration of eligible broadcast states is genuine context that tells an agent whether a given broadcast is cancellable. It stops short of naming alternatives explicitly (e.g., 'use luca_broadcasts_pause to suspend temporarily, resume instead of cancel'), so no exclusion guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_createCreate a broadcastAInspect
Create a broadcast draft. Body requires campaignId and name.
Luca operation: POST /api/broadcasts Required scopes: broadcasts:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses required scopes (broadcasts:write, luca:queue_ops), data sensitivity, the raw endpoint, and the important idempotency behavior — a key is required and the server generates one if omitted, so retries without it are not safe. It does not state side effects of draft creation or any rate limits, which keeps it short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the minimum required body, then grouped operation/scope/idempotency/workspace details on separate lines. Each line carries distinct operational information, though the scope and sensitivity lines are boilerplate-heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and auth/idempotency/workspace targeting are well covered. The gap is the complex nested body: a deeply structured segment object and personalizationMode/canarySize/batchSize parameters are undocumented in prose, and for a broadcast-creation tool those choices materially affect behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema description coverage, the schema already documents workspaceId, workspaceSlug and idempotencyKey, and the description largely restates those. It does mention the two required body fields (campaignId, name) but adds nothing about the semantically heavy optional fields — segment, personalizationMode, batchSize, canarySize — leaving the agent to infer them from structure alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a broadcast draft") and the required body fields, which distinguishes it from luca_broadcasts_launch, luca_broadcasts_approve and luca_broadcasts_preview by scoping it to draft creation. It never names those siblings explicitly, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: creating a draft is evidently the first step before preview/approve/launch, and the workspace override line tells the agent how to target a non-default workspace. There is no explicit when-to-use, when-not-to-use, or pointer to the sibling tools that continue the broadcast lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_getGet a broadcastARead-onlyIdempotentInspect
Get broadcast detail.
Luca operation: GET /api/broadcasts/{id} Required scopes: broadcasts:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so credit goes to what's added: required scopes (broadcasts:read, luca:read), full_content data sensitivity, and the fact that no idempotency key is needed. The workspace-override-by-default behavior is also disclosed, which is genuinely useful pre-call context. Not a 5 because nothing is said about not-found/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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose in the first sentence, then operational facts ordered roughly by importance (endpoint, scopes, sensitivity, idempotency, workspace). It carries some generated-boilerplate feel, but no sentence is wasteful or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description doesn't need to explain return shape, and it correctly focuses on auth scope, sensitivity, idempotency, and workspace resolution. What's missing is edge-case behavior (unknown id) and explicit sibling routing, so it falls just short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the `id` property itself carries no description in the schema; the description compensates by tying it to GET /api/broadcasts/{id}. The workspaceId/workspaceSlug sentence adds real meaning beyond the schema's bare "Optional Luca workspace id override" by explaining they override the environment-configured default workspace.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Get broadcast detail" states a specific verb (get) and resource (broadcast), and the operation line (GET /api/broadcasts/{id}) confirms it is a single-resource fetch keyed by id. It is distinguishable from luca_broadcasts_list by the id-keyed path, though the description never names the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the id-keyed endpoint; there is no explicit statement of when to call this versus luca_broadcasts_list or the lifecycle siblings (approve/launch/pause). The one actionable routing hint is the workspace override sentence, which is parameter-level guidance rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_launchLaunch a broadcastADestructiveInspect
Launch an approved broadcast. Sends messages to live leads.
Luca operation: POST /api/broadcasts/{id}/launch Required scopes: broadcasts:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint/openWorldHint/non-idempotent, and the description goes well beyond them: the approval precondition, the mandatory confirm:true else rejection, the real-world send to live leads, required scopes, data sensitivity of full_content, and idempotency behavior with server-side key generation. That is exactly the behavioral context an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the essential purpose and effect before the operational metadata, and every line carries information. There is mild redundancy, since the idempotency auto-generation is stated here and again in the schema, and the 'Luca operation' and scope lines are boilerplate, but they do not obscure the payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world mutation with an output schema already defined, the description covers everything an agent needs: precondition, gating parameter, idempotency/retry semantics, workspace scoping, and permission requirements. Return values are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% and confirms most properties, so the baseline is 3; the description still adds real meaning by explaining that the call is rejected without confirm:true, that idempotencyKey is for safe retries and is auto-generated when omitted, and that workspaceId/workspaceSlug override the environment default. The bare required 'id' is the only unexplained field, and its name plus uuid format makes it self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (launch) plus resource (broadcast) plus the crucial precondition 'approved' and the observable effect 'sends messages to live leads'. That separates it cleanly from the siblings broadcasts_approve, broadcasts_create, broadcasts_preview, and broadcasts_retry without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear: only an already-approved broadcast may be launched, and the confirm:true gate is spelled out. It stops short of naming the sibling workflow (approve first, retry for failures, pause to halt), so an agent must infer the fuller lifecycle, but the core when-to-use signal is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_listList broadcastsARead-onlyIdempotentInspect
List broadcasts. Query supports limit, cursor, and status.
Luca operation: GET /api/broadcasts Required scopes: broadcasts:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false, idempotentHint=true), so the bar is lower; the description still adds real context beyond them: required scopes (broadcasts:read, luca:read), data sensitivity 'redacted', and the environment-default workspace behavior with an explicit override path. 'Does not require idempotency' is somewhat redundant against idempotentHint=true, but it reads as 'no idempotency key needed' rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: the core purpose is the first sentence, with filters and workspace override following. Some lines are boilerplate metadata ('Luca operation: GET /api/broadcasts', 'Does not require idempotency') that consume space without much decision value, but the whole description is compact and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and pagination behavior (maxPages auto-fetch, truncation, nextCursor) is fully documented in the schema. With auth scopes, sensitivity, workspace scoping and the read-only/idempotent profile all present, an agent has everything needed to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% and the maxPages/workspaceId/workspaceSlug descriptions already live in the schema, so the baseline is 3. The description enumerates the query filters (limit, cursor, status) and adds the meaningful detail that workspaceId/workspaceSlug override the environment-configured default workspace, but it adds no format or bounds information (cursor opacity, limit ceiling, status enum values) beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List broadcasts') and the underlying operation (GET /api/broadcasts), so the agent knows exactly what it does. It does not differentiate itself from the many other list tools in the sibling set (luca_campaigns_list, luca_leads_list, luca_conversations_list) beyond the resource name, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and by the mention of the limit/cursor/status query filters, and there is a useful line about workspaceId/workspaceSlug overriding the environment default workspace. However, there is no explicit when-to-use guidance, no statement of when-not to use it, and no routing to alternatives such as luca_broadcasts_get for a single broadcast.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_pausePause a broadcastADestructiveIdempotentInspect
Pause a running broadcast with an optional operator reason.
Luca operation: POST /api/broadcasts/{id}/pause Required scopes: broadcasts:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description adds genuinely useful operational context the annotations cannot convey: required OAuth scope (luca:queue_ops), data sensitivity level, and the Idempotency-Key requirement including server-side key generation. What is missing is any explanation of why this is destructive — e.g. what happens to in-flight sends and whether the pause can be undone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, followed by dense, scannable metadata lines for endpoint, scopes, sensitivity, idempotency, and workspace override. No filler sentences, though the scope/sensitivity lines read as generated boilerplate rather than tailored guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. Between the description and structured fields, an agent has auth requirements, idempotency behavior, workspace scoping, and the endpoint — everything needed to invoke this call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description compensates well: it characterizes reason as an optional operator reason, explains idempotencyKey retry semantics and the server-generated fallback, and clarifies that workspaceId/workspaceSlug override the environment default. The only gap is the required id, whose meaning (broadcast UUID) is left to the endpoint template.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Pause a running broadcast") plus the operation endpoint, so the agent knows exactly what it does. It does not distinguish itself from the close sibling luca_broadcasts_cancel, which an agent could easily confuse with pause.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word "running" implies a precondition (the broadcast must already be in flight), but that is only inferred. There is no explicit guidance on when to pause versus cancel or retry, even though luca_broadcasts_cancel and luca_broadcasts_retry are direct alternatives in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_previewPreview a broadcastBDestructiveInspect
Refresh broadcast recipient and sample-message preview.
Luca operation: POST /api/broadcasts/{id}/preview Required scopes: broadcasts:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context the annotations do not carry: required scopes (broadcasts:write, luca:queue_ops), data sensitivity full_content, the underlying endpoint, and idempotency-key handling. However, annotations declare destructiveHint=true and the description never explains what is destroyed or side-effected by a 'refresh', and the mention of 'safe retries' sits awkwardly beside idempotentHint=false without reconciliation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then compact labelled lines for endpoint, scopes, and idempotency. Slightly boilerplate-heavy on the workspace override line, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Auth, endpoint, idempotency, and workspace scoping are all covered, and an output schema exists so return values need no explanation. Missing pieces are the sampleSize control and any disclosure of the side effects implied by the destructive annotation, which for a write tool is a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so the description partially compensates: it explains idempotencyKey behavior and how workspaceId/workspaceSlug override the default workspace. It says nothing about the nested body.sampleSize parameter (1-20, default 3), which is the only parameter that actually changes preview output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Refresh broadcast recipient and sample-message preview', which is more precise than the title alone and clearly distinct from launch/approve/pause siblings. It stops short of explicitly contrasting with luca_broadcasts_get, but an agent can tell it is the preview-regeneration call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied (refresh the preview, presumably before approving or launching). There is no statement of when to call this versus luca_broadcasts_get, luca_broadcasts_approve, or luca_broadcasts_launch, and no stated precondition that the broadcast must be in a particular state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_broadcasts_retryRetry a broadcast's failed sendsADestructiveInspect
Retry failed broadcast recipients after operator review. Re-sends messages to leads.
Luca operation: POST /api/broadcasts/{id}/retry Required scopes: broadcasts:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses required scopes (broadcasts:write, luca:queue_ops), full_content data sensitivity, that an Idempotency-Key is required or server-generated, and that confirm: true is mandatory or the call is rejected. Also spells out the real-world consequence in concrete terms (re-sends messages to real leads).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in two sentences, then gives operational metadata in compact labeled lines. Dense but every line carries distinct operational information; a small amount could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world write with an output schema, it covers safety gating, auth scopes, idempotency, and workspace override adequately. The only real gap is the semantics of the optional body fields when overriding failedOnly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 67% schema coverage, the description adds real value by explaining the required confirm gate and idempotency-key behavior as hard requirements, not just field docs. The nested body fields reason and failedOnly are left to the schema alone, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retry) and a narrowed resource scope (failed broadcast recipients), plus the endpoint. That scope distinguishes it from luca_broadcasts_launch and luca_broadcasts_approve, which act on the whole broadcast rather than its failures.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Retry failed broadcast recipients after operator review" gives a clear precondition for when to use it. It stops short of naming an explicit alternative (e.g. relaunching via luca_broadcasts_launch) or exclusion conditions, so it is clear context without full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_cadences_pausePause a lead's cadenceADestructiveIdempotentInspect
Pause (cancel) a lead's running rescue cadence with an optional reason.
Luca operation: POST /api/leads/{id}/cadence/pause Required scopes: cadences:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, yet the description adds genuinely new context: required scopes (cadences:write, luca:queue_ops), data sensitivity marking, and the fact that the server generates an idempotency key when omitted. The notable omission is reversibility — it never says whether a paused cadence can be resumed or what happens to in-flight work, which matters given the destructive hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first line, followed by compact operational metadata. The raw endpoint line ("POST /api/leads/{id}/cadence/pause") is largely redundant but short, and no sentence is wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and annotations already cover the safety/idempotency profile. Still missing for a destructive mutation: whether the pause is reversible, how to resume, and how it differs from the similarly named sibling — all things an agent needs before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%: workspaceId, workspaceSlug, and idempotencyKey are already documented in the schema and the description mostly restates them. It does add that the reason is optional and that `id` refers to a lead, but neither is elaborated, so it only marginally beats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Pause (cancel) a lead's running rescue cadence," which is far more precise than the title alone. However, it offers no differentiation from the near-identical sibling luca_pause_cadence (nor from luca_cadences_rescue_start, its natural inverse), so an agent cannot tell which pause tool to pick from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the operation name; there is no explicit when-to-use/when-not, no mention of resuming or restarting a cadence afterwards, and no disambiguation from luca_pause_cadence. The scope and idempotency notes are prerequisites 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.
luca_cadences_rescue_startStart a silent-lead rescueADestructiveInspect
Enroll silent leads into the multi-day rescue cadence. Starts outbound touches to real leads.
Luca operation: POST /api/cadences/rescue Required scopes: cadences:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds value beyond them: required OAuth scopes (luca:queue_ops), data sensitivity (redacted), the Idempotency-Key requirement and server-generated fallback, and the confirm:true gate. It could still say what the rescue cadence actually sends or how failures surface, but this is solid added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral core is front-loaded in two efficient sentences. The trailing metadata block (operation, scopes, idempotency, confirm, workspace) is dense but each line carries operative information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers scopes, idempotency, confirmation, and workspace scoping for a destructive, nested-body tool. The main remaining gap is routing guidance against the semantically similar rescue/enroll siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema largely documents confirm, idempotencyKey, workspaceId/Slug and leadIds. The description adds genuine meaning only for workspaceId/workspaceSlug ('override the default workspace configured by environment') and repeat the confirm/idempotency notes; it says nothing about cadenceTemplate's light/standard/aggressive options. Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Enroll silent leads into the multi-day rescue cadence') and clarifies the real-world effect ('Starts outbound touches to real leads'). It does not distinguish itself from plausible siblings such as luca_rescue_silent_leads or luca_campaigns_enroll, so it stops just short of full clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance versus alternatives. Given near-duplicate siblings (luca_rescue_silent_leads, luca_campaigns_enroll) and no explanation of which cadenceTemplate to pick, the agent is left to infer selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_backfillBackfill a booking's call eventAIdempotentInspect
Create a call event for a booking that predates automatic creation, then queue its summary. Safe to call twice: an existing call event comes back as is.
Luca operation: POST /api/call-events/backfill/{bookingId} Required scopes: call_events:write Required OAuth scope: luca:draft; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond annotations: it queues a summary as a side effect and returns an existing call event unchanged on repeat calls. These points are consistent with idempotentHint=true and destructiveHint=false, though the idempotency statement itself overlaps with the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and idempotency guarantee are front-loaded, followed by operation, scopes, sensitivity, idempotency-key behavior, and workspace override. The information is dense but every section is relevant to correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the primary mutation, its side effect, idempotency, required scopes, sensitivity, and workspace override; an output schema exists so return values need not be explained. Minor gaps remain around what happens if the booking is ineligible or nonexistent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description mostly restates what the schema already documents for idempotencyKey and workspace overrides. It does not add deeper semantics for bookingId or explain error cases, so the schema remains the primary source of parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a call event for a booking') plus a precise eligibility condition ('predates automatic creation'), which distinguishes it from sibling tools such as luca_call_events_get or luca_call_events_by_booking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when the tool applies: only for bookings that predate automatic call-event creation. It also says the tool is safe to call twice, but it does not name alternative tools or explicitly describe when *not* to use this backfill path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_by_bookingGet a booking's call eventARead-onlyIdempotentInspect
Find the call event attached to a booking. A booking whose call hasn't happened yet returns 404, which is normal.
Luca operation: GET /api/call-events/by-booking/{bookingId} Required scopes: call_events:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| bookingId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, non-open-world. The description adds real value beyond them: the expected 404 when the call hasn't happened, the required scopes (call_events:read, luca:read), full_content data sensitivity, and that idempotency is not required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the key 404 behavior, then the operational metadata. There is mild redundancy in listing 'Required scopes' and 'Required OAuth scope' separately, but nothing is wasted enough to impede use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be described, and the description covers the remaining gaps: the by-booking lookup key, the normal 404, scopes, and workspace overrides. Complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the description adds meaning for the workspace override parameters ('override the default workspace configured by environment'), which the schema only labels as 'Optional Luca workspace ... override.' bookingId is self-evident from name and UUID format, so overall semantics are adequately covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Find') and resource ('the call event attached to a booking'), and the 'by booking' scoping clearly distinguishes it from luca_call_events_get (by id) and luca_call_events_by_lead (by lead). An agent can pick the right retrieval sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: keyed on bookingId, with workspaceId/workspaceSlug overriding the environment default. It also explains the normal 404 case so the agent doesn't treat it as an error. It does not explicitly name when to prefer luca_call_events_by_lead or luca_call_events_get, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_by_leadList a lead's call eventsARead-onlyIdempotentInspect
Read a lead's full call history, oldest first, so a second or third call reads in sequence.
Luca operation: GET /api/call-events/by-lead/{leadId} Required scopes: call_events:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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 still adds real context by disclosing required scopes (call_events:read, luca:read), the full_content data sensitivity level, the ascending order, and the default-workspace override behavior. The 'Does not require idempotency' line is redundant with idempotentHint=true but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in the first sentence, then lists operation/scope metadata compactly. Most lines earn their place, though the idempotency line duplicates the annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations cover the safety profile. Combined with scope, sensitivity, ordering, and workspace-override details, the definition gives an agent nearly everything needed to call it correctly; only explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and both workspace params already carry descriptions, but the description adds the crucial semantic that workspaceId/workspaceSlug override an environment-configured default, which the schema does not explain. leadId's meaning is self-evident from the name and format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read), resource (a lead's full call history), and an ordering guarantee (oldest first) that hints at how it differs from the single-call sibling. It does not explicitly name alternatives like luca_call_events_get or luca_call_events_by_booking, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scenario (reading a lead's sequential call history) implies when to use it, and the workspace override note is actionable, but there is no explicit when-not or named alternative among the call-event siblings. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_feedbackReport how a call wentADestructiveInspect
File the coach's report on how a call went. A completed or no_show outcome also records booking attendance, and a completed call queues its summary. A no_show can start recovery messages to the lead, so it needs the queue_ops grant and confirm: true.
Luca operation: POST /api/call-events/{id}/feedback Required scopes: call_events:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive when outcome is no_show (can start recovery messaging): has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the required OAuth scope (luca:queue_ops), the call_events:write scope, full_content data sensitivity, idempotency-key behavior with server-side generation fallback, and the exact consequence of no_show (outbound recovery messaging to a real lead). This directly confirms and enriches destructiveHint=true rather than repeating it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and well organized, but the no_show/confirm requirement is stated twice (opening paragraph and again in the 'Destructive when outcome is no_show' block), and the confirm sentence largely duplicates the schema description of the confirm property. Tighter consolidation would remove a genuine redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs for a destructive, open-world write with nested body params and an output schema: prerequisite scopes, the single outcome value that triggers side effects, the required confirmation flag, retry semantics, and workspace scoping. Return values are covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage, the description adds real meaning: confirm is tied to a specific outcome (no_show) rather than being a generic gate, idempotencyKey is explained as retry-safety with server fallback, and workspaceId/workspaceSlug are framed as overrides of an environment-configured default. It does not explain rescheduledTo or expectedOutcomeUpdatedAt, which are the least self-evident body fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('File the coach's report on how a call went') and names the concrete record fields (outcome, rating, notes, fields). It implicitly distinguishes from siblings by describing its downstream effects (booking attendance, summary queuing, recovery messaging), but never names an alternative like luca_bookings_outcome_record for an agent to compare against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance per outcome value: completed/no_show also writes attendance, completed queues a summary, no_show requires the queue_ops grant plus confirm:true. It lacks an explicit 'use this instead of X' routing statement against the many sibling call-event tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_getGet a call eventARead-onlyIdempotentInspect
Read one call event: outcome, rating, summary, and CRM sync state.
Luca operation: GET /api/call-events/{id} Required scopes: call_events:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, so the safety profile is covered. The description goes further by disclosing required scopes (call_events:read, luca:read), data sensitivity (full_content), and the absence of an idempotency requirement, which is useful operational context beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first sentence, then lists operation, scopes, idempotency, and workspace override as compact metadata lines. Each sentence earns its place; only minor redundancy in restating scopes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-resource tool with an output schema and full annotations, the description supplies the missing pieces an agent needs: scopes, sensitivity, workspace override, and idempotency status. Return-value detail is correctly omitted since an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the id field is undocumented there, but the description clarifies the purpose of workspaceId/workspaceSlug by explaining they override the environment-default workspace, adding meaning beyond the brief schema text. The core id lookup is implicit in 'GET /api/call-events/{id}'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and singular resource (one call event) and enumerates the salient fields returned (outcome, rating, summary, CRM sync state). The 'one call event' scope cleanly distinguishes it from the sibling list/lookup tools such as luca_call_events_by_booking and luca_call_events_by_lead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating it fetches a single event by id and explains the workspace override, but never explicitly says when to prefer it over alternatives like luca_call_events_by_lead or luca_call_events_feedback. No exclusions or alternative-routing guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_needing_feedbackList calls still needing a reportARead-onlyIdempotentInspect
List calls whose time has passed that still need the coach to say what happened. The post-call work queue.
Luca operation: GET /api/call-events Required scopes: call_events:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive safety. The description adds meaningful non-obvious details: the underlying GET /api/call-events operation, required call_events:read scope, luca:read OAuth scope, full_content data sensitivity, and no idempotency-key requirement. It does not mention rate limits or pagination, but output schema exists so return-format detail is less critical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded with the purpose, followed by compact operational metadata. Every sentence earns its place, though the scopes/idempotency lines make the definition slightly longer than strictly necessary for a simple list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, full parameter descriptions, and an output schema, the definition provides everything an agent needs to select and call this read-only listing: purpose, auth scopes, sensitivity, and workspace override behavior. No critical gap remains 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both optional workspace parameters are documented in the schema. The description adds useful semantics by explaining that workspaceId/workspaceSlug override the default workspace configured by the environment, which is more than the schema's 'optional override' wording, though it does not clarify precedence if both are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (calls whose time has passed and still need coach feedback), plus identifies it as the post-call work queue. It distinguishes the tool by state ('needing feedback') but does not explicitly name sibling alternatives such as luca_call_events_feedback or luca_post_call_queue, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'post-call work queue' label gives clear context for when an agent would reach for this tool: when it needs the queue of completed calls awaiting coach input. However, it names no alternative tools or explicit when-not conditions, so selection guidance is present but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_push_to_crmPush a call to the CRMADestructiveInspect
Send the current summary to the CRM now, without waiting out the review window. Re-pushing updates the existing note.
Luca operation: POST /api/call-events/{id}/push-to-crm Required scopes: call_events:write Required OAuth scope: luca:full; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint=false, but the description adds materially more: the confirm:true gate and that rejection occurs without it, the Idempotency-Key requirement and server-generated fallback for safe retries, required scopes (call_events:write, luca:full), data sensitivity level, and that re-pushing mutates an existing note rather than creating a duplicate. That is meaningful disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence carries the essential behavior and is well front-loaded; the remaining bullets are scannable. Some boilerplate (the destructive explanation) duplicates the confirm parameter's schema description, so it is mildly redundant rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not describe return values, and it covers everything else an agent needs: side-effect nature, confirmation gate, idempotency strategy, auth scopes, and workspace scoping. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% and already documents confirm, workspaceId/Slug, and idempotencyKey, so the description's added value is incremental: it clarifies the override semantics ('default workspace configured by environment') and explains when an idempotencyKey matters for retries. It does not explain the id parameter's role, leaving one gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (send/push) and resource (the current call-event summary to the CRM), plus the key scope distinction: 'without waiting out the review window.' That implicitly separates it from the review-queue approval siblings (luca_review_queue_approve, luca_approve_and_send), though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Send ... now, without waiting out the review window' gives a clear condition for choosing this over the review-queue path, and 'Re-pushing updates the existing note' tells the agent repeat calls are safe-ish. No explicit exclusion or named alternative tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_summary_generateGenerate a call summaryADestructiveInspect
Queue a fresh summary and return straight away. Poll the call event for the result.
Luca operation: POST /api/call-events/{id}/summary Required scopes: call_events:write Required OAuth scope: luca:draft; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: async/queued semantics, the required Idempotency-Key and how to supply it, the required scope (call_events:write), OAuth scope luca:draft, and full_content sensitivity. The one gap is the destructiveHint=true annotation, which suggests an existing summary may be overwritten, but the description never says what is replaced or lost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the two facts that matter most (queues a job, returns immediately), then short scannable lines for operation, scopes, idempotency, and workspace override. Slightly boilerplate-heavy with separate scope/OAuth/sensitivity lines, but every line carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async mutation tool with an output schema (so return values need no explanation), the description covers polling, auth scopes, idempotency, and workspace targeting. The only material omission is whether generating a summary overwrites an existing one, which matters given destructiveHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description reinforces the two override parameters (workspaceId/workspaceSlug) and the idempotencyKey fallback behavior. The required `id` has no schema description, but the 'POST /api/call-events/{id}/summary' line makes clear it is the call event id, filling that gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('Queue a fresh summary') and adds the key behavioral fact that it returns immediately. It is clear what the tool does, though it does not explicitly distinguish itself from the sibling luca_call_events_summary_replace, which an agent would need to choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete operational guidance — call this, then poll the call event for the result — which tells the agent how to use the tool in an async workflow. It stops short of naming alternatives (summary_replace) or stating when not to use it, so no exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_summary_replaceReplace a call summaryADestructiveInspect
Replace the generated summary with the coach's own wording and push it. A summary already in the CRM updates that same note.
Luca operation: PUT /api/call-events/{id}/summary Required scopes: call_events:write Required OAuth scope: luca:full; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint/openWorldHint, but the description adds real value: it discloses that the summary is pushed to the CRM and that an existing CRM note is updated in place (upsert semantics), plus scope requirements (call_events:write, luca:full, full_content), the Idempotency-Key requirement with server-side fallback, and the confirm:true gate. It does not say whether a prior summary is recoverable or what happens on CRM failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the CRM-note behavior before the operational metadata block. Some duplication with the schema: the confirm requirement and idempotency-key behavior appear in both places, which is defensible as a safety restatement but costs a sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers auth scope, data sensitivity, idempotency, confirmation and workspace scoping adequately. Minor gap: no statement of reversibility or what happens to the previously generated summary after replacement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description meaningfully explains confirm, idempotencyKey, workspaceId and workspaceSlug beyond the schema, and the path in the operation line clarifies that id is the call-event id. It adds nothing about the summary body itself (8000-char cap, required, replaces existing content) beyond the phrase 'coach's own wording'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (replace) and resource (generated call summary) plus the downstream effect (push to CRM). It does not, however, name the obvious neighbors (luca_call_events_summary_generate, luca_call_events_push_to_crm) so the agent must infer the boundary from wording alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicit routing is present: 'replace the generated summary with the coach's own wording' suggests use when a human has written their own summary rather than wanting one generated. But there is no explicit when-to-use, no exclusion, and no pointer to summary_generate or push_to_crm, which are directly adjacent siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_call_events_undo_outcomeUndo a call's outcomeADestructiveIdempotentInspect
Clear a mistaken attendance mark and put the call back in the queue. The window is 48 hours from when the outcome was set.
Luca operation: POST /api/call-events/{id}/undo-outcome Required scopes: call_events:write Required OAuth scope: luca:draft; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds context the annotations cannot: the 48-hour reversal window, the exact effect (outcome cleared, call re-queued), the required scope, and the fact that the server supplies an idempotency key if omitted. That is precisely the added behavioral context the dimension asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral core is front-loaded in the first two sentences, and the remaining lines are compact operational metadata. Some of that metadata (the raw POST path) is boilerplate that adds little for an agent but consumes lines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with a one-required-parameter schema, an output schema, and full annotations, the description covers effect, time limit, auth scope, idempotency behavior, and workspace scoping. Nothing an agent needs in order to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema already documents workspaceId, workspaceSlug, and idempotencyKey. The description still adds meaning by explaining the default-workspace behavior that the override parameters modify and by clarifying retry semantics for idempotencyKey beyond the schema's 'stable key' wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and effect: clear a mistaken attendance mark and return the call to the queue, which is far more than a restatement of the name. It does not explicitly distinguish itself from related siblings such as luca_bookings_outcome_record or luca_call_events_feedback, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the triggering condition ('mistaken attendance mark') and a hard eligibility limit ('48 hours from when the outcome was set'), which tells the agent when the tool is applicable. It stops short of naming an alternative to use when the window has expired or when a new outcome should be recorded instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_analyticsRead a campaign's resultsARead-onlyIdempotentInspect
Read campaign attribution and performance analytics.
Luca operation: GET /api/campaigns/{id}/analytics Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered and the description's 'does not require idempotency' line largely restates that. It does add genuinely new context — required scopes analytics:read and luca:read, and 'data sensitivity: redacted' — which is useful for auth/expectation setting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first line and the metadata lines are short and scannable. Minor waste: the idempotency line repeats an annotation and the 'data sensitivity: redacted' phrase is vague, but overall there is little padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the annotations cover safety. The description adds endpoint, scopes, and workspace override behavior, making it broadly callable — the only real gap is the unexplained since/until window parameters that affect the result set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: workspaceId and workspaceSlug are documented in the schema, and the description's workspace override note duplicates them rather than extending them. The undocumented query.since/query.until time-window parameters and the id parameter get no clarification (format, time semantics, timezone), so the description does not compensate for the coverage gap. Baseline 3 for partial coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — reading campaign attribution and performance analytics — and pins it to the concrete endpoint GET /api/campaigns/{id}/analytics. It is clearly distinguishable from generic analytics siblings, though it never names the nearest alternatives (e.g. luca_campaigns_get or luca_analytics_content_attribution).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage instruction (override the default workspace via workspaceId/workspaceSlug), which tells the agent how to run it in a non-default workspace. However, it never states when to prefer this over sibling analytics tools or what happens when id is unknown, leaving tool selection largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_comment_events_listList campaign comment eventsARead-onlyIdempotentInspect
List matched, suppressed, blocked, and replayed comment automation events.
Luca operation: GET /api/campaigns/comment-events Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, but the description adds genuinely useful context beyond them: required scopes (campaigns:read, luca:read) and data sensitivity (full_content), which tells the agent it will be handling sensitive content. The 'Does not require idempotency' note is consistent with, not contradictory to, idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one sentence, followed by compact labeled metadata bullets. No filler, though the operation/scope lines are more boilerplate than tool-specific guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations cover return shape and safety, and auth/sensitivity are disclosed. The notable gap is the entirely undescribed nested `query` filter object, which is the core lever for this listing tool; an agent is left to infer filter semantics from bare property names.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% and maxPages/workspace params are documented in-schema, so the baseline is 3. The description only explains the workspace override and says nothing about the nine nested query filters (status, tokenState, repairState, providerHealth, etc.), which is where an agent would most need semantic guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb (List) and resource (comment automation events) with the four event categories named. It is clearly distinguishable from siblings like luca_campaigns_list or luca_campaigns_enrollments_list, though it never explicitly contrasts itself with the adjacent comment-simulation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The workspace override sentence gives concrete guidance for workspaceId/workspaceSlug, and 'Does not require idempotency' sets a calling expectation. However, there is no guidance on when to reach for this tool versus luca_campaigns_simulations_get or luca_campaigns_comment_simulation_suite_run, and no stated prerequisites beyond the scope line.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_comment_simulation_suite_runRun the comment automation suiteAInspect
Run the Instagram comment-to-DM simulation suite against a campaign. Any campaign that uses comment automation has to pass it before it can publish, so run this before reaching for publish.
Luca operation: POST /api/campaigns/{id}/comment-simulation-suite Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses required scopes, OAuth scope, data sensitivity, idempotency-key behavior, and workspace override behavior. It also explains the gating role in the campaign lifecycle, which is important behavioral context for an agent deciding whether to invoke it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the purpose and the second sentence gives the key lifecycle guidance. The remaining metadata is structured and mostly useful, though the list-like operation/scope lines are slightly dense rather than maximally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, output schema, and a moderately described schema, the description covers the critical invocation context: gating behavior, auth scopes, idempotency, and workspace override. It is not fully complete because autoSend is unexplained, which could matter for a run that potentially triggers comment automation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds useful meaning for workspaceId/workspaceSlug and idempotencyKey, and implies the id is the campaign. However, the nested autoSend parameter is not explained in either the schema or the description, so a meaningful behavioral parameter remains undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: running the Instagram comment-to-DM simulation suite against a campaign. It clearly distinguishes this action from sibling tools like simulations_get, simulations_create, and campaigns_publish by focusing on executing the gating suite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for use: any campaign using comment automation must pass this before publishing, and it explicitly says to run this before reaching for publish. It does not explicitly state when not to use it or compare against the other simulation tools, so it falls short of full 5-level guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_createCreate a campaignAInspect
Create a campaign draft. Body requires name and may include graph.
Luca operation: POST /api/campaigns Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by naming the HTTP operation, the required OAuth scopes, the redaction sensitivity level, and the idempotency contract including server-side key generation. The idempotencyKey guidance complements rather than contradicts idempotentHint=false, clarifying that retries are only safe when a key is supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and requirement, followed by short operational lines. The scope/auth lines are somewhat terse but each carries distinct information; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and auth/idempotency are covered. However, for a tool whose payload is a deeply nested campaign graph with required version/startNodeId/nodes, the description gives no guidance on constructing that body, leaving the highest-risk part of the call unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the top-level parameters are already documented and the description largely restates workspace override and idempotency behavior. The far more complex nested body.graph (16 node types, edges, knowledge, qualification) has no field-level descriptions anywhere, and 'may include graph' does nothing to explain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a campaign draft') and the 'draft' qualifier implicitly separates it from publish/set_status siblings. It does not explicitly name the alternative to use when the agent wants a live or duplicated campaign, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives operational guidance (workspace override, idempotencyKey, required scopes) but never says when to prefer this over luca_campaigns_duplicate, luca_campaigns_generate, or luca_campaigns_publish, nor any precondition such as needing a workspace context first. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_draft_updateEdit a campaign draftBDestructiveInspect
Autosave a campaign draft.
Luca operation: PATCH /api/campaigns/{id}/draft Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations the description discloses the underlying PATCH endpoint, the required campaigns:write scope, and the idempotency-key retry contract (including that the server generates one if omitted). It does not explain the destructiveHint annotation — what gets overwritten, or that expectedDraftUpdatedAt exists as an optimistic-concurrency guard — which matters for a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and reasonably short, but some lines are boilerplate noise for an agent — 'data sensitivity: redacted' and the raw OAuth scope string add little. The most load-bearing sentence for correctness (idempotency) sits after administrative metadata rather than being foregrounded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a 5-parameter tool whose body is a large nested campaign graph and a destructive write annotation, the description leaves the hard parts unaddressed: what 'autosave' does to the existing draft, how expectedDraftUpdatedAt conflicts should be handled, and what a graph must contain. Output schema existence excuses it from describing return values, but not from these gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameters the description touches are idempotencyKey and the workspace overrides, and the schema already describes all three (60% coverage), so the text largely restates structured data. The two required parameters, id and the deeply nested body/graph, receive no explanation, and the concurrency param expectedDraftUpdatedAt goes entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Autosave a campaign draft" gives a specific verb and resource, and the name plus 'draft' naturally separates it from luca_campaigns_publish, luca_campaigns_create and luca_campaigns_versions_list. It stops short of naming any sibling explicitly, and 'autosave' leaves the replace-vs-merge semantics of the body ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'autosave' suggests calling this repeatedly while editing, and the idempotency sentence implies retries are expected. It never says when to prefer luca_campaigns_publish, luca_campaigns_create or luca_campaigns_versions_list, nor are there any exclusions or prerequisites such as needing an existing draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_duplicateDuplicate a campaignAInspect
Copy a campaign into a fresh unpublished draft and leave the original alone. Use it to change a live campaign without touching what is currently running.
Luca operation: POST /api/campaigns/{id}/duplicate Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag it as a non-read, non-destructive, non-idempotent write. The description adds substantive context beyond that: it produces an unpublished draft, the original is untouched, it requires an Idempotency-Key, and it lists required scopes. It also correctly signals non-idempotency implicitly by noting the key is needed for safe retries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the essential purpose and usage in two sentences, then segments operational metadata (endpoint, scopes, idempotency, workspace) clearly. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover the safety profile. The description fills the remaining gaps an agent needs: what is created, that the source is preserved, auth scopes, retry safety, and workspace targeting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema documents most params. The description adds real meaning beyond it by explaining the workspaceId/workspaceSlug default-override behavior ('override the default workspace configured by environment'), which the schema descriptions do not capture; only the idempotencyKey note duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Copy a campaign') plus the exact outcome and scope ('into a fresh unpublished draft and leave the original alone'). This cleanly distinguishes it from siblings like luca_campaigns_create, luca_campaigns_publish, and luca_campaigns_set_status without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use scenario: 'Use it to change a live campaign without touching what is currently running.' That routes the agent well, but it does not name the concrete alternative (e.g., draft_update vs. duplicate) the way a top-tier definition would.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_enrollEnroll leads in a campaignADestructiveInspect
Enroll a lead in the latest published campaign version. Triggers the live campaign's automation for that lead.
Luca operation: POST /api/campaigns/{id}/enrollments Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, openWorldHint=true, so the safety profile is known; the description still adds substantial non-redundant behavior: Idempotency-Key is required and server-generated if omitted, the call is hard-rejected without confirm: true, the write targets a live automation with real-world side effects, and workspace scoping can be overridden. It also lists the exact operation and scopes, none of which appear in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first two sentences and the remainder is densely operational with no filler. It does, however, duplicate the confirm rationale already written verbatim in the confirm parameter's schema description, and the 'Luca operation' line is somewhat boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers scope, confirmation, idempotency, and workspace scoping — everything needed to invoke safely. It omits edge-case behavior (e.g., what happens if the lead is already enrolled, or if the campaign has no published version), which would be the last piece for a tool with this much state mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the two undocumented fields (id, body.leadId) are unlabeled beyond their UUID types; the description partially compensates by clarifying that confirm is a hard gate, idempotencyKey enables safe retries, and workspaceId/workspaceSlug override the environment default. It does not state what id refers to (campaign vs. version), which is the main remaining ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb (enroll), the resource (a lead), and the target scope (the latest published campaign version), then adds the consequence: it triggers the live campaign's automation. That distinguishes it from luca_campaigns_enrollments_list (read), luca_campaigns_publish, and luca_broadcasts_launch without opening any schema. Minor mismatch in grammatical number between the name ('leads') and the description ('a lead') does not impair selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is clear from context — call this when you want a specific lead to start the live campaign flow — and the description supplies real preconditions (confirm: true required, required OAuth scopes, optional workspace override). It does not, however, name an alternative or state when not to use it (e.g., drafting/simulating campaigns, or enrolling into an unpublished version), so it stays at clear-context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_enrollments_listList a campaign's enrollmentsARead-onlyIdempotentInspect
List campaign enrollments.
Luca operation: GET /api/campaigns/{id}/enrollments Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/non-destructive profile, and the description adds genuinely new behavioral context: required scopes (campaigns:read), OAuth scope (luca:read), data sensitivity (full_content), and the workspace override behavior. 'Does not require idempotency' is slightly redundant against idempotentHint but is consistent, not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is short, front-loaded with the purpose, and the metadata lines (operation, scopes, sensitivity) are each one clause. No filler, though the idempotency sentence is arguably dispensable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers auth scopes, sensitivity, and workspace targeting. The main gap is pagination/filtering behavior, which is partially covered by the maxPages schema description but not referenced in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description adds real meaning only for workspaceId/workspaceSlug ('override the default workspace configured by environment'). It says nothing about the limit/cursor pagination parameters, which have no schema descriptions, so the low-coverage half of the parameter set remains undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('List campaign enrollments') and the underlying operation (GET /api/campaigns/{id}/enrollments), so an agent knows exactly what it retrieves. It does not distinguish itself from close siblings like luca_campaigns_enrollments_timeline or luca_campaigns_enroll, which is the only thing keeping 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternative is named. The only usage-oriented sentence is about the workspaceId/workspaceSlug override, which is a scoping detail rather than a selection criterion between this and the enrollments_timeline sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_enrollments_timelineRead an enrollment timelineARead-onlyIdempotentInspect
Read every step one enrollment has been through: what got sent, when, and how the lead responded.
Luca operation: GET /api/campaigns/{id}/enrollments/{enrollmentId}/timeline Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| enrollmentId | Yes | ||
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, non-destructive and closed-world. The description adds genuinely new context: required scope campaigns:read / luca:read, data sensitivity full_content, and explicit workspace override semantics. It doesn't restate the return shape, but the output schema carries that, so this is solid added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by terse, scannable metadata lines (operation, scopes, idempotency, workspace override). No filler, and the most important information leads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required, and the description covers scopes, sensitivity and workspace targeting. For a read-only nested-resource lookup the coverage is nearly complete, with only the identifier semantics left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%; the two workspace params carry schema descriptions while id and enrollmentId do not. The description's workspace-override sentence meaningfully explains workspaceId/workspaceSlug but leaves the two UUID identifiers to inference ('one enrollment'). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: 'Read every step one enrollment has been through: what got sent, when, and how the lead responded.' The scope ('one enrollment' vs. the list-oriented sibling luca_campaigns_enrollments_list) is unambiguous, and an agent can tell what it returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the phrasing ('one enrollment') but the description never states when to choose this over luca_campaigns_enrollments_list or luca_leads_explain, nor any exclusions. It adds only the workspace-override note, which is configuration, not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_generateGenerate a campaign draftAInspect
Build a campaign plan from a brief with fixed rules, not an AI model. Nothing is created or published: create the draft from the plan, review it, and publish it yourself.
Luca operation: POST /api/campaigns/generate Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the plan is produced by fixed rules, nothing is persisted or published, campaigns:write and luca:queue_ops scopes are required, and an Idempotency-Key is mandatory (server generates one if omitted). Nothing about the return payload, but an output schema exists so that burden is covered. There is mild tension between 'nothing is created' and readOnlyHint=false, but it is explainable by the POST/queue semantics and scopes rather than being a clear contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the single most important fact (deterministic plan generation, no side effects), followed by compact operational notes. The 'Luca operation: POST /api/campaigns/generate' line adds little for an agent but is cheap, and the redundant 'Required scopes' / 'Required OAuth scope' pair is slight filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The safety and workflow picture is complete, and the output schema plus annotations cover return shape. However, for a tool whose body contains dozens of nested fields and three mutually dependent modes, the description offers no orientation on when the body must include existingGraph or how prompt/goal interact, leaving a real gap for a complex invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the baseline is 3, and the description does little to raise it — it only restates the workspaceId/workspaceSlug override and idempotencyKey behavior already documented in the schema. The large nested body (goal, mode, source, existingGraph, knowledge) receives no explanation, notably that mode=improve_existing presumably requires existingGraph.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb (build a campaign plan), the resource (campaign), and a key differentiator — deterministic fixed rules rather than an AI model. It implicitly separates itself from luca_campaigns_create and luca_campaigns_publish by stating that nothing is created or published here, though those siblings are never named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lays out the intended sequence: generate the plan here, then create the draft from the plan, review it, and publish it yourself — which effectively tells an agent when this tool is and isn't the right step. It falls short of a 5 because the downstream tools are described by action rather than by name, and no explicit exclusion (e.g. 'to modify an existing plan use X') is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_getGet a campaignARead-onlyIdempotentInspect
Get campaign draft and latest published version.
Luca operation: GET /api/campaigns/{id} Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds genuinely useful context beyond that: required scopes (campaigns:read, luca:read), data sensitivity (redacted), the idempotency-key posture, and the workspace-override behavior. Not a 5 only because it omits anything about error/not-found behavior or payload shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, and the remaining lines are compact operational metadata rather than filler. The trailing endpoint/scope lines are denser boilerplate than prose, but each carries a distinct fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. With that covered, the description supplies the auth scope, sensitivity, idempotency posture, and workspace-resolution rules an agent needs to invoke this correctly. Nothing material is missing for a single-record read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the schema itself documents both workspace parameters. The description adds meaning the schema does not: that workspaceId/workspaceSlug exist to override the environment-configured default workspace, which tells the agent when to supply them. The required id parameter gets no extra prose from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource and even specifies the returned artifacts: 'Get campaign draft and latest published version.' That is well beyond a tautology. It does not, however, differentiate itself from near-neighbors such as luca_campaigns_versions_list or luca_campaigns_list, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and by the operational notes (scopes, idempotency), and the last sentence gives a concrete override instruction for workspaceId/workspaceSlug. But there is no explicit statement of when to call this versus luca_campaigns_list or luca_campaigns_versions_list, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_listList campaignsARead-onlyIdempotentInspect
List campaigns. Query supports limit, cursor, and status.
Luca operation: GET /api/campaigns Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, destructiveHint=false, idempotentHint), so the description's added value is the auth and data-handling context: required scopes campaigns:read / luca:read and "data sensitivity: redacted". That is real disclosure an agent cannot get from the annotations. It stops short of describing rate limits or the shape of the paged result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then a short line on query fields, then operational metadata. Nothing is padded, though the scope/operation boilerplate is procedural rather than decision-useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema (so return values need no prose), the description covers purpose, auth scopes, workspace override, and query surface. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% and the three documented parameters (maxPages, workspaceId, workspaceSlug) already carry full descriptions, including the pagination/truncation contract. The description's "Query supports limit, cursor, and status" merely names the nested fields without explaining what status filters on or what cursor encodes, so it adds little beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("List campaigns") and even names the underlying operation (GET /api/campaigns), so the intent is unambiguous. It does not distinguish itself from sibling campaign tools such as luca_campaigns_get or luca_campaigns_enrollments_list, which is the only thing keeping 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent infers this is the enumeration counterpart to the campaign getters. The one concrete usage note — "Use workspaceId or workspaceSlug to override the default workspace configured by environment" — is helpful context but concerns parameter behavior, not when to pick this tool over an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_provider_capabilitiesCheck what a campaign's channel supportsARead-onlyIdempotentInspect
Evaluate provider capability blockers for a campaign draft.
Luca operation: GET /api/campaigns/{id}/provider-capabilities Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering the read-only/idempotent/non-destructive profile, the description adds genuinely useful context annotations lack: the backing operation, the required campaigns:read scope and luca:read OAuth scope, a redacted data sensitivity level, and the fact that idempotency is unneeded. It stops short of describing the nature of the returned blockers, but that is appropriate given an 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The operative purpose is front-loaded in the first line, followed by compact, scannable metadata lines (operation, scopes, idempotency, workspace override). No filler, though the stack of near-boilerplate metadata lines is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only capability check with an output schema, the annotations carry the safety profile and the description supplies endpoint, auth scopes, and the workspace-override parameter. An agent has enough to invoke it correctly; only an explicit tie-breaker against sibling capability/channel tools is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so the schema already documents workspaceId and workspaceSlug as overrides. The closing sentence explains the override intent (use workspaceId or workspaceSlug to override the environment default), adding modest value, but nothing on the required uuid id or format constraints beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: "Evaluate provider capability blockers for a campaign draft," backed by the concrete endpoint GET /api/campaigns/{id}/provider-capabilities. This clearly separates it from generic campaign reads like luca_campaigns_get, though it does not distinguish itself from other capability-checking siblings such as luca_capabilities_get or luca_channels_features.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to reach for this tool versus alternatives, nor any preconditions such as the draft needing to exist. It mentions that idempotency is not required and how to override the workspace, but neither is usage guidance about selecting this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_publishPublish a campaignADestructiveInspect
Freeze the draft as a new immutable version and point new enrollments at it. Published versions never change, and enrollments against a live campaign reach real leads. Publish is blocked when the target provider cannot do something the campaign needs, so read the provider capabilities first.
Luca operation: POST /api/campaigns/{id}/publish Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new context beyond them: published versions are immutable, live enrollments reach real leads, a capability-gated failure mode, the Idempotency-Key requirement, and scope requirements. Minor redundancy in restating the destructive/confirm behavior that annotations and the confirm schema field already carry keeps it at 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior in the first sentence, and the operational metadata (operation, scopes, idempotency, confirm, workspace override) is compact. Some lines duplicate what annotations and the confirm schema field already state, which trims it below 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers the operation path, required scopes, idempotency behavior, the destructive confirm gate, workspace override, and the provider-capability precondition — everything needed to invoke this tool correctly under its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the baseline is 3. The schema already documents confirm, workspaceId, workspaceSlug, and idempotencyKey; the description's coverage of idempotencyKey ('or the server will generate one') and workspace override largely repeats it. Only 'id' gains meaning, inferred from the documented path POST /api/campaigns/{id}/publish.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+effect: 'Freeze the draft as a new immutable version and point new enrollments at it.' An agent can distinguish this from siblings like luca_campaigns_set_status, luca_campaigns_draft_update, or luca_campaigns_versions_list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition and routes to a sibling: 'Publish is blocked when the target provider cannot do something the campaign needs, so read the provider capabilities first' (luca_campaigns_provider_capabilities). It also states the confirm: true gate. It does not, however, say when NOT to publish or contrast with set_status/draft_update, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_set_statusPause, resume, or archive a campaignADestructiveInspect
Pause, resume, or archive a campaign. A transition that does not make sense for the campaign's current state is rejected rather than forced through.
Luca operation: POST /api/campaigns/{id}/status Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive when status is published (resuming sends): has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, openWorldHint=true) by naming which status is destructive and why (resuming sends to real leads), explaining that the server generates an idempotency key if omitted, noting the confirm rejection behavior, and listing required scopes. This is exactly the extra context annotations alone can't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the state-machine constraint, then operational requirements (scopes, idempotency, confirm, workspace) in short scannable clauses. Little waste despite covering auth, safety, and routing details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be described, and the mutation safety profile is well covered. What's absent is the effect of pausing/archiving on in-flight sends and how this tool relates to the publish and list siblings — material for a destructive, open-world operation with a nested body object.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage, the description usefully adds the semantics behind confirm (real-world side effect gate) and the status values (pause/resume/archive mapping), plus the idempotencyKey retry rationale. The campaign 'id' parameter remains undocumented in both schema and description, which is the main gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set (pause, resume, archive) against a specific resource (campaign), enumerating all three actions up front. It does not, however, distinguish this from the sibling luca_campaigns_publish, even though the status enum here includes 'published' — an agent could reasonably be unsure which tool performs a resume/publish.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage conditions: invalid transitions for the campaign's current state are rejected rather than forced, confirm: true is mandatory for the send-triggering status, and workspaceId/workspaceSlug override the default workspace. Missing explicit routing guidance versus luca_campaigns_publish and luca_campaigns_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_simulations_createSimulate a campaignAInspect
Run a persisted dry-run simulation without sending messages.
Luca operation: POST /api/campaigns/{id}/simulations Required scopes: campaigns:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses that the simulation is persisted, that no real messages are sent, required scopes, OAuth scope, data sensitivity, and idempotency-key behavior. It stops short of explaining what exactly is persisted or how results are consumed, but it adds substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the remaining lines are dense and relevant: endpoint, scopes, idempotency, and workspace override. There is mild redundancy between the scope lines, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the operation, scopes, idempotency, and workspace override, and an output schema exists so return values need not be described. However, the most complex part of the call—the nested simulation body—is left entirely to an undocumented schema, which is insufficient for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning for id, idempotencyKey, workspaceId, and workspaceSlug, but says nothing about the nested body fields: lead, context, maxSteps, eventType, sourceKind, startNodeId, eventPayload, and replayedEnrollmentId. With only 60% schema description coverage and a complex nested body, this leaves a major semantic gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Run a persisted dry-run simulation' for a campaign. It distinguishes the operation from real sending ('without sending messages') and names the underlying POST endpoint, making it clearly different from read/list simulation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the intended use case (dry-run testing without sending messages), but does not explicitly compare alternatives such as luca_campaigns_simulations_get, luca_campaigns_simulations_list, or luca_campaigns_comment_simulation_suite_run. It gives operational prerequisites but not clear when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_simulations_getGet a campaign simulationARead-onlyIdempotentInspect
Get a campaign simulation run with trace.
Luca operation: GET /api/campaigns/{id}/simulations/{simulationId} Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| simulationId | Yes | ||
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: required scopes (campaigns:read, luca:read), data sensitivity of full_content, and the note that idempotency is not required. It does not describe pagination or trace format, but the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the remaining lines are compact metadata (operation, scopes, idempotency, workspace override). 'Does not require idempotency' is somewhat redundant against idempotentHint=true but otherwise the text is efficient and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema is present, return values need not be explained, and the description covers auth scopes, data sensitivity, idempotency, and workspace override. For a read-only GET tool this is close to complete; the only gap is the absence of routing guidance versus sibling list/create tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%. The description adds meaning by mapping the URL path placeholders {id} and {simulationId} to the required parameters, and clarifies that workspaceId/workspaceSlug override the environment default. However, it does not add syntax or constraints beyond what the schema already documents for those two workspace fields, so it adds only modest value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a campaign simulation run with trace') and the singular form distinguishes it from the sibling luca_campaigns_simulations_list. It does not name siblings explicitly, so differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 versus luca_campaigns_simulations_list or luca_campaigns_simulations_create. The only contextual instruction ('Use workspaceId or workspaceSlug to override the default workspace') is parameter usage, not when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_simulations_listList a campaign's simulationsARead-onlyIdempotentInspect
List persisted campaign simulation runs.
Luca operation: GET /api/campaigns/{id}/simulations Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, but the description adds real value beyond them: required scopes (campaigns:read, luca:read), data sensitivity 'redacted', and the underlying HTTP operation. The 'Does not require idempotency' line is slightly redundant against idempotentHint=true but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by compact metadata lines. Mostly efficient, though the 'Does not require idempotency' line adds little and the block reads as a flat list rather than prioritized prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be explained. For a scoped, read-only list operation the description covers auth, sensitivity, workspace override, and the endpoint, leaving little an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60% (workspaceId, workspaceSlug, maxPages documented; id and pagination query object are bare). The description only restates the workspace override behavior already implied by the schema descriptions, adding no syntax or formatting detail to compensate for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List persisted campaign simulation runs.' An agent can distinguish it from the create/get siblings by the 'list' verb, but the description never names those alternatives explicitly, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only prescriptive guidance is 'Use workspaceId or workspaceSlug to override the default workspace configured by environment.' There is no when-to-use-this-vs-get/create guidance, only implied read-only listing context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_campaigns_versions_listList campaign versionsARead-onlyIdempotentInspect
List a campaign's published version history. Published versions cannot change, so this is the record of what actually ran rather than what the draft says today.
Luca operation: GET /api/campaigns/{id}/versions Required scopes: campaigns:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/destructive/openWorld, so the bar is lower; the description adds genuinely new context, namely that published versions are immutable ('cannot change'), the required scopes, and data sensitivity. It does not explain pagination or ordering of the history, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the published-vs-draft distinction, then structured metadata (operation, scopes, idempotency, workspace). Efficient overall, though the scope/idempotency lines read as boilerplate appended to most Luca tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described; the description still supplies scopes, idempotency status, immutability, and workspace override. It is complete enough to call correctly, with only ordering/pagination behavior left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the description adds real meaning beyond it by explaining that workspaceId/workspaceSlug exist to override the environment-default workspace, and the operation line clarifies that the required id is a campaign id. The id parameter's own semantics remain undocumented in both places, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List a campaign's published version history') and immediately scopes it to published versions rather than drafts, so an agent can distinguish it from luca_campaigns_get / luca_campaigns_draft_update without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'this is the record of what actually ran rather than what the draft says today' gives a clear selection rule against the draft-oriented siblings, and the workspace override sentence explains context of use. It stops short of explicitly naming an alternative tool to call instead, so it does not reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_capabilities_getWhat this workspace supportsARead-onlyIdempotentInspect
Describe Luca's public API capabilities, scopes, and boundaries.
Luca operation: GET /api/capabilities Required scopes: leads:read, conversations:read, bookings:read, campaigns:read, broadcasts:read, webhooks:read, integrations:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, non-openWorld), so the bar is lower. The description still adds genuine context beyond them: the full required scopes list, the required OAuth scope, the 'redacted' data sensitivity level, and that idempotency keys are not required. It stops short of describing rate limits or response behavior, which the output schema presumably covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line, followed by clearly delimited metadata lines (operation, scopes, sensitivity, idempotency, override). It is compact and every line carries information, though the terse label-value formatting is more machine-scannable than prose-fluent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers the relevant call-time concerns: auth scopes, sensitivity, idempotency, and workspace override. For a zero-required-parameter read-only discovery tool this is close to complete, with only usage routing left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline would be 3, but the description adds meaning beyond the schema by explaining that both parameters override the default workspace configured by the environment. That context about default behavior is not present in the schema's 'Optional Luca workspace id override' text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Describe Luca's public API capabilities, scopes, and boundaries.' No sibling tool offers a capabilities/discovery function, so an agent can distinguish it immediately, and the underlying operation (GET /api/capabilities) reinforces the read-only discovery purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (a capabilities/introspection call) but there is no explicit when-to-use or when-not guidance relative to the many sibling tools. The only directive, 'Use workspaceId or workspaceSlug to override the default workspace,' is parameter guidance rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_channels_catalogList available channelsARead-onlyIdempotentInspect
List every channel Luca supports and whether it can be connected yet. Availability is per channel, not per coach.
Luca operation: GET /api/channels/catalog Required scopes: channels:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior, and the description adds real value on top: required scopes (channels:read, luca:read), data sensitivity 'redacted', the underlying GET endpoint, and the non-obvious semantics that availability is per channel rather than per coach.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the human-readable purpose, then a compact metadata block (operation, scopes, idempotency, workspace override). Every line is short and earns its place; the metadata lines are terse rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description supplies the operation, scopes, sensitivity, and workspace-override mechanics an agent needs to call it correctly. Only the sibling differentiation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both optional parameters are already documented. The description restates the override purpose ('override the default workspace configured by environment'), which clarifies precedence relative to the environment default but adds little beyond the schema's 'Optional Luca workspace id override'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every channel Luca supports') and adds the meaningful qualifier that it reports connect-ability. It does not explicitly distinguish itself from near-name siblings luca_channels_list, luca_channels_get, or luca_channels_features, so an agent must infer the catalog-vs-list distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the per-channel availability note and the workspace-override sentence suggest a discovery call scoped to a workspace. There is no explicit when-to-use, no when-not, and no named alternative among the four channel siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_channels_featuresList channel featuresARead-onlyIdempotentInspect
List what each provider supports, from sending media to interactive replies, and what still blocks a feature: a permission, a webhook field, or a provider approval. Check this before telling the coach a channel can do something.
Luca operation: GET /api/channels/features Required scopes: channels:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world. The description adds value beyond them: required scope channels:read, the luca:read OAuth scope, redacted data sensitivity, and the semantic meaning of a 'blocked' feature. The line 'Does not require idempotency' sits in mild tension with idempotentHint: true, but it refers to an idempotency key rather than the operation's repeat-safety, so it is not a direct contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the capability-check purpose comes first, then machine-readable metadata (operation, scopes, idempotency, workspace override) in short discrete lines. The scopes/sensitivity boilerplate is compact and each line carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is correctly omitted, and annotations carry the safety profile. Scope requirements, endpoint, and override semantics are present; the only real gap is routing guidance against the many channel and provider-capability siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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's note that workspaceId/workspaceSlug override 'the default workspace configured by environment' adds a small amount of context absent from the schema's 'Optional Luca workspace id override', but it does not clarify precedence when both are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 what each provider supports') and goes further by enumerating the feature domain (sending media, interactive replies) and the blocking conditions (permission, webhook field, provider approval). It does not explicitly differentiate itself from close siblings such as luca_channels_list, luca_channels_get, luca_channels_catalog, or luca_campaigns_provider_capabilities, which is the only thing keeping 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Check this before telling the coach a channel can do something' is a real usage cue — a pre-flight capability check — so guidance is implied and actionable. However, no alternative is named and no exclusion is given, despite a 150+ sibling set containing several channel-related list/get tools the agent must choose between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_channels_getGet a channel accountARead-onlyIdempotentInspect
Read one channel account: status, health, cleanup state after a disconnect, and the actions the coach can take on it. Older rows stay readable by ID.
Luca operation: GET /api/channels/{id} Required scopes: channels:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 what they cannot: required scopes (channels:read, luca:read), the redacted data sensitivity level, the workspace-override behavior, and the retention trait that older rows remain readable. The line "Does not require idempotency" sits slightly awkwardly against idempotentHint=true but refers to idempotency keys, not repeat-safety, so it does not mislead materially.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the resource and its returned fields, then operational metadata in a stable order. Every sentence (scopes, sensitivity, idempotency, workspace override) carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape detail is unnecessary, and the description still names the key fields an agent cares about. Auth scopes, sensitivity, and workspace scoping are all present; the only real gap is not routing the agent away from list/catalog siblings when it doesn't have an ID.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the required `id` parameter has no schema description at all, only a UUID pattern; the description compensates by explaining that the ID addresses a single account and that older/archived rows remain addressable. It also adds the operational meaning of workspaceId/workspaceSlug (overriding the environment-configured default), which the schema's one-line field descriptions do not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Read one channel account") and enumerates what is returned: status, health, cleanup state after a disconnect, and available coach actions. It reads clearly as a single-record read versus list-style siblings, but never names luca_channels_list or luca_channels_catalog as the alternative, so the contrast is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by "Read one channel account ... by ID" and "Older rows stay readable by ID," which suggests fetching a known channel record including archived ones. No explicit when-to-use/when-not, no named alternatives among the many channel siblings, and no prerequisites beyond scope requirements stated as facts rather than guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_channels_listList channel accountsARead-onlyIdempotentInspect
List the coach's current channel accounts, one per provider account, with each one's status, health, and what the composer can send through it. Connecting, pausing, and repairing an account stay in the Luca app.
Luca operation: GET /api/channels Required scopes: channels:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds real value beyond that: required OAuth scope (luca:read), scopes list (channels:read), and data sensitivity (redacted), which an agent needs to reason about the call's constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in the first sentence, followed by the out-of-scope note and operational metadata. Each line carries signal, though 'Does not require idempotency' partially restates the idempotentHint annotation rather than adding new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value details need not be spelled out, and the description still summarizes what each entry contains. Combined with scope, sensitivity, safety annotations, and the workspace-override note, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes beyond the schema by explaining that both workspaceId and workspaceSlug are overrides of an environment-configured default workspace, which adds the semantic that these are optional context switches rather than required inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (channel accounts) with useful scope detail: 'one per provider account, with each one's status, health, and what the composer can send through it.' It's clear and concrete, but it never names a sibling (e.g. luca_channels_get or luca_channels_catalog), so the agent must infer the list-vs-single distinction on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear boundary statement – 'Connecting, pausing, and repairing an account stay in the Luca app' – telling the agent this tool cannot perform channel mutations, and explains the workspace override. It provides solid usage context but does not explicitly point to an alternative sibling when a single account or feature detail is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_channels_set_ai_dm_auto_sendTurn auto-send on or off for a channelADestructiveInspect
Turn Luca's DM auto-send on or off for one channel account. Off puts every Luca draft on that account in the review queue. On lets drafts that pass Luca's safety checks send without review, and also turns on the workspace switch, so every other account with its own switch on starts sending too. Campaign sends follow their own policy. WhatsApp and disconnected accounts answer 404.
Luca operation: PATCH /api/channels/{id}/auto-send Required scopes: channels:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive when enabled is true (lets Luca's replies reach leads without review): has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the cascade side effect ('also turns on the workspace switch, so every other account with its own switch on starts sending too'), the review-queue consequence of disabling, unsupported-account behavior, required scopes, and the confirm/idempotency requirements. This is exactly the extra context destructiveHint=true alone 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core behavior in the first two sentences, then a compact metadata block for operation, scopes, and safety. Slight redundancy where idempotencyKey and confirm are re-explained relative to the schema, but no wasted framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation with cascading, cross-account effects, the description covers the write behavior, the fallback path, the unsupported-channel case, the required confirmation, and the auth scopes. An output schema exists, so return values need not be explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds real meaning to the `enabled` boolean (on = bypass review plus workspace-wide cascade; off = route to review queue) that the bare schema does not. It also restates the idempotencyKey, confirm, and workspace-override semantics, though those are already covered in the schema descriptions at 67% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Turn Luca's DM auto-send on or off for one channel account.' The 'one channel account' scope and the DM-auto-send resource distinguish it cleanly from sibling channel tools like luca_channels_get and luca_channels_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the consequences of each mode ('Off puts every Luca draft on that account in the review queue', 'On lets drafts that pass Luca's safety checks send without review'), and gives explicit boundary cases ('Campaign sends follow their own policy. WhatsApp and disconnected accounts answer 404'). It stops short of naming a sibling alternative to use instead, but the conditional context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_close_call_loopClose the loop on a callADestructiveInspect
File what happened on a call and what it was worth, in one call. Reports attendance on the call event (completed, no_show, rescheduled, or cancelled) and, when an outcome is given, records the booking outcome: won with an amount, lost with a reason id from luca_bookings_outcome_reasons_list, or open with the next follow-up. This tool sends no message to the lead itself, but the records it files start work in the API. Reporting a no_show can start no-show recovery, which schedules a message to the lead when the booking type has recovery on. A completed call queues its summary, which can later sync to the connected CRM. A won or lost outcome queues a CRM deal-stage update, and lost also moves the lead to lost. Pass confirm: true before reporting a no_show or recording a won or lost outcome. Example: { bookingId, attendance: "completed", outcome: "won", amountMinor: 250000, currency: "USD", confirm: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | The coach's notes on the call, stored on the call event. | |
| rating | No | The coach's 1-5 rating of the call. | |
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| outcome | No | The revenue outcome. Leave it off to report attendance only and record the money later. | |
| currency | No | ISO-4217 currency for amountMinor, uppercase. | |
| bookingId | Yes | The booking whose call just happened. | |
| attendance | Yes | What happened to the call itself. | |
| amountMinor | No | Deal value in minor units (cents) when outcome is won. | |
| outcomeNote | No | Note stored on the revenue outcome, separate from notes. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Reuse the same key when retrying this exact report. Both writes are scoped by route, so one key covers the pair. | |
| nextFollowUpAt | No | Required when outcome is open: ISO-8601 follow-up time. | |
| expectedVersion | No | The outcome version you read, when correcting an earlier outcome. A stale version returns 409 with the current one. | |
| followUpTimezone | No | Required when outcome is open: IANA timezone the follow-up is scheduled in. | |
| lossReasonDefinitionId | No | Required when outcome is lost: a reason id from luca_bookings_outcome_reasons_list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (destructiveHint=true, openWorldHint=true, idempotentHint=false) by disclosing exactly what gets kicked off downstream: no_show can schedule a recovery message to the lead, a completed call queues a CRM-syncable summary, won/lost queues a CRM deal-stage update, and lost also moves the lead to lost. It also clarifies the tool itself sends no message — a non-obvious distinction that prevents the agent from wrongly assuming a direct send.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then consequences, then the confirm gate, then an example — a sensible ordering with no filler. It is on the long side for a single tool, but each sentence carries behavioral information the agent could not get from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter mutation with an output schema and full annotation coverage, the description supplies the missing pieces: conditional parameter dependencies, the confirm precondition, the idempotent/retry implication of reusing a key ('one key covers the pair'), and the downstream side effects an agent must warn about. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description adds cross-parameter coupling the schema states only locally: outcome=won pairs with amount, lost pairs with a reason id from luca_bookings_outcome_reasons_list, open pairs with the next follow-up. The worked example payload shows how confirm, attendance, outcome, amountMinor, and currency combine in practice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource pair — filing call attendance plus revenue outcome on a booking — with the scope spelled out (attendance enum, outcome variants, amount/reason/follow-up). It is clear what the tool does, but it never names the nearest siblings it overlaps with (luca_bookings_outcome_record, luca_call_events_feedback, luca_call_events_undo_outcome), leaving the agent to infer which of several outcome-writing tools to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real use conditions: outcome can be omitted to report attendance only and record money later, confirm: true must precede a no_show or a won/lost outcome, and loss reasons must come from luca_bookings_outcome_reasons_list. It sets context well but provides no explicit exclusions or 'use X instead when Y' routing against the many sibling tools in this namespace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_coach_audit_logRead the audit logARead-onlyIdempotentInspect
Read the coach-visible audit trail, newest first, filterable by actor type, action, action prefix, or target. It is the one read that spans every domain, so use it to check what a previous run actually did instead of replaying each list route.
Luca operation: GET /api/audit-log Required scopes: coach:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), yet the description adds real context beyond them: required scopes (coach:read, luca:read), redacted data sensitivity, workspace override behavior, and newest-first ordering. Repeating the idempotency fact adds nothing, but the redaction and scope disclosures are genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads what the tool is, the second adds the routing rationale, and the operational block packs scopes and workspace behavior compactly. Mild waste in restating idempotency already asserted by annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need no explanation, and pagination/truncation behavior is documented in the maxPages schema field. Scopes, redaction, ordering, and workspace override are all covered; the one remaining gap is that actorType/action have no enums or valid-value guidance, so an agent doesn't know what values to pass.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% with the entire nested query object's seven filter fields undocumented, so the description carries meaningful load by naming actor type, action, action prefix, and target as the filterable dimensions, plus the workspaceId/workspaceSlug override. It still doesn't clarify cursor/limit semantics or differ action vs actionPrefix, but it substantially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (read the coach-visible audit trail), specifies ordering (newest first), enumerates the filter dimensions, and carves out a distinct niche as 'the one read that spans every domain' — clear against the many domain-specific list siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use rule: check what a previous run did instead of replaying each list route. The alternative is described as a category ('each list route') rather than a named sibling, and there are no explicit when-not conditions, so it falls just short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_coach_nicheRead the coach's nicheARead-onlyIdempotentInspect
Read the coach's canonical niche, the cohort key their benchmarks are compared against.
Luca operation: GET /api/coaches/niche Required scopes: coach:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the required OAuth scopes (coach:read, luca:read), the data sensitivity level (redacted), and the underlying endpoint. The 'does not require idempotency' line is slightly noisy against idempotentHint=true (it appears to mean no idempotency key is needed), but it is not a real contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, with operational metadata (endpoint, scopes, sensitivity, idempotency) following in short labeled lines. The boilerplate metadata lines are slightly formulaic but each carries actionable information for a constrained read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the description covers auth scope, sensitivity, and workspace targeting. The only missing piece is how this niche read relates to sibling endpoints like luca_coach_niche_profile, which would help an agent avoid picking the wrong one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline would be 3; the description adds real meaning by explaining that workspaceId/workspaceSlug override the default workspace configured by the environment, which the schema alone does not say. It stops short of explaining precedence between the two override parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Read the coach's canonical niche') and adds a clarifying gloss — the cohort key used for benchmark comparison — which tells an agent what the value actually means. It does not explicitly distinguish itself from the nearby luca_coach_niche_profile sibling, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the read to perform when benchmark cohort context is needed. There is no explicit when-to-use/when-not statement and no routing to luca_coach_niche_profile or luca_analytics_benchmarks, which are plausible alternatives for related data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_coach_niche_profileRead the coach's niche profileARead-onlyIdempotentInspect
Read the coach's offer, audience, price range, promised outcomes, disqualifiers, and FAQs. This is the context that decides whether a lead is a fit.
Luca operation: GET /api/coaches/niche-profile Required scopes: coach:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior. The description usefully adds the HTTP operation, required OAuth scopes, and the redacted data sensitivity, which are important context beyond the annotations. It does not describe rate limits or return behavior, but the output schema likely covers the latter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and returned fields are front-loaded, and the operational details are grouped afterward. It is generally tight, though the idempotency line is somewhat redundant with the annotations and the description could be slightly shorter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only tool with only two optional parameters and an existing output schema, the description supplies the necessary operational details: operation, scopes, sensitivity, and workspace override behavior. Its main gap is not clarifying its relationship to similarly named coach niche/profile siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both optional workspace parameters are already documented in the schema. The description adds that they override the default workspace configured by the environment, but it does not clarify precedence if both are supplied, so the added value is modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific read operation and enumerates the exact content returned: offer, audience, price range, promised outcomes, disqualifiers, and FAQs. It does not explicitly differentiate this tool from closely named siblings such as luca_coach_niche or luca_coach_profile, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use context by saying this is the context that decides whether a lead is a fit. However, it does not say when to use this tool instead of related coach-profile or niche tools, nor does it provide exclusions or prerequisites beyond required scopes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_coach_objection_playbookRead the coach's objection playbookARead-onlyIdempotentInspect
Read how the coach wants each objection type handled — price, timing, trust, fit — before drafting a reply to one.
Luca operation: GET /api/coaches/objection-playbook Required scopes: coach:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 non-obvious operational context beyond the annotations: required scopes (coach:read, luca:read), a 'redacted' data sensitivity level, and an explicit 'Does not require idempotency' note, which meaningfully informs callers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and earns its place, immediately telling the agent what the tool returns and when to use it. The remaining metadata lines are boilerplate but compact and each carries distinct operational value, so there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Between the explicit purpose, the workflow trigger, the auth scope requirements, and the workspace-override note, the description gives everything an agent needs to invoke this read-only tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (workspaceId, workspaceSlug) are already documented and the baseline is 3. The description's sentence about using workspaceId/workspaceSlug to override the environment default adds a small amount of intent (these are overrides) but largely repeats what the schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('the coach's objection playbook') and enumerates the exact scope of content: price, timing, trust, fit. An agent can distinguish it from sibling tools like luca_draft_reply or luca_review_queue_objection_variant without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear temporal/usage cue — read this 'before drafting a reply to one' — which tells the agent when in a workflow to invoke it. It does not name concrete alternative tools (e.g., luca_draft_reply) or state exclusions, so it stops short of a full when/when-not/alternatives mapping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_coach_post_call_crm_mappingRead the post-call CRM mappingARead-onlyIdempotentInspect
Read which CRM field each post-call value writes to. Check this before a CRM push to know what will land where.
Luca operation: GET /api/coaches/post-call-crm-mapping Required scopes: coach:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so the safety profile is covered. The description adds auth requirements (coach:read, luca:read), a redacted data-sensitivity marker, the underlying endpoint, and the workspace-override behavior, which is genuine value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and usage condition are front-loaded in the first two clauses, followed by a compact metadata block (operation, scopes, idempotency, workspace override). Every line carries information, though the boilerplate metadata lines are slightly template-like rather than tailored.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read with two optional parameters and an output schema, so return values need not be explained. Purpose, auth, sensitivity, and workspace override behavior are all covered; the only gap is routing guidance relative to the other CRM-mapping siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters already carry descriptions, so the baseline is 3. The description goes further by explaining that workspaceId/workspaceSlug override a default workspace configured by the environment, which clarifies the parameters' purpose beyond the schema's terse 'Optional Luca workspace id override.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read which CRM field each post-call value writes to', which is concrete and unambiguous. It does not, however, distinguish this tool from related siblings such as luca_integrations_crm_mappings_suggest/confirm or luca_coach_post_call_deal_sync, so an agent must infer which mapping tool to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage trigger: 'Check this before a CRM push to know what will land where.' That is a clear context for when to call it, but no exclusions or named alternatives are offered, so the boundary against other CRM-mapping tools remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_coach_post_call_deal_syncRead the post-call deal sync settingsARead-onlyIdempotentInspect
Read the CRM pipeline and the stage each call outcome moves a deal to.
Luca operation: GET /api/coaches/post-call-deal-sync Required scopes: coach:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), and the description adds genuinely non-structured context: required scopes (coach:read, luca:read), that data sensitivity is 'redacted', and the underlying GET endpoint. 'Does not require idempotency' largely restates idempotentHint, but the auth and redaction details are real additions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded: the purpose sentence comes first, followed by a compact operational block. The 'Does not require idempotency' line duplicates the idempotentHint annotation and is the one sentence that does not fully earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with an output schema, an idempotency annotation, and full schema coverage, the description supplies everything needed: endpoint, auth scopes, sensitivity handling, and default-workspace override semantics. Return values are covered by the output schema, so nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description goes beyond the terse schema text by explaining that both parameters override a default workspace configured by the environment. That clarifies the otherwise unstated fallback behavior when neither parameter is supplied, which the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (post-call deal sync settings: the CRM pipeline and the stage each call outcome maps to), which is more concrete than the title alone. It is reasonably distinguishable from related siblings like luca_coach_post_call_settings and luca_coach_post_call_crm_mapping, though it never explicitly says how it differs from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the configuration-inspection tool for post-call deal syncing. The only explicit usage instruction is 'Use workspaceId or workspaceSlug to override the default workspace configured by environment', which is parameter guidance rather than when-to-use/when-not guidance, and no alternative sibling is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_coach_post_call_settingsRead the post-call settingsARead-onlyIdempotentInspect
Read the coach's post-call preferences: what gets summarized, what gets pushed to the CRM, and what the coach fills in themselves.
Luca operation: GET /api/coaches/post-call-settings Required scopes: coach:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value beyond them by disclosing the required scopes (coach:read, luca:read), the 'redacted' data sensitivity, and the underlying GET endpoint, which an agent cannot derive from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line, followed by a compact metadata block (endpoint, scopes, idempotency, workspace override) where each line carries distinct information. Slightly template-like but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read tool with an output schema and full annotation coverage, the description supplies the remaining essentials: auth scopes, sensitivity level, endpoint, and workspace selection. Return values need not be described since an output schema exists; only richer usage guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the baseline is 3, and both parameters are already documented in the schema. The description goes slightly beyond by explaining that these override a default workspace configured by environment, adding the concept of an implicit default that the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read the coach's post-call preferences") and enumerates what the settings cover: summarization, CRM push, and coach-filled fields. This distinguishes it reasonably from generic reads, though it does not explicitly clarify its boundary against the sibling luca_coach_post_call_crm_mapping, whose scope partly overlaps with the 'pushed to the CRM' content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage-oriented sentence is 'Use workspaceId or workspaceSlug to override the default workspace configured by environment,' which is parameter guidance, not when-to-use guidance. No alternatives are named and no precondition or exclusion (e.g., vs crm_mapping or deal_sync) is offered, leaving the agent to infer fit 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.
luca_coach_profileRead the coach's profileARead-onlyIdempotentInspect
Read the coach's account record: name, timezone, business hours, and tone slider. Use it to know when the coach is reachable and how formal they want to sound.
Luca operation: GET /api/coaches/me Required scopes: coach:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), but the description adds genuinely new context: required scopes (coach:read, luca:read) and 'data sensitivity: redacted'. 'Does not require idempotency' is largely redundant with idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and use case in the first sentence, then a compact metadata block. 'Does not require idempotency' duplicates the idempotentHint annotation and is the only wasted line.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only GET with an output schema, complete annotations, documented scopes, and workspace-override semantics, nothing an agent needs to invoke it correctly is missing; return values are properly delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the two workspace parameters are already documented. The description adds the fact that these override a workspace configured by environment, which explains the default behavior the schema does not, though it omits precedence if both are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the coach's account record') and enumerates the returned fields (name, timezone, business hours, tone slider), which functionally separates it from niche/post-call coach tools. It never names a sibling tool, so differentiation is left to inference rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it to know when the coach is reachable and how formal they want to sound' gives a clear motivating context for calling it. There is no explicit when-not guidance or pointer to alternatives such as luca_coach_niche or luca_coach_post_call_settings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_conversations_getGet a conversationARead-onlyIdempotentInspect
Get a conversation with messages and lead context.
Luca operation: GET /api/conversations/{id} Required scopes: conversations:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, and the description adds genuinely new context: required scopes (conversations:read, luca:read) and a 'full_content' data sensitivity label that signals PII exposure. It does not describe response size or message pagination, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by scannable metadata lines. The 'Does not require idempotency' line is marginal for a read operation but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and auth/scoping context is fully covered. What is missing is whether the message history is truncated or paginated in the response, which matters for an agent planning follow-up calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the undocumented parameter (id) is clarified by the path template GET /api/conversations/{id}. The description adds real meaning for workspaceId/workspaceSlug by explaining they override the environment-configured default workspace, which the schema only calls 'optional override'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the payload ('a conversation with messages and lead context'), which goes beyond the name alone. It never explicitly distinguishes itself from the sibling luca_conversations_messages or luca_conversations_list, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the single-id GET semantics; there is no statement about when to use this versus luca_conversations_list or luca_conversations_messages. The only explicit guidance is about workspace override, which is parameter-level rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_conversations_listList conversationsBRead-onlyIdempotentInspect
List recent conversations. Query supports limit, cursor, channel, and q.
Luca operation: GET /api/conversations Required scopes: conversations:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds genuinely useful operational context that annotations do not: required scopes (conversations:read, luca:read), 'data sensitivity: full_content', and no idempotency key requirement. It does not explain pagination/truncation behavior, though the maxPages schema field partially covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the remaining lines are compact, structured metadata. Some lines (e.g., 'Does not require idempotency') add little and could be trimmed, but there is no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the auth/scope/sensitivity details are present. Still missing for a list tool are the sibling disambiguation and the semantics of the undocumented filters (leadId, channelAccountId, externalAccountId), leaving meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema largely documents itself; the description states the query supports 'limit, cursor, channel, and q'. However, the query object also accepts leadId, channelAccountId, and externalAccountId, which the description omits, and it adds no filtering semantics (e.g., what 'q' searches). Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 recent conversations') and names the backing endpoint (GET /api/conversations). It is clear what the tool returns at a high level, but it never distinguishes itself from siblings like luca_conversations_get or luca_conversations_messages, which an agent could easily confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 luca_conversations_get (single conversation) or luca_conversations_messages (message history), and no stated exclusions. The only conditional advice concerns workspace overrides (workspaceId/workspaceSlug), which is parameter 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.
luca_conversations_media_retryRetry a voice-note transcriptionADestructiveInspect
Queue another transcription attempt for a voice note in this conversation. Only re-transcribes; never drafts or sends. A refusal says why: a retry is already running, the limit is reached, or the audio is gone.
Luca operation: POST /api/conversations/{id}/messages/{messageId}/media/{mediaId}/retry Required scopes: conversations:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| mediaId | Yes | ||
| messageId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (destructiveHint=true, idempotentHint=false, openWorldHint=true, readOnlyHint=false) carry the safety profile, and the description adds real substance beyond them: the idempotency-key requirement and server-side key generation, the required scopes, and the enumerated refusal causes. It does not explain what 'destructive' actually means here — whether an existing transcript is replaced or discarded — which is the one gap an agent would care about given destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its negative scope, then failure modes, then operational metadata; nothing is wasted and each block serves a distinct purpose. The Luca operation/scope boilerplate is dense but functional for an agent that must supply a key and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers the risky parts an agent needs: idempotency, scopes, workspace override, and failure modes. The only missing piece is the effect on any existing transcription, given destructiveHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so the three required UUIDs (id, messageId, mediaId) have no schema descriptions; the description compensates by spelling out the REST path template, which maps each required id to conversation/message/media. It also explains idempotencyKey fallback behaviour and the workspaceId/workspaceSlug override, though much of that duplicates existing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Queue another transcription attempt for a voice note') and scopes it to the conversation context, which an agent can act on. It does not, however, distinguish itself from near-neighbours in the sibling list such as luca_review_queue_media_retry or luca_conversations_partial_send_retry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Queue another transcription attempt' implies the trigger condition (a prior attempt failed or is unusable), and 'Only re-transcribes; never drafts or sends' rules out send/reply tools. But there is no explicit when-to-use statement, no routing to an alternative (e.g. the review-queue media retry), and the three refusal conditions are consequences rather than pre-call guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_conversations_messagesRead a conversation's messagesARead-onlyIdempotentInspect
Page backward through a thread's older messages, for threads longer than the window the conversation read returns.
Luca operation: GET /api/conversations/{id}/messages Required scopes: conversations:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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 real context beyond that: required scopes, 'data sensitivity: full_content', the workspace-override behaviour against the environment default, and pagination/truncation semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in the first sentence, followed by compact operational facts (endpoint, scopes, idempotency, workspace override). No sentence is filler, though the scope/sensitivity lines are somewhat boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and the description still notes truncation/nextCursor behaviour. Combined with the scopes and workspace-override notes, an agent has enough to call it correctly; only the query-parameter semantics are thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60%, so the baseline is 3. The description adds useful meaning for workspaceId/workspaceSlug (they override the environment-configured default workspace), but says nothing about the 'before' or 'limit' query parameters, leaving part of the coverage gap unfilled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('page backward through older messages') and resource (a thread's messages), and immediately scopes it to threads longer than the window returned by the conversation read, which distinguishes it from sibling luca_conversations_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear condition for use ('threads longer than the window the conversation read returns'), which implicitly routes the agent away from luca_conversations_get. It does not explicitly name that sibling or spell out when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_conversations_partial_send_retryRetry unsent message partsADestructiveInspect
Retry only the parts of a partially sent message that are known not to have reached the provider.
Luca operation: POST /api/conversations/{id}/messages/{messageId}/retry Required scopes: conversations:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| messageId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety bar is lowered. The description adds real value beyond that: required OAuth scopes (conversations:write, luca:queue_ops), data sensitivity, the server-side idempotency-key generation fallback, and the fact that the call is rejected without confirm. It does not, however, describe what partial-failure state is left behind or revocation semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the following lines are short, scannable operational facts (endpoint, scopes, idempotency, confirm, workspace override). Some lines duplicate structured metadata (e.g. endpoint and the confirm requirement also appear in the schema), which is minor waste but not egregious.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained. For a destructive, scope-gated tool the description supplies scopes, idempotency, confirm, and workspace override — nearly everything an agent needs to invoke it correctly. Only deeper failure/reversibility semantics are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so the baseline is 3. The description restates what the schema already documents for idempotencyKey (auto-generation when omitted) and confirm, and adds the workspace override intent, but it does not clarify the required id/messageId beyond the UUID schema, leaving marginal added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retry) and a precise resource scope ('only the parts of a partially sent message that are known not to have reached the provider'), which clearly separates it from luca_conversations_send and luca_conversations_messages. The endpoint annotation 'POST /api/conversations/{id}/messages/{messageId}/retry' reinforces what it operates on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for use: retry only the unsent portions of a partially delivered message, and the description states the precondition for safe retries (idempotencyKey) and the mandatory confirm: true. It does not explicitly name alternatives (e.g. luca_conversations_send for full resend) or when-not-to-use it, so it falls short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_conversations_reply_failure_dismissDismiss a failed replyADestructiveIdempotentInspect
Close a failed reply the coach has given up on, so it leaves the thread on every device. Sends nothing. Dismissing twice changes nothing.
Luca operation: POST /api/conversations/{id}/reply-failures/{failureId}/dismiss Required scopes: conversations:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| failureId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description reinforces these with concrete meaning: removal propagates to every device, nothing is sent, and repeat dismissal is a no-op. It also surfaces auth requirements (conversations:write, luca:queue_ops) and data sensitivity. The only gap is whether dismissal is recoverable/undoable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the human-meaningful behavior in two short sentences, then cleanly separated operational metadata (endpoint, scopes, sensitivity, workspace override). No sentence is redundant with the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers scope, idempotency, cross-device effect, and workspace override. It is slightly incomplete in not noting recoverability or pointing to the retry alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: workspaceId/workspaceSlug already have their own descriptions, which the description largely repeats. The description does not explain the two required params directly, though the embedded POST path 'conversations/{id}/reply-failures/{failureId}/dismiss' implicitly disambiguates id as the conversation and failureId as the reply failure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (close/dismiss) and resource (a failed reply) plus the observable effect: it leaves the thread on every device. The phrase 'the coach has given up on' implicitly separates it from retry siblings, but no sibling is named, so differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'the coach has given up on' implies when to dismiss rather than retry, and 'Sends nothing' rules out confusion with send tools. However, it never names the alternative (luca_conversations_reply_failure_retry) or states any when-not-to-use condition, leaving the agent to infer the routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_conversations_reply_failure_retryResend a failed replyADestructiveInspect
Send a reply the coach wrote that failed to go out, under the key it first went out with, so the lead never gets it twice. Only a failure that is safe to repeat can be retried. Sends a real message.
Luca operation: POST /api/conversations/{id}/reply-failures/{failureId}/retry Required scopes: conversations:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Does not require idempotency. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| failureId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, openWorldHint=true and idempotentHint=false, but the description adds real context beyond them: duplicate-delivery protection via the original key, the confirm:true gate with rejection on omission, and the required scopes (conversations:write, luca:queue_ops) plus data sensitivity. This is more than the annotations convey, though it does not describe what happens to the failure record after a successful retry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the duplicate-safety guarantee come first, before the metadata block. The subsequent lines (operation, scopes, sensitivity, idempotency, destructive/confirm, workspace override) are terse and each carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world mutation with an output schema, the definition covers safety gating, scopes, workspace scoping and the duplicate-delivery guarantee, which is close to everything needed to call it correctly. The only gap is what a non-retryable failure looks like at call time, which an agent would learn from the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 60% (id and failureId have no descriptions), so the description must compensate, and it does: the endpoint path implies id is the conversation and failureId the reply failure, the confirm gate is explained in context, and the workspaceId/workspaceSlug override behavior is stated. It stops short of defining the two UUIDs explicitly, so the agent relies on path inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: resend a reply the coach wrote that failed to deliver, and names the mechanism (reuse the original send key). That distinguishes it clearly from the sibling operations luca_conversations_reply_failure_dismiss, luca_conversations_partial_send_retry and luca_conversations_media_retry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('only a failure that is safe to repeat can be retried'), which tells the agent when this is valid, and the framing 'a reply the coach wrote that failed to go out' pins down the scenario. It does not explicitly name the alternative tools (dismiss, partial-send retry, media retry) for cases that don't qualify, so routing still requires a small inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_conversations_sendSend a message to a leadADestructiveInspect
Send a message to the lead on their channel right away. This is the one conversation tool that reaches a real person without a reviewer seeing the message first, which is why it needs an explicit confirm. Prefer drafting into the review queue unless the coach has asked for this message to go out now.
Luca operation: POST /api/conversations/{id}/send Required scopes: conversations:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds the crucial trait that isn't in them: this path reaches a real person with no reviewer in between, which is why confirm:true is mandatory and rejected otherwise. It also surfaces the required scopes, the idempotency-key retry contract, and the workspace override, all of which change how an agent calls it. The 'safe retries' wording sits next to idempotentHint=false, but that describes server-side dedupe via the key rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral core is front-loaded in two tight sentences before any boilerplate, and the operational metadata (endpoint, scopes, sensitivity) is compact and skimmable. Nothing in the prose is redundant with itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and annotations cover the safety profile, the description is nearly complete for a destructive send: routing, confirmation, and retry safety are all present. The only real gap is the un-explained rich message payload, which an agent must reverse-engineer from the union schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the description covers the top-level semantics well (id, confirm, idempotencyKey, workspaceId/workspaceSlug). However, the hardest parameter — the deeply nested `body.outboundContent` with its text/media/interactive/template union — gets no explanation at all, leaving the highest-risk input undocumented in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Send a message to the lead on their channel right away") and immediately contrasts itself with the review-queue path, so an agent can distinguish it from luca_review_queue_approve / luca_approve_and_send without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both the when ("unless the coach has asked for this message to go out now") and the when-not ("Prefer drafting into the review queue"), plus the reason the gate exists. The routing decision is fully specified rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_conversations_send_statusCheck whether a reply was acceptedARead-onlyIdempotentInspect
Look up a manual reply by the idempotency key it was sent with, to learn whether the API accepted it for sending before you send it again. accepted means it is queued to go out, not that it was delivered; not_found means no accepted send exists under that key.
Luca operation: GET /api/conversations/{id}/send-status Required scopes: conversations:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| query | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior; the description adds meaningful context that accepted means queued for sending rather than delivered, and not_found means no accepted send exists. It also notes scopes and that the tool itself does not require idempotency, which is useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The operational purpose and status semantics are front-loaded, followed by compact scope and workspace notes. Every sentence adds practical context without unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description does not need to detail return values and covers the important status meanings, scopes, and workspace override. The main remaining gap is explicitly defining the id parameter in relation to the conversation path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description clarifies the idempotency key lookup and the workspace override, but it does not explicitly explain the required id path parameter as the conversation/reply identifier. With schema description coverage at 50%, it partially compensates but leaves the main id parameter underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation: looking up a manual reply by idempotency key to learn whether the API accepted it for sending before resending. It clearly distinguishes this status check from the act of sending again and defines the key status semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to use it: before sending a reply again, to verify whether the prior send was accepted. It also defines accepted versus not_found, but it does not explicitly name alternative sibling tools such as luca_conversations_send or retry tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_draft_replyDraft a reply for a leadADestructiveInspect
Draft a reply for a lead, written the way the coach writes, and put it in the SetLuca review queue, where it waits for the coach to approve it. Drafting again replaces this lead's earlier unapproved draft from this tool. It never sends, whatever the channel's auto-send setting. Optional guidance steers tone or content. Example: call with { leadId, guidance: "keep it short and warm" }.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead to draft a reply for. | |
| guidance | No | Optional steer for tone or content of the draft. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Reuse the same key when retrying this exact draft. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and non-idempotent, and the description adds real context beyond them: the queued-for-approval lifecycle, that re-drafting overwrites this lead's earlier unapproved draft from this tool, and that it never sends regardless of the channel's auto-send setting. It does not address the idempotencyKey retry semantics or whether drafting is asynchronous, which sibling drafting-status tools suggest is relevant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each doing distinct work: what it does, the overwrite rule, the never-sends guarantee, and the guidance example. The queue destination is front-loaded and nothing is repeated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mid-complexity mutation with an output schema, it covers the essential agent questions: where the draft goes, that it is not sent, and what happens on repeat calls. Gaps remain around asynchronous drafting behavior, idempotencyKey retry usage, and workspace override semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description earns a step up by including a concrete invocation example with leadId and guidance, showing how optional guidance is actually phrased. It adds little about workspaceId/workspaceSlug overrides or idempotencyKey, leaving those to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (draft a reply for a lead), plus the destination (SetLuca review queue) and the voice model (the way the coach writes). However, it never distinguishes itself from near-identical siblings like luca_leads_draft or luca_review_queue_drafting, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear — this feeds the coach review queue rather than sending — and the sentence about re-drafting replacing the earlier unapproved draft gives a useful re-invocation rule. But there is no explicit when-to-use/when-not guidance and no named alternatives (e.g., regenerate, drafting status) to route against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_find_leadsFind leadsARead-onlyIdempotentInspect
Search the coach's leads by free-text query and optional channel. Use this to locate a lead before drafting, booking, or flagging. Example: call with { query: "maria instagram" } to find Maria's Instagram lead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10). | |
| query | Yes | Free-text search: name, handle, or keyword. | |
| channel | No | Optional channel filter. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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 only that search is free-text over the lead set with an optional channel narrowing, and says nothing about result size, ordering, or no-match behavior. With annotations carrying the safety profile, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, plus a concrete call example. Nothing is padded, though the example slightly restates the query/channel semantics already implied by the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and a read-only lookup tool does not require permission or side-effect disclosure. The definition is complete for its complexity; only the missing sibling disambiguation keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are documented in the schema and baseline is 3. The example ('maria instagram' matching Maria's Instagram lead) usefully illustrates that the query spans both name and handle and can combine with channel, but it does not extend beyond what the schema already declares.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search the coach's leads) and adds scope: free-text query plus optional channel filter. It does not distinguish itself from close siblings like luca_leads_list or luca_leads_get, so an agent still has to infer which lead-lookup tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real workflow context ('locate a lead before drafting, booking, or flagging'), which tells the agent when in a sequence to reach for it. It stops short of naming an alternative (e.g. luca_leads_list) or stating exclusions, so the routing guidance is clear but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_flag_for_humanFlag a lead for human attentionAInspect
Add a note to a lead, tagged [needs-human], that the coach sees on the lead's timeline. This is an ordinary note with a prefix — it does not route, alert, or reprioritize anything. Use when a conversation needs judgment an agent should not exercise (payment claims, distress, legal), and tell the coach directly if it is urgent. Example: call with { leadId, reason: "lead mentioned a refund dispute" }.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead to flag. | |
| reason | Yes | Why a human should look — shown to the coach verbatim. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Reuse the same key when retrying this exact flag. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, but the description adds the critical semantic clarification that despite the name 'flag_for_human' this only writes a prefixed note and does NOT route, alert, or reprioritize. That single sentence prevents a serious misreading of the tool's effect and is exactly the value-add annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: what it does, what it does not do, when to use it, and a concrete example. Front-loaded with the clarifying negative constraint before the usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and annotations carry the safety profile. Combined with the explicit effect description, usage triggers, and example, an agent has everything needed to call this correctly and interpret its effect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 five parameters, including that 'reason' is shown to the coach verbatim. The description's example call reinforces leadId/reason usage but adds no syntax or format detail 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (add a note to a lead, tagged [needs-human], visible on the timeline) and immediately distinguishes itself from routing/alerting siblings by clarifying it is 'an ordinary note with a prefix — it does not route, alert, or reprioritize anything.' An agent can tell exactly what happens without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use criteria ('a conversation needs judgment an agent should not exercise') with concrete trigger categories (payment claims, distress, legal), plus an escalation instruction ('tell the coach directly if it is urgent'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_insights_dismissDismiss an insightADestructiveIdempotentInspect
Dismiss one insight the coach does not want to act on. Use this rather than leaving it unread forever.
Luca operation: POST /api/insights/{id}/dismiss Required scopes: insights:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds genuine context beyond the annotations: required scopes (insights:write, luca:draft), redacted data sensitivity, a mandatory Idempotency-Key with server-generated fallback, and workspace override semantics. What it never states is reversibility, which matters given destructiveHint=true and the existence of a restore sibling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and selection hint lead, operational metadata follows in short labeled lines. The Luca operation, scopes, and sensitivity line are compact and each carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be described, and the description covers auth, idempotency, and workspace targeting. The remaining gap is effect semantics — whether a dismissed insight can be recovered — which is the one thing an agent deciding to call a destructiveHint tool most needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so baseline is 3. The description restates the idempotencyKey and workspace override behavior already documented in the schema, and adds nothing about the required `id` — the one parameter the schema leaves as bare format/pattern with no description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Dismiss one insight" gives a specific verb plus resource, and "the coach does not want to act on" scopes intent. It never names its closest siblings (luca_insights_mark_read, luca_insights_mark_actioned), so the agent must infer the distinction between dismissing, reading, and actioning an insight.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this rather than leaving it unread forever" gives a reason to call it, but only relative to doing nothing. The real decision an agent faces is dismiss vs. mark_read vs. mark_actioned, and none of those alternatives are mentioned or excluded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_insights_mark_actionedMark an insight actionedADestructiveIdempotentInspect
Record that the thing an insight asked for was actually done. Use it after doing the work, not instead of it.
Luca operation: POST /api/insights/{id}/action Required scopes: insights:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/idempotency profile, but the description adds real context beyond them: the underlying POST endpoint, required insights:write scope, OAuth scope luca:draft, and redacted data sensitivity. It still leaves the destructiveHint=true behavior unexplained — nothing says what prior state is overwritten when an insight is re-actioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence and the 'after the work' caveat are front-loaded and earn their place; the operational metadata block is compact. Minor redundancy between the Idempotency-Key requirement line and the schema's idempotencyKey description keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and auth scope, idempotency and workspace override are all covered. What is missing is the re-action/already-actioned behavior and any indication of what the destructive hint implies for the insight record.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and all three optional parameters already carry descriptions, so the schema does most of the work. The description's idempotencyKey guidance and workspace override note largely restate what the schema already says, adding no format or fallback detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Record that the thing an insight asked for was actually done' — an agent can tell this is the actioned-state mutation on an insight, distinct from the neighboring mark_read and dismiss tools. It stops short of naming those siblings explicitly, so the differentiation is inferred from the name rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it after doing the work, not instead of it' gives a clear positive condition and a warning against misuse as a substitute for the underlying work. It does not name the alternatives (luca_insights_mark_read, luca_insights_dismiss) or say what to do when the insight was only partially completed, so exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_insights_mark_readMark an insight readADestructiveIdempotentInspect
Mark one insight read, so it stops coming back at the top of the feed.
Luca operation: POST /api/insights/{id}/read Required scopes: insights:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the auth/scoping requirements (insights:write, luca:draft), the redaction sensitivity level, the idempotency-key requirement with server-side fallback, and workspace override precedence. That is meaningful operational context. It falls short of 5 because it never explains what state change actually occurs or whether the mark can be undone, which matters given destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first line is well front-loaded, but it is followed by a boilerplate block of endpoint, scope, sensitivity, idempotency and workspace lines, several of which restate the schema or annotations. It reads as generated scaffolding rather than curated guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the annotations cover mutability and idempotency. The remaining gap is conceptual: nothing explains how 'read' differs from 'dismiss' or 'mark actioned' among the sibling tools, which is the main thing an agent needs to choose correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema already carries most parameter meaning and the baseline is 3. The description reinforces idempotencyKey behavior and clarifies that workspaceId/workspaceSlug override the environment-configured default, which is genuinely additive, but it says nothing about the required 'id' or how the two workspace selectors interact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Mark one insight read") plus the observable effect ("stops coming back at the top of the feed"). That is clear, but it does not distinguish itself from close siblings like luca_insights_dismiss or luca_insights_mark_actioned, so an agent must infer the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The outcome clause implies the usage scenario (clearing an insight from the feed), which is enough context to act. However, there is no explicit when-to-use vs. when-not guidance and no reference to the dismiss/actioned alternatives that clearly overlap with this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_insights_settings_getRead alert delivery settingsARead-onlyIdempotentInspect
Read which insight alerts reach the coach and how. Before the coach changes anything this returns the defaults, so it never 404s. Check it before concluding a quiet feed means nothing is happening, since alerts may be muted.
Luca operation: GET /api/insights/settings Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses that the endpoint returns defaults and never 404s, that alerts may be muted, required OAuth scopes, data sensitivity, and workspace override behavior. These details materially improve an agent's ability to use the tool correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the useful usage context and then lists operation metadata. It is generally efficient, though the line about idempotency is somewhat redundant with the annotation and the metadata block is more verbose than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, annotations, and simple two-parameter schema, the description is complete. It explains the tool's purpose, usage timing, return-default behavior, auth requirements, and workspace override semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description adds meaning by explaining that workspaceId or workspaceSlug override the default workspace configured by the environment, which is more than the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific read operation and resource: reading insight alert delivery settings and how alerts reach the coach. It is clearly distinguishable from sibling tools such as luca_insights_settings_update without needing to inspect the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: use it before the coach changes anything, and check it before concluding a quiet feed means nothing is happening because alerts may be muted. It does not explicitly name luca_insights_settings_update as the write alternative, but the surrounding context makes the selection clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_insights_settings_updateUpdate alert delivery settingsADestructiveIdempotentInspect
Merge-patch the coach's alert-delivery settings. Send only what you are changing; anything left out keeps its current value.
Luca operation: PUT /api/insights/settings Required scopes: insights:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses required scopes ('insights:write', 'luca:draft'), data sensitivity ('redacted'), idempotency-key behavior, and merge-patch semantics. These details add substantial operational context not captured by the structured annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core merge-patch instruction and is generally efficient. The operation path, scope lines, and idempotency note are useful but somewhat boilerplate; they earn their place for transparency but add length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, output schema, and nested input schema, the description covers all essential invocation details: merge semantics, required scopes, idempotency handling, and workspace override. Nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema description coverage, the schema already documents workspaceId, workspaceSlug, and idempotencyKey. The description adds important meaning for the body parameter by explaining merge-patch behavior ('send only what you are changing'), which is not evident from the schema's nested object structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Merge-patch the coach's alert-delivery settings.' This clearly identifies the operation and distinguishes it from the read-only sibling luca_insights_settings_get, which retrieves rather than patches settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: 'Send only what you are changing; anything left out keeps its current value.' It also explains workspace override and idempotency key usage. However, it does not explicitly name alternatives or state when not to use this tool versus settings_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_insights_unread_countCount unread insightsARead-onlyIdempotentInspect
How many insights the coach has not read yet. Cheap enough to poll before pulling the whole feed.
Luca operation: GET /api/insights/unread-count Required scopes: analytics:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld=false/idempotent/destructive=false, so the safety profile is covered. The description adds material context beyond them: required scopes (analytics:read, luca:read), data sensitivity 'redacted', and the fact that no idempotency key is required. This is useful operational context not present in the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The human-readable purpose leads, then a compact metadata block covers operation, scopes, idempotency, and workspace override. Every line carries information, though the boilerplate-style metadata block is somewhat verbose relative to the tiny operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is rightly omitted, and annotations cover the safety profile. The description supplies scopes, sensitivity, cost/polling guidance, and parameter fallback semantics, so an agent has what it needs to call it correctly; only explicit sibling routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes slightly beyond the schema by explaining that workspaceId/workspaceSlug override 'the default workspace configured by environment,' which clarifies the fallback behavior the schema alone does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a precise verb + resource: 'How many insights the coach has not read yet.' That is unambiguous and clearly distinct from the mutation siblings (mark_read, dismiss, mark_actioned). It does not explicitly name an alternative, but the count-vs-mutate distinction is evident.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Cheap enough to poll before pulling the whole feed' is a genuine when-to-use hint, and the workspace-override note gives a calling condition. However, no sibling is named as an alternative (e.g. versus luca_analytics_insights or the full feed tool), so guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_connectors_listList available connectorsARead-onlyIdempotentInspect
List Zapier, Make, and CRM provider capabilities.
Luca operation: GET /api/integrations/connectors Required scopes: integrations:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world, so the safety bar is low. The description adds substantive context beyond that: the underlying REST operation, the required scopes (integrations:read, luca:read), redaction sensitivity, and idempotency expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then a compact block of operational facts. Mostly economical, though 'Does not require idempotency' is slightly redundant against the idempotentHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shapes need not be described, and annotations cover the safety profile. Combined with the auth/scope and workspace-override details, the description is largely complete; only explicit sibling routing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description earns an extra point by explaining that both optional params override a default workspace configured by the environment, a behavior the schema ('Optional Luca workspace id override') does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (connectors), and names the concrete providers covered: Zapier, Make, and CRM. This lets an agent distinguish it from luca_campaigns_provider_capabilities or luca_integrations_crm_connections_list without opening those schemas, though it never explicitly contrasts with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 mention of alternative sibling tools that also list integration data. The only directive ('Use workspaceId or workspaceSlug to override...') is parameter mechanics, not usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_connections_createCreate a CRM connectionADestructiveIdempotentInspect
Create or update a workspace-scoped CRM connection.
Luca operation: POST /api/integrations/crm/connections Required scopes: integrations:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent and destructive, so the safety profile is covered; the description adds auth scopes, data-sensitivity level (redacted), and the idempotency-key fallback behavior. It does not disclose what an 'update' does to existing settings or credentials on a re-call, which is the main remaining behavioral unknown for a destructive upsert.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the following lines are terse labeled facts (operation, scopes, idempotency, workspace), with no filler. Slight boilerplate feel from the scope/operation lines, but each carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation with an output schema and full annotations, the description covers auth, idempotency, and workspace targeting adequately. The notable omission is acquisition of credentialsRef and update-vs-replace semantics for the nested body.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 75% schema description coverage the schema already documents workspaceId/workspaceSlug/idempotencyKey; the description only adds the fact that overriding targets the environment-default workspace. The credential material — the credentialsRef pattern and the provider enum — is never explained, and it is unclear where a valid credentialsRef comes from.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Create or update a workspace-scoped CRM connection' gives a specific verb pair and resource with scope qualifier, so the operation is unambiguous. It doesn't name or differentiate itself from nearby siblings such as luca_integrations_crm_connections_list, _health, _disconnect, or _schema, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies real preconditions: required scope integrations:write, OAuth scope luca:full, and that an Idempotency-Key is mandatory (with a server-generated fallback). It never states when to pick this tool over luca_integrations_crm_oauth_url or the connection-list/health siblings, so routing guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_connections_disconnectDisconnect a CRMADestructiveIdempotentInspect
Disable a CRM connection and clear the credentials Luca holds, which stops every sync with that CRM until the coach connects it again. Saved mappings and event history stay. It does not revoke access on the CRM's side.
Luca operation: POST /api/integrations/crm/connections/{id}/disconnect Required scopes: integrations:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses exactly what is destroyed (credentials) versus retained (mappings, event history), the resulting state (all syncs stopped until reconnect), the confirm:true gate with rejection on omission, the Idempotency-Key behavior including server-side generation, and required scopes. This is consistent with destructiveHint=true and idempotentHint=true rather than merely restating them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first paragraph is front-loaded with the semantic payload and the operational lines (endpoint, scopes, idempotency, confirm, workspace override) are scannable. It is slightly long, with some redundancy between the prose and the schema's parameter descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive connection-mutation tool, everything an agent needs is present: effect, reversibility path, retention of data, confirmation requirement, retry safety, permissions, and workspace override. An output schema exists, so return values need no explanation here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3. The description largely echoes the schema's own text for confirm and idempotencyKey; the only genuine addition is that workspaceId/workspaceSlug override a default workspace set by the environment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Disable a CRM connection and clear the credentials Luca holds') plus the concrete consequence ('stops every sync with that CRM until the coach connects it again'). It also bounds the effect ('Saved mappings and event history stay', 'does not revoke access on the CRM's side'), which distinguishes it from a sibling like luca_knowledge_sources_disconnect and from any CRM-side revocation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope of use is clear: this is the tool for halting syncs while preserving configuration, and the note that it does not revoke CRM-side access implicitly points at when a different action is needed. However, no alternative sibling tool is named (e.g., reconnect/health/sync-run tools) and no explicit 'use when / don't use when' routing is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_connections_healthCheck a CRM connection's healthAInspect
Probe CRM provider health.
Luca operation: POST /api/integrations/crm/connections/{id}/health Required scopes: integrations:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false; the description adds real value on top by disclosing required scopes (integrations:write, luca:full), data sensitivity (redacted), and that an Idempotency-Key is mandatory with server-side generation as fallback. This clarifies the write-scoped nature of a 'probe' that could otherwise be mistaken for a read-only call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line, followed by compact metadata lines for endpoint, scopes, idempotency, and workspace override. Each line carries distinct information, though the raw 'Luca operation: POST ...' line is somewhat internal-facing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers the operational essentials an agent needs: auth scopes, idempotency requirement, and workspace targeting. A brief note on what 'unhealthy' means or on failure modes would make it fully complete, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema coverage the baseline is near 3, and the description meaningfully extends it: it explains that idempotencyKey enables safe retries and is auto-generated if omitted, and that workspaceId/workspaceSlug override the environment-configured default workspace. That adds semantics beyond the terse schema descriptions, though 'id' itself remains unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Probe CRM provider health') that an agent can map directly to the connection identified by the required 'id'. It is distinguishable from neighbors like luca_integrations_crm_connections_list or luca_analytics_crm_sync_health by name and scope, though it never explicitly contrasts itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives operational prerequisites (scopes, idempotency, workspace override) but no guidance on when to reach for this probe versus alternatives such as luca_analytics_crm_sync_health or luca_integrations_crm_connections_schema. There is no when-to-use or when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_connections_listList CRM connectionsARead-onlyIdempotentInspect
List CRM connections.
Luca operation: GET /api/integrations/crm/connections Required scopes: integrations:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/non-destructive/openWorld profile, so the bar is lower, and the description still adds real context: required scope integrations:read, OAuth scope luca:read, and data sensitivity 'redacted'. 'Does not require idempotency' is consistent with idempotentHint=true (no key needed) rather than a contradiction, but the phrasing is slightly ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation summary, then structured metadata lines (operation, scopes, idempotency, workspace override) that are all actionable. Minor redundancy between 'Required scopes' and 'Required OAuth scope' lines, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-param list tool with an output schema (so return values needn't be explained), it covers auth, workspace resolution, and idempotency. What remains thin is explicit differentiation from adjacent integration tools, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both optional params. The description adds meaning beyond the schema by explaining these are overrides for 'the default workspace configured by environment,' clarifying the fallback behavior the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List CRM connections') and reinforces it with the concrete endpoint GET /api/integrations/crm/connections. The 'List' verb naturally distinguishes it from siblings like connections_create, connections_health, and connections_schema, but the description never explicitly names or contrasts those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one usage hint – use workspaceId or workspaceSlug to override the environment default – but offers no explicit when-to-use/when-not guidance or routing to alternatives such as connections_health or connections_schema. Usage is implied by the resource name rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_connections_schemaRead a CRM's field schemaCIdempotentInspect
Discover CRM provider schema.
Luca operation: GET /api/integrations/crm/connections/{id}/schema Required scopes: integrations:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=false and idempotentHint=true, but the description describes a GET/read operation and says "Does not require idempotency." These conflict with the annotation signals, creating a serious ambiguity about whether the operation is read-only and idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and operation are front-loaded, followed by scopes and workspace override details. The description is reasonably compact, though the idempotency line is contradictory and does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Auth scopes, data sensitivity, and workspace override behavior are covered, but missing usage guidance and annotation contradictions leave material gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, with the required id parameter lacking a schema description. The description's endpoint path implies id is the CRM connection id, and the workspace note adds default-workspace override behavior beyond the schema, but it does not fully explain the required id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Discover CRM provider schema," reinforced by the GET endpoint path for a connection's schema. The resource is distinct from sibling integration tools, though the description does not explicitly contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 siblings such as connection health, list, or mappings. The only operational guidance is about workspace overrides and auth scopes, not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_connections_webhooks_setupSet up a CRM's webhooksBDestructiveInspect
Configure CRM provider webhook status.
Luca operation: POST /api/integrations/crm/connections/{id}/webhooks/setup Required scopes: integrations:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and idempotentHint=false, and the description reinforces the destructive confirmation gate plus idempotency-key behavior. It also adds scopes (integrations:write, luca:full) and sensitivity, which the annotations do not carry. It does not explain the actual side effect (sending workspace events to an outside URL, overwriting existing webhook registration), which is the information an agent most needs before a destructive setup call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then short labeled metadata lines. Efficient overall, though the operation path/scopes/sensitivity block is templated boilerplate; the confirm sentence largely duplicates the confirm property description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. Still, for a destructive setup with a nested body, the description omits whether existing webhook configuration is replaced, what a successful setup registers, and what the body fields mean — gaps an agent may hit at call time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description spends its parameter-related words restating fields the schema already documents (confirm, idempotencyKey, workspaceId/Slug). The operationally important body fields — targetUrl and enabled — get no explanation anywhere, so the description fails to compensate for the coverage gap on the payload that defines the webhook.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource: configuring CRM provider webhook status via a specific endpoint. 'CRM provider webhook' implicitly distinguishes it from Luca's own webhook tools (luca_webhooks_subscriptions_*), but the description never names those siblings, and 'configure status' is softer than saying it registers/updates the outbound webhook target on the CRM connection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no alternatives named. The agent must infer on its own whether a CRM connection already needs to exist, whether this replaces existing webhook config, or whether luca_webhooks_subscriptions_create is the right sibling for a different goal. The workspace-override sentence is parameter help, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_mappings_confirmConfirm CRM field mappingsCDestructiveIdempotentInspect
Confirm CRM field mappings.
Luca operation: PUT /api/integrations/crm/connections/{id}/mappings Required scopes: integrations:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description usefully adds the required scopes, the redacted data-sensitivity note, the idempotency-key retry behavior, and workspace override mechanics. What it omits is the meaningful consequence of a destructive confirm — whether existing mappings are replaced or merged, and whether the effect is immediate on live sync.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line and the remaining lines are dense operational facts with no filler. It reads as a compact header block rather than prose, but nothing is redundant enough to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and auth/idempotency context is solid. Given a destructive mutation with a nested 5-field payload including a `dangerous` boolean and a direction enum, the description should say what confirming actually does to existing mappings — that gap matters more than the missing field docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60% and the description only covers idempotencyKey and workspaceId/workspaceSlug, whose semantics are already spelled out in the schema. The core payload — the mappings array with lucaField, providerField, direction enum, transform, and the significant `dangerous` flag — gets no explanation at all, leaving the most consequential parameter undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ("Confirm CRM field mappings") and ties it to PUT /api/integrations/crm/connections/{id}/mappings, which pins down the operation. However, "confirm" is never unpacked — it is unclear whether this persists suggested mappings, replaces existing ones, or merely flags them approved. It also does not distinguish itself from the sibling luca_integrations_crm_mappings_suggest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 the sibling suggest tool or the connections/schema tools; the natural workflow (suggest → confirm) is left entirely implicit. The only usage-shaped content is operational (idempotency key, workspace override), not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_mappings_suggestSuggest CRM field mappingsBIdempotentInspect
Suggest CRM field mappings.
Luca operation: POST /api/integrations/crm/connections/{id}/mappings/suggest Required scopes: integrations:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly=false, destructive=false, idempotent=true, openWorld=false), and the description adds real context on top: required scopes (integrations:write, luca:full), data sensitivity marked 'redacted', and server-side idempotency-key generation for safe retries. It still doesn't say whether calling this persists suggestion state on the connection or whether prior suggestions are replaced, which matters for a POST.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then a compact block of operation/scope/idempotency/workspace facts with no filler. The endpoint path and scope lines are terse and scannable; nothing is wasted, though the raw path is mildly redundant with the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be described, and the annotations plus scope lines cover the safety profile. But for a suggest/confirm pair inside a CRM integration, the description omits the crucial next step (what to do with the suggestions, i.e. luca_integrations_crm_mappings_confirm) and whether suggestions persist, leaving a workflow gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already explains workspaceId, workspaceSlug and idempotencyKey. The description only adds the 'override the default workspace configured by environment' nuance for the workspace params; the required `id` parameter (the CRM connection UUID) is never explained in either place. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Suggest CRM field mappings') and pins it to a concrete operation (POST /api/integrations/crm/connections/{id}/mappings/suggest). An agent knows what it does, but nothing distinguishes it from the close sibling luca_integrations_crm_mappings_confirm, which is presumably the follow-up that applies these suggestions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: no prerequisites, no mention that suggestions must be confirmed via luca_integrations_crm_mappings_confirm, and no indication of what a caller does with the result. The scopes and workspace-override lines describe requirements, not usage selection, so the agent must infer the suggest-then-confirm workflow on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_oauth_urlStart a CRM connectionAInspect
Create a CRM provider OAuth URL and store its one-time state.
Luca operation: GET /api/integrations/crm/providers/{provider}/oauth-url Required scopes: integrations:write Required OAuth scope: luca:full; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| provider | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and the description adds valuable context beyond them: required API scopes (integrations:write), required OAuth scope (luca:full), data sensitivity (redacted), and that it does not require idempotency while persisting one-time state. This is meaningful behavioral disclosure for a security-sensitive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose sentence, followed by clearly labeled operation/scope/idempotency/workspace lines. Slightly list-like boilerplate but each line carries real information and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and scopes/idempotency/workspace handling are covered. It still leaves the OAuth-relevant locationId and redirectUri parameters unexplained, which an agent invoking a connection-start flow would need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: provider is self-documenting via its enum, and workspaceId/workspaceSlug already carry schema descriptions matching the description's override note. The description does not compensate for the undocumented query sub-parameters locationId and redirectUri, which are critical to an OAuth flow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Create a CRM provider OAuth URL and store its one-time state" names a specific verb (create) and resource (CRM provider OAuth URL), and the side-effect of storing one-time state is explicit. It distinguishes this connection-starting step from siblings like luca_integrations_crm_connections_create, though it does not name those siblings directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage context (kick off a CRM OAuth connection) and gives one concrete rule: use workspaceId/workspaceSlug to override the environment default. However it offers no when-to-use-vs-alternatives routing, no prerequisites, and no exclusions relative to the many sibling integration tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_sync_runs_createPreview a CRM syncAInspect
Record a dry-run preview of the changes a CRM sync would make, as a new sync run. Nothing is written to the CRM: the API refuses a live sync.
Luca operation: POST /api/integrations/crm/connections/{id}/sync-runs Required scopes: integrations:write Required OAuth scope: luca:full; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: required scope integrations:write, luca:full OAuth scope, full_content data sensitivity, server-side idempotency key generation, and the hard refusal of live mode. One mild tension with annotations: idempotentHint=false sits awkwardly beside 'Provide idempotencyKey for safe retries', since a stable key is what makes retries idempotent – worth flagging but not a genuine contradiction, as the tool does create a durable run record (consistent with readOnlyHint=false).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical fact – nothing is written to the CRM – is front-loaded in sentence one, and the operational metadata is packed into short labeled lines rather than prose. The scopes/sensitivity block is slightly verbose for an agent that may not act on it, but every line carries usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return shape needn't be described, and annotations plus the description together cover safety, auth scopes, idempotency, and workspace targeting. The only real gap is the body.direction enum (luca_to_crm / crm_to_luca / bidirectional), which is neither explained here nor in the schema, so the agent must guess its effect on the preview.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description compensates for the most consequential gap: the body.mode enum offers 'live', but the description states the API refuses a live sync, so the agent knows only dry_run will succeed. It also explains idempotencyKey behavior (server generates one if omitted) and the workspaceId/workspaceSlug override purpose, matching the schema's own parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource – record a dry-run preview as a new sync run – and immediately resolves the tension with the tool name 'create' by asserting nothing is written to the CRM. That clearly separates it from the read-side sibling luca_integrations_crm_sync_runs_list, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for use – previewing the changes a sync would make before committing – and an explicit constraint that live mode is refused by the API. It does not name alternatives (e.g. the list or health siblings) for inspecting existing runs, so usage is clear but not fully disambiguated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_crm_sync_runs_listList CRM sync runsARead-onlyIdempotentInspect
List CRM sync history.
Luca operation: GET /api/integrations/crm/connections/{id}/sync-runs Required scopes: integrations:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world. The description goes beyond that by disclosing the required scopes, the data sensitivity level (full_content), and explicitly that idempotency is not required — useful auth and side-effect context not present in the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the plain-language purpose, then a compact block of operational metadata (endpoint, scopes, sensitivity, idempotency, workspace override). Each line carries distinct information; no redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema, the description covers the essentials: what it returns conceptually, the endpoint, auth requirements, and the workspace override. Return-value detail is correctly left to the output schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents workspaceId and workspaceSlug, but the description adds the operative meaning: they override the default workspace configured by the environment. That is real semantic value beyond the schema's terse "Optional Luca workspace id override." The `id` parameter's role (the connection id in the path) is only implied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"List CRM sync history" gives a clear verb and resource, and the Luca operation line pins the exact endpoint GET /api/integrations/crm/connections/{id}/sync-runs. It is distinguishable from the sibling luca_integrations_crm_sync_runs_create by tense/purpose, though the description never explicitly contrasts them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states required scopes (integrations:read, luca:read) and that idempotency is not required, and notes the workspace override. These are prerequisites rather than when-to-use/when-not-to-use guidance, and no alternative tool is named for listing sync history versus other integration diagnostics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_integrations_events_listList integration eventsARead-onlyIdempotentInspect
List integration event log.
Luca operation: GET /api/integrations/events Required scopes: integrations:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, but the description adds genuinely new behavioral context: required scopes (integrations:read, luca:read) and data sensitivity level (full_content). The "Does not require idempotency" line largely restates idempotentHint=true, so it adds little, but the auth/scope disclosure is valuable beyond the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded, with the resource named in the first sentence and operational metadata in tight bullet-style lines. The idempotency line is redundant against the annotations, which is the only wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values and truncation/pagination semantics need not be re-explained, and the description covers auth scopes, sensitivity and workspace scoping. The main missing piece is disambiguation from the other event/log listing tools, which is a sibling-routing gap rather than a correctness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so limit, cursor and source are already documented structurally; the description adds only the workspace-override semantics for workspaceId/workspaceSlug (clarifying that they supersede the environment default). That is a modest but real addition over the schema's "Optional Luca workspace id override," matching the baseline 3 for a high-coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 integration event log") and even names the underlying operation (GET /api/integrations/events), so the agent knows exactly what it retrieves. It does not, however, differentiate itself from the closely named sibling luca_webhooks_events_list, which an agent could easily confuse with an 'integration events' log.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage instruction is "Use workspaceId or workspaceSlug to override the default workspace configured by environment," which is really parameter guidance rather than when-to-use guidance. There is no explicit statement of when to pick this over webhooks_events_list or the CRM sync-runs siblings, so selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_knowledge_reject_suggestionReject a knowledge suggestionADestructiveIdempotentInspect
Reject a profile suggestion so it stops being offered. The profile is left as it stands.
Luca operation: POST /api/knowledge/suggestions/{id}/reject Required scopes: knowledge:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description is not obligated to restate safety. It nonetheless adds real value: that the profile is preserved, the required scopes (knowledge:write, luca:queue_ops), data sensitivity redaction, and the Idempotency-Key requirement with server-side fallback.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and invariant are front-loaded in the first two sentences, followed by structured metadata lines. Slight redundancy between 'Required scopes' and 'Required OAuth scope' lines, but overall tight and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the description covers scope, idempotency, and workspace targeting. Minor gap: no mention of behavior when the suggestion is already rejected or the id is unknown.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the description compensates for the remaining gap by explaining that workspaceId/workspaceSlug override the environment default and that idempotencyKey enables safe retries. Only the uuid 'id' parameter is left to the schema, which handles it clearly with format and pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reject a profile suggestion') plus the outcome ('stops being offered') and the invariant that the profile itself is unchanged. It is distinguishable from the sibling list tool luca_knowledge_suggestions, though it never names an alternative reject/dismiss path explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when to use it via the effect ('so it stops being offered'), and the closing lines explain workspace override and idempotency-key usage. However, there is no explicit statement of when NOT to use it or how it differs from adjacent tools such as luca_learning_proposals_dismiss or luca_knowledge_sources_disconnect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_knowledge_sources_disconnectDisconnect a knowledge sourceADestructiveIdempotentInspect
Delete a knowledge source. Its pending suggestions go with it; values the coach already approved stay in the profile, because approving copies them there.
Luca operation: DELETE /api/knowledge/sources/{id} Required scopes: knowledge:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint and idempotentHint, and the description goes beyond them: it specifies exactly what is destroyed (pending suggestions) versus what survives (already-approved values copied into the profile), plus required scopes and idempotency-key behavior. That is precisely the extra 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive effect and its blast radius, then operational details in short sentences. The OAuth scope / sensitivity line is boilerplate but brief and useful for gating.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive DELETE with an output schema present, the description covers irreversibility, idempotency, auth scopes and workspace targeting. Only an explicit note on error/not-found behavior or sibling alternatives is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema already documents the fields; the description still adds that the server generates an idempotency key when omitted and that workspaceId/workspaceSlug override the environment-configured default, which the schema only calls a generic "override".
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete a knowledge source") and immediately scopes what delete means here (pending suggestions removed, approved values retained), which separates it from luca_knowledge_suggestions, luca_knowledge_reject_suggestion and luca_knowledge_sources_sync.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the delete verb and the consequence note, but the description never states when to choose this over, say, syncing or rejecting a suggestion, nor any when-not conditions. The approved-values-retained detail is helpful context 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.
luca_knowledge_sources_listList knowledge sourcesARead-onlyIdempotentInspect
List the content sources the coach has connected — Notion, Google Docs, a website, an Instagram bio — with the sync state of each one. Connecting a new source is app-only; this lists what is already there.
Luca operation: GET /api/knowledge/sources Required scopes: knowledge:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, non-destructive, and closed-world hints, yet the description adds genuinely new behavioral detail: required scopes (knowledge:read, luca:read), data sensitivity (redacted), and the underlying operation. This is meaningful context beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, which is dense and useful. The trailing metadata lines (operation, scopes, sensitivity, idempotency) are structured but the 'Does not require idempotency' line partly restates the annotation's idempotentHint, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers purpose, scope requirements, sensitivity, and workspace-override behavior. It is complete enough for an agent to call correctly, missing only explicit sibling routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description adds meaning the schema lacks: it explains that workspaceId/workspaceSlug override the default workspace configured by environment. That is real added semantic value over the bare 'optional override' schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb (List) and resource (content sources the coach has connected), enriched with concrete examples (Notion, Google Docs, a website, an Instagram bio) and the sync state returned. It also distinguishes itself from the adjacent connect action by noting 'Connecting a new source is app-only; this lists what is already there.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this applies and explicitly rules out the connect flow ('app-only'), but it never names the sibling tools (e.g. knowledge_sources_sync, knowledge_sources_disconnect) that an agent could confuse it with. Usage is clear but alternatives aren't enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_knowledge_sources_syncRe-sync a knowledge sourceADestructiveInspect
Queue a re-read of one knowledge source now rather than waiting for its next scheduled sync. It returns as soon as the job is queued, so any new suggestions appear on a later read.
Luca operation: POST /api/knowledge/sources/{id}/sync Required scopes: knowledge:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses asynchronous behavior ('returns as soon as the job is queued', new suggestions appear on a later read), the required scopes (knowledge:write, luca:queue_ops), the Idempotency-Key requirement and its auto-generation fallback, and the workspace override semantics. This is exactly the extra 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by async-return semantics and then operation/scope/idempotency/workspace facts. Slightly boilerplate in the scope and data-sensitivity lines, but nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the description still covers auth scopes, idempotency, workspace resolution, and async completion. The one unexplained point is why the destructiveHint=true annotation applies to what reads as a benign re-read, which an agent might want clarified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the baseline is a 3, but the description adds real meaning: it explains that idempotencyKey is required for safe retries and will be server-generated if omitted, and that workspaceId/workspaceSlug override the environment-configured default. Only the required 'id' parameter is left implicit, which is self-evident as the source UUID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Queue a re-read of one knowledge source') and states the scope ('now rather than waiting for its next scheduled sync'). An agent can distinguish this immediately from siblings like luca_knowledge_sources_list and luca_knowledge_sources_disconnect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames the situation that selects this tool — you want a re-read now instead of waiting for the scheduled sync. It does not, however, name an explicit alternative tool or state any when-not-to-use condition, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_knowledge_suggestionsList knowledge suggestionsARead-onlyIdempotentInspect
List profile changes proposed from the coach's own knowledge sources, each with the excerpt it was drawn from and the value it would replace. Approving one is app-only, so a person checks each change before it reaches the profile; this lists them and luca_knowledge_reject_suggestion turns one down.
Luca operation: GET /api/knowledge/suggestions Required scopes: knowledge:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnly/idempotent annotations by disclosing required scopes (knowledge:read, luca:read), redacted data sensitivity, and the fact that approval cannot happen here. Minor tension with idempotentHint=true in the line 'Does not require idempotency', though that reads as 'no idempotency key needed' rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The prose is front-loaded and efficient: what it returns, then the approval/rejection routing. The trailing metadata block (operation, scopes, idempotency, workspace override) is boilerplate, and the workspace sentence duplicates the schema descriptions, costing a little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the description still summarises item content (excerpt plus replaced value). The main omission is the status filter and any pagination/volume expectations for a list that could be long.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: workspaceId and workspaceSlug are already documented in the schema, and the description only restates the override behaviour. The undocumented piece — the nested query.status enum (pending/approved/rejected) — is never mentioned, so an agent gets no guidance on filtering by review state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — listing profile changes proposed from the coach's own knowledge sources — and adds the shape of each item (excerpt, value to be replaced). It names the adjacent tools (luca_knowledge_reject_suggestion, knowledge sources) so an agent can place it in the workflow without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the review context: approval is app-only, so this tool surfaces items for a human, and rejection is routed to luca_knowledge_reject_suggestion. That is clear when-to-use and a named alternative, but it gives no exclusions against neighbouring list tools such as luca_learning_proposals_list or luca_knowledge_sources_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_consents_grantRecord a lead's consentADestructiveInspect
Grant explicit lead consent for a channel purpose.
Luca operation: POST /api/leads/{id}/consents Required scopes: leads:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real operational context beyond annotations: required OAuth scope (luca:queue_ops), data sensitivity redacted, the mandatory Idempotency-Key with server-side generation fallback, and the hard rule that the call is rejected without confirm: true. It stops short of describing the actual downstream effect of recording a consent (which the schema's confirm description covers).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose before the operational metadata block, and each line carries distinct information. Minor waste in having both 'Required scopes: leads:write' and 'Required OAuth scope: luca:queue_ops' as separate unlabeled-from-each-other lines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations present and an output schema available, the description covers the mutation's safety and auth burden adequately for a write tool. The remaining gap is guidance on body construction (what counts as valid evidenceId and whether grantedAt defaults), which the agent must guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
It explains confirm, idempotencyKey, and the workspace overrides, but those explanations largely duplicate the schema's own parameter descriptions. The most semantically loaded parameter — the nested body object with channel, purpose, source, and evidenceId — gets no explanation, which matters given evidenceId's provenance is not obvious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Grant explicit lead consent for a channel purpose,' plus the underlying endpoint POST /api/leads/{id}/consents. It does not explicitly contrast with the sibling luca_leads_consents_revoke, so the agent must infer the complement from 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (record a lead's consent for a channel/purpose) and lists prerequisites like scopes and confirm: true, but never states when to use this instead of luca_leads_consents_revoke or what evidence is sufficient to grant. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_consents_revokeRevoke a lead's consentADestructiveIdempotentInspect
Revoke explicit lead consent for a channel purpose.
Luca operation: POST /api/leads/{id}/consents/revoke Required scopes: leads:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description is not carrying the safety burden; it adds real value by naming required scopes, the redacted data sensitivity, and that the server auto-generates an Idempotency-Key if omitted. It stops short of saying what revocation actually destroys downstream (e.g., whether queued sends are blocked), which is the one thing an agent most needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action in the first line, then layered metadata (operation, scopes, idempotency, workspace). The scopes line is slightly redundant ('Required scopes' and 'Required OAuth scope' in adjacent lines), but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotent mutation with an output schema available, the description covers the endpoint, auth scopes, idempotency behavior, and workspace resolution — everything needed to invoke it correctly. The gap is behavioral consequence of the revocation, which the annotations flag as destructive but do not explain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 60% schema coverage the description does useful compensating work: it explains that consent is scoped per channel+purpose (the body fields), and clarifies that idempotencyKey is optional because the server generates one, and that workspaceId/workspaceSlug override the environment default. It does not describe the 'id' path parameter or enumerate the allowed channel/purpose values, leaving that to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Revoke') and resource ('explicit lead consent') scoped to a channel purpose, plus the exact endpoint POST /api/leads/{id}/consents/revoke. It is unambiguously distinct from the sibling luca_leads_consents_grant by direction of the operation alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies prerequisites (leads:write scope, luca:draft OAuth scope) and retry guidance, which implies usage context, but it never states when to revoke versus when to use the grant sibling, nor any precondition such as whether the consent must currently exist. Usage is inferable rather than instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_createCreate or upsert a leadADestructiveInspect
Create or upsert a lead identity. Body requires channel and externalUserId.
Luca operation: POST /api/leads Required scopes: leads:write Required OAuth scope: luca:draft; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful behavior beyond the annotations: scope/authorization requirements, data sensitivity 'full_content', the mandatory Idempotency-Key and the server-generated fallback for safe retries, plus how workspaceId/workspaceSlug override the environment default. The upsert semantics align with destructiveHint=true. Minor tension exists between 'safe retries' and idempotentHint=false, but the key is what supplies retry safety, so this is not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and required fields, then short labeled lines for operation, scopes, idempotency, and workspace override. Each line carries information; the 'Luca operation: POST /api/leads' line is the only near-boilerplate element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description covers auth, idempotency, and workspace scoping for a nested-body mutation. The remaining gap is the upsert matching/merge behavior, which an agent would need to know before overwriting an existing lead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the description only restates the two required body fields plus the three top-level parameters that the schema already describes. It does not explain what identity key drives the upsert (presumably channel + externalUserId) or how tags/stage/customFields behave on an existing lead, which is the main semantic gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create or upsert a lead identity') and names the two required body fields. The 'upsert' framing usefully signals that this may modify an existing lead rather than only insert, though it does not name a sibling (e.g., luca_leads_update) to contrast with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives operational preconditions (leads:write scope, luca:draft OAuth scope, Idempotency-Key requirement, workspace override) but never says when to pick this over luca_leads_update or luca_leads_import_apply. Usage is implied by the word 'upsert' rather than stated as a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_draftDraft a reply to a leadADestructiveInspect
Draft a reply for a lead, written the way the coach writes, and put it in the review queue for the coach to approve. Drafting again replaces this lead's earlier unapproved draft from this tool. It never sends, whatever the channel's auto-send setting. Optional guidance steers tone or content.
Luca operation: POST /api/leads/{id}/draft Required scopes: leads:write Required OAuth scope: luca:draft; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: states that a second call replaces this lead's earlier unapproved draft from this tool, guarantees no send regardless of auto-send settings, and discloses required scopes, full_content data sensitivity, and the Idempotency-Key contract. That is exactly the operational context destructiveHint/openWorldHint alone 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the key replacement/no-send guarantees are front-loaded in the first two sentences; the API/scope/idempotency block follows. Somewhat dense with boilerplate metadata, but each line carries information an agent would otherwise lack.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, open-world tool the description covers the mutation semantics (replacement of prior drafts), the safety boundary (never sends), auth/scopes, workspace scoping, and retry behavior; an output schema exists so return values need no explanation. Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description compensates where it is thin: it explains that the nested `guidance` string steers tone or content (the schema gives it no description), and reiterates the workspace override and idempotencyKey retry semantics. The `id` parameter is only implicitly a lead UUID, which is the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource with scope: drafts a reply in the coach's voice and places it in the review queue for approval, and explicitly states it never sends. Clear on its own, but it never names the near-identical sibling luca_draft_reply or luca_review_queue_regenerate, so an agent must infer the boundary from schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"It never sends, whatever the channel's auto-send setting" implies the agent should reach for luca_approve_and_send / luca_conversations_send when sending is wanted, but no alternative is named. Re-drafting replacement behavior is stated, but there is no guidance on when to draft versus regenerate or cancel a queued draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_drafting_pausePause Luca for a leadADestructiveInspect
Stop Luca drafting replies, running follow-up cadences, and sending campaign messages to one lead, for 1h, 24h, 7d, 30d, or until resumed. A draft in flight stops at its next step. Opt-outs and crisis messages are still handled. Pausing again replaces the earlier pause. A timed pause resumes the lead by itself when it ends.
Luca operation: POST /api/leads/{id}/drafting/pause Required scopes: leads:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: explains that an in-flight draft stops at its next step, that opt-outs and crisis messages bypass the pause, that a repeat pause replaces the earlier one, and that timed pauses auto-resume. It also discloses auth requirements, idempotency-key handling, and data sensitivity — the destructiveHint=true effect (halting outbound messaging) is spelled out rather than left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Effect statements are front-loaded in the first sentence, followed by exceptions and semantics, which is the right ordering. The endpoint, scope, and workspace boilerplate at the end is useful but slightly repetitive of the schema field descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers effects, exceptions, overwrite behavior, auto-resume, auth, and idempotency for a mutation tool, and an output schema exists so return values need not be described. Missing only guidance on failure modes (e.g., unknown lead id) and explicit sibling routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds real meaning for the idempotencyKey (server generates one if omitted — retry safety) and for workspaceId/workspaceSlug (override the environment default), and maps the duration enum to plain-language values. The `id` parameter is only identifiable as the lead id through the endpoint path, not stated directly, so not everything is covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource with explicit scope: stop Luca from drafting replies, running cadences, and sending campaign messages for exactly one lead. This cleanly distinguishes it from luca_leads_drafting_resume (the inverse) and from workspace/cadence-wide pausing tools like luca_cadences_pause.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (single-lead suppression) and enumerates the duration choices, which tells the agent what inputs are valid. It never explicitly names the alternative tools (luca_leads_drafting_resume, luca_cadences_pause, luca_flag_for_human) or states when not to use this, so routing between siblings still requires inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_drafting_resumeResume Luca for a leadADestructiveInspect
Clear a lead's pause and have Luca draft one reply over each conversation's unanswered messages. With auto-send on for the channel, that reply can send without review. A conversation is skipped when the coach already replied or the messaging window closed, and skippedReason says why nothing restarted. Resuming a lead that isn't paused succeeds.
Luca operation: POST /api/leads/{id}/drafting/resume Required scopes: leads:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: auto-send may send without review, skipped conversations report skippedReason, and resuming a non-paused lead still succeeds. It also discloses required scopes, idempotency behavior, destructive side effects, and the mandatory confirm flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral summary is front-loaded and useful. The description is somewhat long because it includes endpoint, scope, sensitivity, idempotency, destructive-action, and workspace-override metadata, but each block is structured and relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool, it covers the key operational facts an agent needs: required confirm, idempotency key, workspace override, auto-send risk, skip conditions, and non-paused resume behavior. An output schema exists, so return-value details are not required in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 80%, and the description mostly repeats schema-provided meanings for confirm, idempotencyKey, workspaceId, and workspaceSlug. It adds little parameter-level detail beyond identifying the lead path and noting safe retry behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: clearing a lead's drafting pause and having Luca draft a reply over each conversation's unanswered messages. This clearly distinguishes it from nearby tools such as luca_leads_drafting_pause and luca_leads_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the operational context well: it applies to paused leads, can auto-send when channel auto-send is enabled, and skips conversations where the coach already replied or the messaging window closed. It does not explicitly name alternatives like luca_leads_draft or review-queue drafting tools, so it stops short of full when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_explainExplain why a lead qualifiedARead-onlyIdempotentInspect
Explain why a lead qualified: the qualifier's reasoning, signals, and confidence from its most recent drafted turn.
Luca operation: GET /api/leads/{id}/explain Required scopes: leads:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive traits, but the description adds real operational context: required scopes (leads:read, luca:read), data sensitivity of full_content, explicit 'does not require idempotency', and workspace override behavior. This is meaningful added value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, then structured metadata (operation, scopes, idempotency, workspace) follows. Slightly dense with metadata but every section is scoped and non-redundant; not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with an output schema present, the description covers what it returns, auth scopes, data sensitivity, and workspace override. The one gap is that the required 'id' parameter's meaning is left implicit rather than stated as the lead identifier.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, so the schema documents the workspace parameters. The description implies the 'id' is a lead id via the endpoint path but does not explicitly define it, and workspace override guidance largely mirrors the schema. Adding some value over the schema but not compensating for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Explain'), resource ('why a lead qualified'), and even describes returned content: reasoning, signals, confidence from the most recent drafted turn. It does not explicitly distinguish itself from the similarly named sibling luca_review_queue_explain, so a strong 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use (retrieving qualification reasoning for a specific lead), but there is no explicit when-to-use guidance, no mention of prerequisites, and no comparison to alternatives like luca_review_queue_explain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_field_definitions_listList custom lead fieldsARead-onlyIdempotentInspect
List custom lead field definitions.
Luca operation: GET /api/leads/field-definitions Required scopes: leads:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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: required OAuth scope luca:read, data sensitivity 'full_content', and the fact that the workspace defaults to the environment-configured one. The 'Does not require idempotency' line is redundant with idempotentHint, keeping this short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose leads, followed by terse operation/scope/sensitivity metadata and a closing scoping note; nothing is buried. Slight waste in 'Does not require idempotency', which restates the annotation and adds no agent-relevant signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with an output schema, scope disclosure, and workspace override guidance, an agent has what it needs to call it correctly. Only the practical semantics of a 'field definition' (key/type/options) are unstated, and the output schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description goes beyond the schema by explaining that workspaceId and workspaceSlug override a default workspace set by the environment — a concept the schema's 'Optional Luca workspace id override' does not convey on its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List custom lead field definitions') and pins it to the exact endpoint GET /api/leads/field-definitions. The plural 'List' plus the name pattern makes it clearly the read counterpart to luca_leads_field_definitions_upsert, though the sibling is never named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it is a read of field definitions, and the last sentence covers workspace scoping. There is no statement of when to prefer this over the sibling upsert tool, no prerequisites, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_field_definitions_upsertDefine a custom lead fieldBDestructiveIdempotentInspect
Create or update a custom lead field definition.
Luca operation: POST /api/leads/field-definitions Required scopes: leads:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description usefully adds auth context (leads:write, luca:draft scope, redacted data) and idempotency behavior (server generates a key if omitted), which goes beyond the annotations. However, annotations declare destructiveHint=true, and the description never explains what is destructive: whether changing a field's type or options drops existing lead values. That is the single most important behavioral fact for this tool, so it remains undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the action, and structured into scannable lines for endpoint, scopes, and idempotency. The metadata lines are dense but each carries information; only the workspace-override sentence is somewhat boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and auth and idempotency are covered. What is missing is what an agent most needs before calling: the effect of re-using an existing key, and what destruction occurs when a definition changes. For a destructive upsert with a nested body, that leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, and the description only restates the workspace override and idempotency key, which the schema already documents. It adds nothing about the body fields: whether key is immutable after creation, whether options is required for the select type, or what changing a type does to stored data. Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource: "Create or update a custom lead field definition." This distinguishes it from luca_leads_field_definitions_list and from luca_leads_update, but it doesn't mention them by name, so the differentiation comes from the noun phrase rather than explicit routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the scope requirement (leads:write) and the endpoint hint at a definition-management operation, but nothing says when to use this rather than luca_leads_update or luca_leads_field_definitions_list. No when-not guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_getGet a lead's timelineARead-onlyIdempotentInspect
Get a lead's full timeline and notes.
Luca operation: GET /api/leads/{id} Required scopes: leads:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds genuinely new context: the required scopes, the OAuth scope, and notably data sensitivity: full_content, which warns the agent that sensitive data is returned. The "does not require idempotency" line is somewhat redundant with idempotentHint=true, keeping it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded well, but the body is a metadata list with labels (Luca operation, Required scopes, Required OAuth scope) and a "Does not require idempotency" line that duplicates the idempotentHint annotation. It is organized but carries some low-value filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and for a simple single-resource GET the description covers scopes, data sensitivity, and workspace defaults. The remaining gap is sibling differentiation from other lead-read tools, which prevents a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (id is undescribed, the two workspace params are documented inline). The description's "use workspaceId or workspaceSlug to override the default workspace configured by environment" adds real meaning about what happens when they are omitted, but it doesn't address precedence between the two or the required id. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Get a lead's full timeline and notes") and names the endpoint GET /api/leads/{id}, so an agent understands this is a single-lead read. It does not explicitly distinguish itself from close siblings like luca_leads_list, luca_leads_explain, or luca_call_events_by_lead, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies operational prerequisites (required scopes leads:read, OAuth scope luca:read) and a workspace-override instruction, which imply how to call it. However, there is no explicit when-to-use guidance versus alternatives such as luca_leads_list or luca_leads_explain, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_identities_attachAttach a channel identity to a leadBDestructiveInspect
Attach a verified or claimed identity to a lead.
Luca operation: POST /api/leads/{id}/identities Required scopes: leads:write Required OAuth scope: luca:draft; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, but the description adds real operational context beyond them: required scopes (leads:write, luca:draft), full_content data sensitivity, and the Idempotency-Key requirement with server-side generation fallback. It does not say what is destroyed or how duplicate identities are handled, which is the remaining gap given the destructive hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first line, followed by a compact metadata block (endpoint, scopes, idempotency, workspace override). No filler sentences, though the scopes/sensitivity line is dense shorthand rather than explanatory prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the auth/idempotency/workspace dimensions are covered. For a destructive mutation with a nested body object, however, it omits what happens to a pre-existing identity on the same channel, duplicate/conflict behavior, and the meaning of the body fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 60%, and the undocumented parts are the important ones: the top-level `id` (lead UUID) and the nested `body` with its channel enum, externalUserId, verificationStatus and sourceRef. The description mentions workspace override and idempotency key (already documented in the schema) but adds nothing about the required body shape or the semantics of verificationStatus values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: attach a channel identity to a lead, which is clearly distinct from luca_leads_create and luca_leads_update in the sibling list. The word "identity" is not expanded to mean channel handle/ID (telegram, instagram, etc.), so the agent must infer the resource's shape, but the operation itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to use this versus luca_leads_update or luca_leads_create, nor what precondition must hold (e.g. lead must exist, identity must not already be attached). Usage is only implied by the verb and the scope requirement; the agent has to infer the situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_import_applyApply a lead importADestructiveInspect
Apply a mapped lead import with consent evidence.
Luca operation: POST /api/leads/imports/apply Required scopes: leads:write Required OAuth scope: luca:queue_ops; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it names the required scopes (leads:write, luca:queue_ops), flags full_content data sensitivity, and states the concrete guardrail that the call is rejected without confirm: true. It stops short of disclosing failure semantics (partial import rollback, per-row error behavior) for a destructive bulk write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core capability is front-loaded in one sentence, followed by short metadata lines; nothing is padded. There is minor redundancy where confirm and idempotencyKey semantics duplicate the schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the safety profile is covered. Still missing for a destructive bulk import: the row limit/size expectations, whether the import is atomic or partial, and the explicit relationship to the preview tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% and confirm, workspaceId, workspaceSlug, and idempotencyKey already carry schema descriptions that the prose largely restates. The required, most complex parameter — body, with its rows/mapping/consents structure and 1000-row cap — gets no explanation in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource ("Apply a mapped lead import with consent evidence") and is backed by the exact endpoint. It does not, however, contrast itself with the obvious sibling luca_leads_import_preview, so an agent must infer the preview-then-apply workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word "mapped" implies a prior mapping step exists, and the confirm/idempotency notes imply operational context, but nothing states when to use this instead of luca_leads_import_preview or what prerequisites must be satisfied first. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_import_previewPreview a lead importBRead-onlyIdempotentInspect
Preview a mapped CSV lead import before applying it.
Luca operation: POST /api/leads/imports/preview Required scopes: leads:read Required OAuth scope: luca:draft; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: required scopes (leads:read, luca:draft), data sensitivity full_content, no idempotency requirement, and the default-workspace behavior with override options. It does not say what the preview actually validates or whether it persists anything, which matters for a 'preview' operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then lists operation metadata compactly. The workspace-override line is appended after the auth metadata rather than grouped with parameters, but overall there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and scopes/workspace behavior are covered. However, for a tool whose main challenge is constructing a valid rows+mapping payload, the description says nothing about row limits, mapping requirements, or what the preview response is meant to be inspected for.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 67% and the bulk of the payload is a deeply nested body (rows, mapping.identity, identities, consents, customFields) with no field-level descriptions in the schema or the description. The description only restates the workspaceId/workspaceSlug override already documented in the schema, leaving the complex mapping semantics entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (preview) and resource (mapped CSV lead import) and frames it as a pre-step 'before applying it', which implicitly distinguishes it from luca_leads_import_apply. It never names that sibling explicitly, so the discrimination relies on inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'before applying it' hints that this precedes luca_leads_import_apply, but the apply tool is never named and there are no stated conditions, prerequisites, or exclusions beyond that implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_listList leadsARead-onlyIdempotentInspect
List leads. Query supports limit, cursor, channel, and q according to Luca OpenAPI.
Luca operation: GET /api/leads Required scopes: leads:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior, so the description's added value is the auth/sensitivity context: required scopes (leads:read, luca:read) and data sensitivity: full_content. This is genuinely useful disclosure beyond the annotations, though 'does not require idempotency' just restates idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the body is a metadata dump ('according to Luca OpenAPI', operation line, scope lines, idempotency line) with some redundancy against the annotations. It is not bloated, but several lines do not earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers scopes, sensitivity, and workspace override, which is the context an agent needs; only the pagination/truncation role of maxPages is left solely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so both schema and description carry some burden. The description names the query filters (limit, cursor, channel, q) and the workspace overrides, but adds no meaning beyond the parameter names, and omits maxPages entirely (its semantics live only in the schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('List leads') and even names the underlying operation (GET /api/leads). It does not distinguish itself from close siblings such as luca_find_leads or luca_leads_get, so an agent must infer the boundary from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage instruction — use workspaceId/workspaceSlug to override the environment-configured default workspace. But it never says when to choose this list operation over sibling alternatives like luca_find_leads, leaving selection largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_notes_addAdd a note to a leadAInspect
Append a coach note to a lead. Body requires body.
Luca operation: POST /api/leads/{id}/notes Required scopes: leads:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, but the description adds real behavioral context beyond them: the idempotency-key contract for safe retries, the required scopes for authorization, and that the operation touches 'redacted' data. That is substantive disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the API metadata is broken into short, scannable lines. The phrase 'Body requires body' is awkwardly worded but not bloated; overall it earns its length without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema (so return values need no explanation), the description covers the non-obvious operational details: idempotency, scopes, workspace override. The main residual gap is the absence of when-to-use guidance relative to sibling write tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60% and the description mostly repeats what the schema already states (idempotencyKey server generation, workspaceId/workspaceSlug override). 'Body requires body' flags the nested-object requirement, but adds little beyond the schema's own required fields. Baseline 3 for a partly-documented schema is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Append a coach note to a lead.' The verb 'append' and the note resource clearly separate it from the sibling luca_leads_notes_delete, so an agent can route between the two. It stops short of an explicit contrast, keeping it just below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives operational prerequisites (required scopes 'leads:write', OAuth scope 'luca:draft', idempotency key handling), which function as preconditions for calling. However, it never states when to reach for this tool versus alternatives such as luca_leads_draft or luca_leads_update, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_notes_deleteDelete a lead noteADestructiveIdempotentInspect
Remove one coach note from a lead and leave the rest of the timeline alone. This is how a note filed by mistake gets taken back.
Luca operation: DELETE /api/leads/{id}/notes/{noteId} Required scopes: leads:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| noteId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive/idempotent annotations, the description discloses the required scopes (leads:write), the luca:draft OAuth scope, redacted data sensitivity, and the Idempotency-Key requirement with server-side fallback behavior. It also confirms deletion is scoped to a single note, which is exactly the reassurance an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The corrective-action sentence is front-loaded and does the heavy lifting, followed by a compact metadata block. The scope/endpoint/OAuth lines are somewhat boilerplate but each carries operational value for a destructive call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations are present, so return values and safety profile are covered; the description supplies auth, idempotency, and workspace-override context. Minor gaps remain: error cases (missing note, 404, permission failure) and explicit identification of `id` as the lead id are not stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 60% schema coverage, the description adds real meaning: workspaceId/workspaceSlug override the environment default, and idempotencyKey is optional with server generation on omission. The endpoint line clarifies that {id} is the lead and {noteId} the note, though neither is spelled out in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ("Remove one coach note from a lead") and bounds the scope with "leave the rest of the timeline alone," immediately separating it from the add-note sibling. An agent can tell exactly what this deletes without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"This is how a note filed by mistake gets taken back" gives a clear use case and implicitly frames it as a corrective action rather than routine editing. It does not explicitly name luca_leads_notes_add as the inverse alternative or state when not to delete, so it falls short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_leads_updateUpdate a leadADestructiveInspect
Update a lead's display name, stage, tags, or custom fields. Tags are replaced as a whole list.
Luca operation: PATCH /api/leads/{id} Required scopes: leads:write Required OAuth scope: luca:draft; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantive behavior beyond the annotations: it discloses that tags are replaced wholesale rather than merged, names the required `leads:write` scope and `luca:draft` OAuth scope, flags data sensitivity as full_content, and explains the Idempotency-Key contract including server-side key generation. This is exactly the kind of mutation-risk context the destructiveHint=true annotation cannot convey on its own.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single most important fact (which fields change, and that tags replace the whole list) is front-loaded in the opening two sentences. The following metadata block (HTTP operation, scopes, sensitivity, idempotency, workspace override) is terse and each line carries distinct operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A return schema exists, so response shape need not be described, and auth/scoping/idempotency are all covered. The remaining gap is partial-update semantics for fields that are omitted and for `customFields`, which is ambiguous in a PATCH body alongside a field explicitly documented as replacing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, with workspaceId, workspaceSlug, and idempotencyKey already documented in the schema. The description's real contribution is the replacement-vs-merge semantics for `tags`, which the schema cannot express; it does not clarify whether customFields are merged or overwritten, and the `id`/`body` params remain undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update a lead") and enumerates the mutable fields, so the agent knows exactly what surface it touches. It is clearly distinct from luca_leads_create/get/list by implication, but never names a sibling to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Operational guidance is present (required scopes, idempotency, workspace override), but there is no statement of when to choose this over luca_leads_field_definitions_upsert, luca_leads_identities_attach, or luca_leads_create, nor when a lead should not be updated directly. Usage is implied by the field list rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_learning_ab_tests_getGet an A/B testARead-onlyIdempotentInspect
Read one A/B test with its per-variant numbers: how many leads each arm saw, and how each is doing against the success metric. Small samples swing widely, so say how many leads each arm has before calling a winner.
Luca operation: GET /api/ab-tests/{id} Required scopes: learning:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower, and the description still adds real context: required scopes (learning:read, luca:read), full_content data sensitivity, and the default-workspace override behavior. The line 'Does not require idempotency' is about idempotency keys rather than behavior, and sits slightly awkwardly next to idempotentHint=true, though it is not a direct contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the payload shape, followed by a compact operational block (endpoint, scopes, sensitivity, workspace override). Each line carries information; only the 'small samples swing widely' sentence leans advisory rather than definitional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it covers the operationally important gaps: auth scope, sensitivity tier, and workspace resolution. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: the workspace parameters carry their own descriptions and id has a UUID pattern but no prose. The description adds the piece the schema lacks — that workspaceId/workspaceSlug override a default workspace configured by the environment — which is meaningful semantics beyond the field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one A/B test') and immediately scopes the payload ('with its per-variant numbers: how many leads each arm saw, and how each is doing against the success metric'). The word 'one' plus the sibling luca_learning_ab_tests_list makes the single-vs-list distinction obvious without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it is a read of an existing test by id, and it warns 'say how many leads each arm has before calling a winner'. That is interpretive guidance for the result, not a when-to-use-this-vs-alternative statement, and no sibling (e.g. the list or panel tool) is named as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_learning_ab_tests_listList A/B testsARead-onlyIdempotentInspect
List the coach's A/B tests, newest first, optionally filtered by status. Variant config comes back as stored, since its shape depends on what the test compares. Creating, starting, stopping, and adopting a test stay in the Luca app.
Luca operation: GET /api/ab-tests Required scopes: learning:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds meaningful context beyond them: ordering ('newest first'), the caveat that variant config shape depends on the test, the endpoint, required scopes, data sensitivity, and workspace override behavior. Pagination behavior is not addressed, keeping it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, and the extra endpoint/scope boilerplate is compact and useful. 'Does not require idempotency' is slightly redundant with idempotentHint=true, but the overall structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations and an output schema present, the description provides enough for a list tool: it covers ordering, status filtering, workspace override, scopes, and data sensitivity. Remaining gaps like pagination or result-set expectations are minor given the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%. The description adds context that workspaceId/workspaceSlug override 'the default workspace configured by environment', which is useful beyond the schema. But it adds no meaning for the status filter beyond the enum in the schema, so it only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the coach's A/B tests') plus ordering ('newest first') and filter ('optionally filtered by status'). It clarifies write operations stay in the Luca app, but never references the sibling luca_learning_ab_tests_get, so it does not fully differentiate from all siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives some context: listing is the only exposed operation for A/B tests, and creating/starting/stopping/adopting are out of scope. However, it does not say when to prefer this tool over luca_learning_ab_tests_get or other learning list tools, leaving the choice implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_learning_framework_performanceRead framework objection performanceARead-onlyIdempotentInspect
Win rate by objection bucket for the sales framework the coach has configured right now, over a rolling window. These numbers are correlational — read them as a signal, not as proof a framework caused the result.
Luca operation: GET /api/framework-performance Required scopes: learning:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and non-destructive behavior, but the description goes further by disclosing required scopes (learning:read, luca:read), data sensitivity (full_content), and a genuinely useful caveat that the figures are correlational, not causal. This adds real context beyond the structured hints; only the scope/OAuth/idempotency scaffolding is standard boilerplate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the correlation caveat are front-loaded and earn their place, and the workspace override note is actionable. The trailing metadata block (operation, scopes, idempotency line) is somewhat listy and partly restates annotation hints, but it stays compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't detail return values, and it covers resource scope, windowing, workspace override and auth sensitivity. The main remaining gap is alternative-tool routing against the adjacent objection/learning analytics tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: workspaceId and workspaceSlug are documented in-schema and the description reinforces their purpose ('override the default workspace configured by environment'). windowDays, however, is undocumented in both places — the description only implies 'rolling window' without stating the default of 30 or the 1–90 range, so the description does not fully compensate for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific metric (win rate by objection bucket) tied to a specific resource (the sales framework the coach has configured now) over a defined window, so the agent knows exactly what it reads. It does not, however, name or distinguish itself from conceptually similar siblings like luca_analytics_objections or luca_learning_panel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives interpretive guidance ('read them as a signal, not as proof') and explains the workspace override, but never says when to prefer this tool over the many adjacent objection/analytics siblings. Usage is implied rather than stated as a when/when-not rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_learning_panelRead what Luca wants to learnARead-onlyIdempotentInspect
Read which of the three profile questions Luca still owes an answer to, with suggested answers inferred from the coach's own words. The worked example pair is blanked for a redacted-tier key.
Luca operation: GET /api/teach-luca Required scopes: learning:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/openWorld=false, so the bar is lower, yet the description adds real context: required scopes (learning:read, luca:read), full_content data sensitivity, and the redaction behavior where the worked-example pair is blanked for redacted-tier keys. The idempotency line largely restates the idempotentHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, with scope/sensitivity metadata following in a compact block. Slightly marred by the 'Does not require idempotency' line, which is redundant with idempotentHint=true and adds little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still covers auth scopes, sensitivity tier, redaction behavior, and workspace-default overrides. What is missing is only the when-to-use framing against sibling learning tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description adds meaning the schema lacks: both params override a default workspace configured by environment, and they are alternatives to each other. That is genuine value beyond the per-field 'Optional Luca workspace id override' text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading the three profile questions Luca still owes an answer to, plus the underlying operation (GET /api/teach-luca). This is more precise than a generic 'learning' tool, though it does not explicitly contrast itself with the other luca_learning_* siblings (framework performance, A/B tests, proposals).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose and the workspace-override note, but there is no explicit 'use this when...' guidance or named alternative. Given the crowded luca_learning_* and luca_coach_* families, a sentence on when this panel is the right call versus those siblings would help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_learning_proposals_dismissDismiss a learning proposalADestructiveIdempotentInspect
Dismiss one learning proposal so it drops out of the default list. Use it when the coach has decided against the change, not when you have simply read it.
Luca operation: POST /api/learning-proposals/{id}/dismiss Required scopes: learning:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description adds real operational context beyond them: required scope learning:write, OAuth scope luca:draft, data sensitivity redacted, an Idempotency-Key requirement with server-side generation fallback, and the workspace override mechanism. It also clarifies the effect is removal from the default list rather than record deletion, which meaningfully nuances the destructive annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The decisive information is front-loaded in the first two sentences (what it does and when to use it), with endpoint/scope/idempotency boilerplate following. The operational lines are terse and each carries information, though the block reads as generated scaffolding rather than tightly edited prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers auth scopes, idempotency, and workspace targeting. The one gap that matters for a destructiveHint=true operation is whether a dismissal can be undone or the proposal re-surfaced, which is not stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already documents workspaceId, workspaceSlug, and idempotencyKey; the description largely restates those same points (idempotency fallback, workspace override) rather than adding syntax or constraints. The required `id` parameter gets no added explanation beyond its UUID format in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Dismiss one learning proposal') plus the concrete effect ('drops out of the default list'), which lets an agent distinguish it from the read-only sibling luca_learning_proposals_list. It stops short of naming that sibling explicitly, so the differentiation is implied by the effect rather than by tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('the coach has decided against the change') and an explicit when-not ('not when you have simply read it'), which is more than most definitions offer. It does not name a concrete alternative action/tool for the opposite decision path, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_learning_proposals_listList learning proposalsARead-onlyIdempotentInspect
List what the coach's tests have learned and are proposing they act on, newest first. Dismissed proposals are left out unless you ask for them.
Luca operation: GET /api/learning-proposals Required scopes: learning:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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 useful context beyond that: required scopes (learning:read, luca:read), data sensitivity full_content, workspace override semantics, and the default dismissal filter. 'Does not require idempotency' is slightly confusing given idempotentHint=true, but it reads as a request-semantics note rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and default filter are front-loaded in two short sentences, then operational metadata is grouped compactly below. The scope/sensitivity/operation block is boilerplate but dense and useful; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema explanation is needed since one exists, and annotations cover safety. Auth scopes, sensitivity, workspace override, and default filtering are all disclosed. The only missing piece is the meaning of the eventTypes filter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage and three params, the schema documents workspaceId/workspaceSlug and the description reinforces the override behavior. The default-filter sentence conveys activeOnly's meaning, but eventTypes is never explained in the description or schema, leaving a real gap. Baseline-appropriate but not additive across the board.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List what the coach's tests have learned and are proposing they act on') plus ordering ('newest first'). It clearly distinguishes this from the dismiss sibling (luca_learning_proposals_dismiss), though it doesn't name panel/ab_tests alternatives. Purpose is unambiguous for an agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage guidance is the default filter behavior ('Dismissed proposals are left out unless you ask for them'), which maps to the activeOnly parameter rather than telling the agent when to choose this tool over luca_learning_panel, luca_learning_ab_tests_list, or luca_analytics_learning_insights. Usage is implied, not stated with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_memory_listList what Luca remembersARead-onlyIdempotentInspect
List what Luca remembers, filtered by lead, scope, source, trust level, or free text. The fact, the reasoning, and the quoted evidence are blanked for a redacted-tier key; trust level, lead, and dates always come back.
Luca operation: GET /api/memory Required scopes: memory:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive status, yet the description goes further by disclosing tier-dependent redaction: fact, reasoning, and quoted evidence are blanked for a redacted-tier key while trust level, lead, and dates always return. It also states the OAuth scope and that workspace can be overridden, which are behavioral facts not in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core capability and filter list are front-loaded in the first sentence, and the redaction rule is stated compactly. The trailing operational boilerplate ('Does not require idempotency', scope/data-sensitivity lines) is somewhat rote and partially redundant with the idempotentHint annotation, but it is short enough not to obscure the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return shapes, and it instead adds the important tier-dependent field redaction rule plus auth scope and workspace override. The remaining gap is filter completeness (state/archived semantics and result limits), which is minor against the schema and output schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description names several filter concepts (lead -> leadId, scope, source, trust level, free text -> q) that map onto the nested query properties, which the schema itself leaves largely undocumented. It omits the state/archived filters, their defaults, and pagination, so coverage of the filter surface is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('List') and resource ('what Luca remembers') and enumerates the filter dimensions, so an agent knows exactly what it retrieves. It does not, however, name or distinguish itself from its closest siblings (luca_memory_update, luca_memory_set_archived), leaving that separation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when the tool applies by listing available filters (lead, scope, source, trust level, free text) and adds prerequisites like required scopes and workspace override. There is no explicit when-not-this-tool guidance or routing to the memory write/archive siblings, so usage is only implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_memory_set_archivedArchive or restore memoriesADestructiveIdempotentInspect
Archive or restore several memories at once. Archiving stops Luca using a fact while the record and its provenance survive, so it is always reversible.
Luca operation: POST /api/memory/bulk Required scopes: memory:write Required OAuth scope: luca:draft; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description adds meaningful context beyond them: archiving is reversible because provenance survives, memory:write scope and luca:draft OAuth scope are required, and data sensitivity is redacted. It does not cover restore-side behavior or whether archived facts disappear from list results, so it falls short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the remaining lines are structured metadata (endpoint, scopes, idempotency, workspace override) rather than filler. The block is slightly boilerplate-heavy but each line carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation with auth scopes, idempotency, and workspace targeting, the description covers the operational prerequisites an agent needs; an output schema exists so return values need not be described. Minor residual gap: no note on partial failures or what happens to already-archived ids in a bulk call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description adds behavioral meaning to two params: idempotencyKey is optional because the server generates one, and workspaceId/workspaceSlug override the environment default. It adds nothing about the ids array bounds or the action enum, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (archive/restore) and resource (several memories at once), making the bulk scope explicit. It is readily distinguishable from siblings like luca_memory_update and luca_memory_list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains what archiving means semantically (Luca stops using the fact, record and provenance survive) which implies when to use it, but it never states when to prefer this over luca_memory_update or luca_memory_list, and gives no exclusions. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_memory_updateEdit a memoryADestructiveInspect
Correct one memory: edit the fact, flag it disputed when it turns out to be wrong, restore an archived one, or make it win over a conflicting memory.
Luca operation: PATCH /api/memory/{id} Required scopes: memory:write Required OAuth scope: luca:draft; data sensitivity: full_content Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true and idempotentHint=false already in annotations, the description still adds meaningful context: required memory:write scope, luca:draft OAuth scope, full_content data sensitivity, and the server-side idempotency-key fallback. It does not mention optimistic concurrency (expectedUpdatedAt) or whether omitted body fields are cleared on a PATCH, which matters for a destructive edit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is dense and front-loaded, which is good. The trailing block, however, restates what the schema already documents for idempotencyKey and workspaceId/workspaceSlug, spending space on duplicated semantics instead of the undocumented body fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers auth scopes, sensitivity, idempotency and workspace override for a destructive single-record PATCH. The remaining gap is partial-update semantics and the expectedUpdatedAt concurrency precondition, both of which an agent would want before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so the schema carries part of the burden, and the description maps its four modes onto content/disputed/restore/preferred. But the more consequential nested parameters — expectedUpdatedAt (concurrency guard), confidence, trustLevel, evidence, sourceRefId — get no mention anywhere in the description, leaving the 40% gap only partially filled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (correct/edit a memory) and enumerates the four distinct modes: edit the fact, flag disputed, restore an archived one, preferred over a conflicting memory. That maps closely to the body fields (content, disputed, restore, preferred). It does not, however, distinguish itself from the sibling luca_memory_set_archived, which overlaps with the 'restore' mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each mode is paired with the condition that selects it ('flag it disputed when it turns out to be wrong', 'restore an archived one', 'make it win over a conflicting memory'), which is real when-to-use guidance rather than a restatement of the name. It stops short of naming an alternative tool or stating when NOT to use this one versus luca_memory_set_archived.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_morning_reportGet the morning digestARead-onlyIdempotentInspect
Return the coach's structured last-24h review-queue digest: queued drafts with status and confidence, plus counts by status. No model call — summarize it client-side. Example: call with {} at the start of the day.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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 real behavioral value beyond that: no model call is made, the output is structured data meant to be summarized client-side, and the window is fixed at the last 24h.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is returned, then the no-model-call/summarize instruction, then a usage example. Nothing is padding; each sentence carries a distinct instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value shape need not be restated, and annotations cover the safety profile. What remains — window, contents, no-LLM behavior, and default invocation — is all present, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so workspaceId and workspaceSlug are already documented; the baseline would be 3. The description adds the meaningful operational fact that an empty object is valid, telling the agent both params are true overrides with a default workspace resolution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Return the coach's structured last-24h review-queue digest') plus the payload contents (queued drafts with status and confidence, counts by status). This is enough to separate it in spirit from item-level siblings like luca_review_queue_list, but no sibling is named explicitly, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage context ('call with {} at the start of the day') and implicitly routes the agent away from re-querying by saying to summarize client-side. There is no explicit when-not guidance or named alternative (e.g. luca_review_queue_list for raw items), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_pause_cadencePause a lead's rescue cadenceADestructiveIdempotentInspect
Cancel a lead's running rescue cadence so no further touches are sent. Safe to call twice (a no-op once cancelled). Example: call with { leadId, reason: "lead replied elsewhere" }.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead whose cadence to pause. | |
| reason | No | Optional operator reason, stored on the cadence. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Reuse the same key when retrying this exact pause. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description adds real value by explaining what that idempotency means in practice ('no-op once cancelled') and what the effect is (no further touches sent). It still omits any note on permissions, whether the pause is reversible, or how it relates to the rescue-start sibling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, effect first, then the idempotency caveat, then an example. Efficient overall; the example is mildly redundant given full schema coverage but still cheap and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema present, the description only needs to convey effect and call semantics, which it does. The one real gap is ambiguity against the near-identically purposed sibling luca_cadences_pause.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema, and the description adds little beyond an example pairing leadId with an operator reason. It clarifies nothing about workspaceId, workspaceSlug, or idempotencyKey beyond what the schema states. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: cancel a lead's running rescue cadence so no further touches are sent. That is far clearer than the title alone, but it never distinguishes itself from the sibling luca_cadences_pause, so an agent cannot tell from the description which of the two pause operations to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The consequence clause ('so no further touches are sent') implies the situation in which an operator would stop a cadence, and the example hints at a real trigger (lead replied elsewhere). However, there is no explicit when-to-use/when-not guidance and no routing to luca_cadences_pause or luca_cadences_rescue_start.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_post_call_queueList the post-call workARead-onlyIdempotentInspect
Return everything waiting on the coach after a call: calls that still need a report on how they went, and attended calls with no revenue outcome recorded. The two halves are tracked separately by the API, so a call can sit on one list and not the other. An item leaves the list once the coach reports how the call went and what it was worth. Example: call with {} after a day of calls.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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 real behavioral context on top: the two halves are tracked separately server-side, a call can appear on one and not the other, and an item is removed once a report and value are recorded. That exit condition is the sort of lifecycle detail an agent cannot get from structured fields. It stops short of describing ordering or how large the list can get.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core definition, then the lifecycle rule, in four short sentences with little waste. The trailing example is slightly cryptic in its phrasing ('call with {} after a day of calls') and is the weakest line, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needn't be explained, and annotations carry the safety profile. The description covers what qualifies an item, why the halves are separate, and when an item drops off, which is everything an agent needs to call and interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (workspaceId, workspaceSlug) are optional overrides already documented in the schema, so the baseline is 3. The description adds only the implicit signal that the call works with no arguments ('call with {}'); it says nothing about when a workspace override would be appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return everything waiting on the coach after a call') and then decomposes it into the two concrete item types: calls needing a report and attended calls with no revenue outcome. That is far more than a restatement of the title. It loses a point because it never names the closely overlapping siblings (luca_call_events_needing_feedback, luca_bookings_needs_outcome), so an agent cannot tell from this text whether to use this queue or those lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example 'call with {} after a day of calls' implies a usage moment (a coach's end-of-day sweep) and the zero-argument call style, which is helpful. But there is no explicit when-not guidance and no pointer to the sibling tools that cover the same underlying data, so selection between them is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_reports_morningRead the morning reportARead-onlyIdempotentInspect
Structured 24h review-queue digest (items + counts) for the coach. No model call; summarize client-side.
Luca operation: GET /api/reports/morning Required scopes: reports:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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 real context beyond them: the underlying GET endpoint, required reports:read scope, full_content data sensitivity, and the explicit statement that no model call occurs. These are operational traits the agent cannot infer from the annotation block.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence front-loads purpose and payload, followed by compact metadata lines that are each short and scannable. The scope/idempotency lines are somewhat boilerplate but carry concrete constraints, so nothing is egregiously wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the description still covers auth scopes, sensitivity, workspace-override behavior, and the client-side summarization expectation. The one gap is the failure to disambiguate from the luca_morning_report sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description goes further by explaining the semantics of omission: workspaceId/workspaceSlug override 'the default workspace configured by environment.' That resolves the ambiguity of what happens when both optional params are absent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and payload: a structured 24h review-queue digest of items plus counts for the coach. It clearly distinguishes the return shape (structured, not narrative). However, it does not differentiate itself from the near-identical sibling luca_morning_report, leaving an agent unsure which of the two to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'No model call; summarize client-side' tells the agent what to do with the result and that no LLM is invoked server-side, which is genuine usage guidance. But there is no explicit when-to-use vs alternatives (luca_morning_report, luca_review_queue_list, luca_insights_unread_count), so selection remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_reports_scorecardRead the scorecardARead-onlyIdempotentInspect
Read the sales scorecard for a window: calls booked and completed, show rate, won and lost, draft approvals, and hours saved.
Luca operation: GET /api/reports/scorecard Required scopes: reports:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful non-schema context: required scopes (reports:read, luca:read), data sensitivity 'redacted', the underlying GET endpoint, and that an idempotency key is not required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and metric list, followed by compact metadata lines. Minor redundancy between the scope line and the operation line, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it adequately covers purpose, auth, and workspace selection. The dangling reference to a 'window' with no corresponding parameter is the only small ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both params are already self-documented as optional workspace overrides; the description's restatement of the override behavior only marginally extends the schema by naming the 'default workspace configured by environment' as the fallback. Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (sales scorecard) and enumerates the exact metrics returned (calls booked/completed, show rate, won/lost, draft approvals, hours saved), so the agent knows precisely what it produces. It doesn't explicitly differentiate itself from near-neighbor report tools like luca_reports_morning or luca_morning_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one concrete usage rule ('Use workspaceId or workspaceSlug to override the default workspace configured by environment'), but gives no when-to-use guidance versus the many analytics/report siblings, and never explains how the 'window' is defined given there is no date parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_reschedule_callMove a call to a new timeADestructiveInspect
Move a booked call to a new time and hand back a fresh reschedule link for the lead. Checks the new slot is open first, against the schedule of its booking type when it has one, and returns the open slots instead of moving the call when it is taken. A call with an idempotencyKey skips that check so a retry gets the original result back. A manual booking moves in SetLuca only. A Cal.com or Google Calendar booking moves on that calendar too, but only once the provider confirms: until then the booking's operation.state reads pending_provider and it keeps its old time, so read the booking again before telling the coach the call moved. A Calendly, GoHighLevel or iClosed booking is refused so the coach can move it with the provider, and so is a provider booking with no calendar event, such as one recorded with luca_bookings_create. Moving the call re-arms the lead's reminder for the new time, so pass confirm: true only after the coach approves the move. Example: call with { bookingId, slotAt: "2026-07-16T15:00:00Z", confirm: true } after the lead asked to push the call. SetLuca sends the lead no DM about the move, but a Google Calendar booking's calendar emails the lead the updated invite, and Cal.com may too. Send the lead the link yourself, or draft the message through the review queue.
| Name | Required | Description | Default |
|---|---|---|---|
| slotAt | Yes | ISO-8601 start time to move the call to, with an offset. | |
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| provider | No | The coach's booking provider. Used only for the availability check, and only when the booking has no booking type. The booking keeps the provider it already has. Pass it when the coach is not on Calendly, or the availability check reads the wrong calendar. | |
| bookingId | Yes | The booking to move. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| expiresInHours | No | How long the new reschedule link stays usable. Defaults to 168 hours. | |
| idempotencyKey | No | Reuse the same key when retrying this exact reschedule. A keyed call skips the availability check and lets the API replay the first result. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/openWorldHint annotations: discloses the availability check and re-arming of the lead's reminder, the pending_provider state that leaves the old time in place until provider confirmation, the instruction to re-read the booking, and the fact that SetLuca sends no DM while Google Calendar/Cal.com may email the lead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the move-and-return-a-link purpose leads, then edge cases follow. Some of it is long-form block text (provider-by-provider refusal list plus the DM/calendar-email caveat) that could be tightened, though most sentences carry distinct operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world mutation with 8 params, it covers the failure paths (slot taken returns slots), async provider confirmation, provider refusals, and the messaging side effects. An output schema exists, so return-value detail is not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the baseline. The description still adds policy the schema does not: pass confirm: true only after coach approval, and idempotencyKey retries skip the availability check and replay the original result. A worked example with bookingId and slotAt anchors usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move a booked call to a new time') and adds the secondary outcome ('hand back a fresh reschedule link for the lead'). This clearly separates it from siblings like luca_bookings_update, luca_bookings_cancel and luca_book_call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers when the tool applies per provider (manual moves in SetLuca, Cal.com/Google move on the calendar, Calendly/GoHighLevel/iClosed are refused), names a concrete alternative for one case ('such as one recorded with luca_bookings_create'), and conditions confirm on coach approval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_rescue_silent_leadsEnroll silent leads into the rescue cadenceADestructiveInspect
Enroll one or more silent leads into the multi-day rescue cadence. THIS STARTS OUTBOUND TOUCHES to real leads over the coming days — pass confirm: true to proceed. cadenceTemplate is light | standard | aggressive (default standard). Example: { leadIds: ["..."], cadenceTemplate: "standard", confirm: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| leadIds | Yes | Lead ids to enroll (max 100). Non-tenant ids are skipped. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Reuse the same key when retrying this exact enrollment. | |
| cadenceTemplate | No | Cadence intensity (default standard). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is covered. The description adds genuinely valuable context beyond annotations: the effect is delayed and ongoing ('over the coming days') and involves outbound touches to real leads, plus an explicit confirm gate. It omits what happens to leads that are not silent or already enrolled, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose, the critical side-effect warning, then parameter guidance with a concrete example. The capitalized warning is well placed. Slight redundancy with the schema's own confirm text, but no wasted padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and 100% schema coverage plus rich annotations mean the description only needs to carry the intent and side-effect warning, which it does. The main gap is the lack of differentiation from the near-identical cadence/campaign enrollment siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 including confirm, leadIds, and the cadenceTemplate enum. The description restates the enum values and an example but adds no semantics beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource+effect: enroll silent leads into the multi-day rescue cadence. It is clear what the tool does. However it does not distinguish itself from closely related siblings such as luca_cadences_rescue_start or luca_campaigns_enroll, so an agent cannot easily tell which 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the confirm: true prerequisite and the side effect, which is usage-relevant, but gives no explicit when-to-use vs. when-not guidance and never names or excludes the overlapping cadence/enroll siblings. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_approveApprove and send a queued draftADestructiveInspect
Approve a pending draft for sending; dispatches through the lead's channel. Sends a real message.
Luca operation: POST /api/review-queue/{id}/approve Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/openWorld/not-idempotent, and the description adds genuinely non-derivable context: the dispatch goes through the lead's channel, required scopes (review_queue:write, luca:queue_ops), idempotency-key handling with server-side generation fallback, and the hard requirement for confirm:true with rejection otherwise. It leans on the annotation wording for 'Destructive: has a real-world side effect' instead of saying what state changes on the lead record, which keeps it short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded statement of purpose and side effect, followed by compact operational lines for endpoint, scope, idempotency, confirm, and workspace. Slightly template-flavored and some content duplicates annotations, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the safety and auth requirements are covered. The gap is behavioral: for a destructive send with a nested, multi-variant content body, the description never says what happens if body is omitted or how the final message is determined.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description covers idempotencyKey, confirm, and the workspace overrides with real meaning beyond their schema descriptions. However, the most consequential parameter, body (with finalBody, finalParts, and the outboundContent variant union), gets no explanation at all, so an agent gets no guidance on whether supplying body edits the message before sending or replaces it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+effect: approve a pending draft and dispatch it through the lead's channel, sending a real message. That much is unmistakable. It does not differentiate itself from close siblings such as luca_review_queue_bulk_approve or luca_approve_and_send, which an agent would likely have to open to disambiguate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the use case (a draft already sitting in the review queue and needing to go out), but gives no explicit when-not guidance and never names the alternative tools for single vs. bulk approval. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_bulk_approveApprove and send several draftsADestructiveInspect
Approve several pending drafts as they stand and send each one through its lead's channel. Returns one outcome per id; a draft already handled or not in the queue is skipped. Sends real messages.
Luca operation: POST /api/review-queue/bulk-approve Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds important behavior: one outcome per id, skipped drafts that are already handled or not in the queue, and that real messages are sent. It also explains the idempotency key and confirm requirement, though it does not cover rate limits or failure modes beyond skipping.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the purpose and effect, and the remaining lines are structured rather than rambling. A few operational lines are template-generated, but they still earn their place by covering scopes and safety.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and rich annotations, the description provides enough detail to call the tool correctly: ids, confirm, idempotency, workspace override, and partial-skip behavior. It could be slightly more complete by explicitly naming the singular alternative, but nothing critical for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 80% schema description coverage, the schema already documents most parameters. The description adds useful semantics for idempotencyKey, confirm, and workspace overrides, but adds no detail about the ids array beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: approve several pending drafts and send each through the lead's channel. The word 'several' distinguishes it from the singular luca_review_queue_approve sibling, but the description does not explicitly name or route away from that sibling, keeping it just below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies use for multiple drafts and warns that sending is real, but it does not state when to use the singular approve tool instead or when not to use bulk approval. The guidance is adequate but leaves the agent to infer the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_bulk_rejectReject several draftsADestructiveIdempotentInspect
Reject several pending drafts so none of them sends, with no reason recorded. Returns one outcome per id; a draft already handled or not in the queue is skipped.
Luca operation: POST /api/review-queue/bulk-reject Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true, and readOnly=false, but the description adds important behavior: no reason is recorded, one outcome is returned per id, already-handled drafts are skipped, and an Idempotency-Key is required or auto-generated. It also lists required scopes and workspace override behavior, which is useful operational 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main behavior is front-loaded in the first sentence, followed by return and skip semantics. The operational metadata and repeated idempotency/workspace guidance add some low-value length, but the description remains reasonably structured and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not detail return values, and the annotations already cover safety traits. The description still supplies the missing context an agent needs: scope requirements, idempotency behavior, workspace override, skip semantics, and the fact that no rejection reason is recorded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description adds semantic meaning by implying that the ids are pending review-queue draft ids and that each id maps to one outcome. It also explains retry behavior for idempotencyKey and workspace override behavior, though those points substantially repeat schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reject several pending drafts, with the concrete effect that none will send. The word 'several' clearly distinguishes this bulk operation from the single-draft reject sibling, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context for bulk rejection and says drafts already handled or not in the queue are skipped. It does not explicitly name alternatives such as luca_review_queue_reject for single drafts or luca_review_queue_bulk_approve, so it stops short of full when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_changesRead review queue changesARead-onlyIdempotentInspect
Read which drafts entered and left the pending queue since the version an earlier call returned, with the pending and drafting counts. reload: true means that version is too old, so list the queue again.
Luca operation: GET /api/review-queue/changes Required scopes: review_queue:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive safety, and the description adds real value beyond them: the delta-since-a-cursor contract, the meaning of reload=true as a stale-version signal, the required scopes, and the workspace-override default. Missing only what happens when the cursor predates retention beyond the reload flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core delta semantics and the reload escape hatch are front-loaded in the opening two sentences, with operational metadata (scopes, idempotency, workspace override) demoted to a compact block below. Templated framing lines add slight bulk but each carries procedural information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and the annotations cover the safety profile; what remains — the cursor model, the reload signal, scope requirements, and workspace defaults — is all present. The only gap is clarifying the 'since' value format against the schema's date-time pattern.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the 'since' parameter has no schema description at all, so the description carries the burden there — it explains 'since' as the version a previous call returned, though it never clarifies that the value is an ISO timestamp rather than an opaque cursor token. workspaceId/workspaceSlug are already described in the schema and the description only restates the override behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (read) and resource (drafts that entered/left the pending queue since a prior version), which is clearly a delta endpoint and distinguishable in kind from luca_review_queue_list. It stops short of naming the sibling it replaces or the full-list alternative, but the semantics are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The reload clause implies the fallback path ('list the queue again') and the delta model implies this is for incremental polling, but neither is stated as explicit when-to-use guidance and luca_review_queue_list is never named. An agent must infer the polling workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_draftingList drafts in progressARead-onlyIdempotentInspect
List the inbound turns Luca is still writing a reply for, with each one's state, a preview of the lead's message, and how many restarts are left. Cancelled, paused, and failed turns stay on the list for 24 hours.
Luca operation: GET /api/review-queue/drafting Required scopes: review_queue:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, idempotent, non-destructive list operation. The description adds useful context beyond that: returned fields, 24-hour retention of cancelled/paused/failed turns, required scopes, and full-content data sensitivity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and generally efficient, with the core behavior stated first. It includes some operational boilerplate, such as the endpoint and idempotency note, but it remains readable and task-relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema description coverage, the description does not need to explain return values in detail. It still covers scope requirements, data sensitivity, retention behavior, and workspace override semantics, making it complete for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both workspaceId and workspaceSlug are already documented. The description adds meaning by explaining that either can be used to override the default workspace configured by the environment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: list inbound turns Luca is still writing a reply for. It also names the returned content (state, message preview, restarts left), which clearly differentiates it from a general review-queue listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when to use the tool by describing the drafting queue, and it notes that cancelled, paused, and failed turns remain for 24 hours. However, it does not explicitly compare against siblings such as luca_review_queue_list or the drafting cancel/retry/dismiss tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_drafting_cancelCancel a draft in progressADestructiveIdempotentInspect
Stop the reply Luca is writing for one inbound turn. A queued draft that is still pending is taken back; an approved or sent one is not. The turn stays on the drafting list for 24 hours so it can be retried or dismissed.
Luca operation: POST /api/review-queue/drafting/{turnId}/cancel Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| turnId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful context beyond annotations: the cancelled turn remains on the drafting list for 24 hours and can then be retried or dismissed, which tells the agent this cancellation is recoverable rather than final — an important nuance for a tool marked destructiveHint=true. It also discloses required scopes and the idempotency behavior. Missing only details on rate limits or what the response contains, which the output schema covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral explanation is front-loaded in two tight sentences, followed by scannable metadata lines for endpoint, scopes, idempotency, and workspace. The operation/scope boilerplate is somewhat repetitive with the idempotency sentence but each line carries operative information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be explained. The description covers the essential gaps for a destructive, idempotent mutation: what it cancels, what it cannot cancel, auth scopes, idempotency handling, and post-cancellation state. Complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema already documents most parameters. The description still adds value by explaining that workspaceId/workspaceSlug 'override the default workspace configured by environment' and by tying idempotencyKey to safe retries versus server-generated keys. That reinforces but largely restates what the schema descriptions already say.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Stop the reply Luca is writing for one inbound turn.' An agent can immediately tell this halts an in-flight draft rather than approving, rejecting, or retrying one. It does not explicitly name which sibling (drafting_retry, drafting_dismiss, reject) to use instead, so it stops just short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States a clear precondition boundary: it works on a 'queued draft that is still pending' and explicitly does NOT apply to an 'approved or sent one.' That exclusion is genuinely useful routing signal. It gives no positive pointer to alternatives for approved/sent drafts, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_drafting_dismissDismiss a stopped draftADestructiveIdempotentInspect
Remove a cancelled, paused, or failed turn from the drafting list without drafting again. Dismissing twice succeeds.
Luca operation: POST /api/review-queue/drafting/{turnId}/dismiss Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| turnId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: required write scope (review_queue:write), OAuth scope luca:queue_ops, the mandatory Idempotency-Key and its fallback behavior, and that repeat dismissal succeeds. The destructive/idempotent hints are already in the annotations, so this is consistent reinforcement rather than the whole burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the meaning and the idempotency reassurance before the API/auth metadata. The Luca operation, scope, and sensitivity lines are boilerplate but short and scannable; little waste overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers auth scope, idempotency requirements, and workspace override for a destructive mutation, which is what an agent needs to call it safely; an output schema exists so return values need not be described. The only missing piece is explicit sibling routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema coverage the schema already documents workspaceId, workspaceSlug, and idempotencyKey, and the description largely restates those. The turnId parameter (the only required one, a UUID referencing a drafting turn) gets no explanation beyond the endpoint path template, which is the main residual gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove/dismiss) and resource (a drafting turn), plus the qualifying states (cancelled, paused, failed). 'Without drafting again' distinguishes it from the retry/regenerate siblings without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The precondition (only cancelled, paused, or failed turns) tells the agent when this applies, and 'without drafting again' implicitly steers away from retry/regenerate. It does not name the alternative sibling tools (drafting_cancel, drafting_retry) explicitly, so routing still requires a small inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_drafting_retryRetry a stopped draftADestructiveInspect
Have Luca draft again for a cancelled, paused, or failed turn. Only the lead's latest turn in a conversation restarts, at most 3 times across retry and regenerate. With auto-send on for the channel, the new draft can send without review.
Luca operation: POST /api/review-queue/drafting/{turnId}/retry Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| turnId | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it warns that with auto-send enabled the new draft can go out without review, discloses the 3-attempt ceiling, states the required scopes, and explains that confirm: true is mandatory and an Idempotency-Key is required (or auto-generated). That is exactly the operational 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and preconditions are front-loaded in the first sentence, followed by the operational constraints as short declarative lines. The boilerplate scope/endpoint lines are compact and each sentence carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, an output schema, and 80% parameter coverage already present, the description fills the remaining gaps: side effects, idempotency, confirmation, and workspace scoping. The only missing piece is an explicit routing rule against luca_review_queue_regenerate and luca_review_queue_drafting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3, but the description adds meaning on top: it clarifies that turnId refers to the lead's latest turn in a conversation, restates the confirm gate, and explains that workspaceId/workspaceSlug override the environment-configured default workspace. Only turnId's format is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Have Luca draft again") plus the exact preconditions (cancelled, paused, or failed turn), which lets an agent recognize the recovery scenario. It does not distinguish itself from the near-identical sibling luca_review_queue_regenerate, which it only alludes to via the shared 3-attempt cap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use conditions (a turn that is cancelled, paused, or failed) and an explicit scope constraint (only the lead's latest turn restarts, max 3 times across retry and regenerate). It stops short of saying when to choose regenerate over retry, which is the most likely sibling confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_explainExplain a queued draftARead-onlyIdempotentInspect
Explain the signals behind a drafted reply: its voice-match score, any critic findings, and the qualification that motivated it.
Luca operation: GET /api/review-queue/{id}/explain Required scopes: review_queue:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds genuinely non-redundant context: required OAuth scope luca:read, data sensitivity of full_content, an explicit statement that idempotency is not required, and workspace-override behavior. Only the raw metadata lines (HTTP endpoint, 'Luca operation') are boilerplate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The substantive content is front-loaded in one dense, informative sentence, followed by short labeled lines that are easy to scan. Some of the operational metadata (endpoint path, 'Does not require idempotency') is boilerplate that an agent rarely needs, but it is compact rather than verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not required, and annotations plus the scope/sensitivity lines cover the safety and authorization profile for a read-only explain call. The remaining gap is routing guidance — nothing tells the agent why to pick this over the other review-queue read tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the required `id` has no schema description, but the description supplies its meaning via the path '/api/review-queue/{id}/explain'. It also adds semantics the schema lacks: workspaceId/workspaceSlug override a default workspace configured by the environment, which is more than the schema's generic 'Optional Luca workspace id override.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("explain the signals behind a drafted reply") and enumerates exactly what the explanation contains: voice-match score, critic findings, and the motivating qualification. This is clearly distinct from sibling mutations like luca_review_queue_approve, though it does not explicitly contrast with the nearby luca_leads_explain or luca_review_queue_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Explain the signals behind a drafted reply" implies the use case, but the description never states when to call this versus alternatives such as luca_review_queue_summary, luca_review_queue_changes, or luca_leads_explain, nor any when-not condition. The only actionable guidance is a prerequisite (review_queue:read scope), not tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_listList the review queueARead-onlyIdempotentInspect
List review-queue items when the API key has review queue access.
Luca operation: GET /api/review-queue Required scopes: review_queue:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| maxPages | No | Max pages the server auto-fetches and merges (default 10, hard cap 50). If more remain, the result is marked truncated with a nextCursor to continue. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, but the description adds genuinely non-derivable facts: the required OAuth scopes, data sensitivity of full_content (warning that responses may carry full message bodies), and that idempotency keys are not needed. It stops short of describing result ordering/truncation behavior, though maxPages in the schema covers truncation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the access precondition and structured as short scannable lines (operation, scopes, sensitivity). The scope list is slightly redundant across two lines but each item is short and operationally relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and auth/safety is well covered. What's missing is the sibling-relationship context (why list vs summary vs changes) and any characterization of the nested query filters, which an agent must guess at to paginate or filter meaningfully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level coverage is 75%, with maxPages, workspaceId, and workspaceSlug documented in the schema; the description's contribution is clarifying that the workspace params override an environment default. The nested `query` object (limit, order, cursor, leadId, status, category) carries no descriptions in either place, so filter semantics are left entirely to enum inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List review-queue items") plus a gating condition (API key has review queue access), so the agent knows exactly what it retrieves. However, with sibling tools like luca_review_queue_summary, luca_review_queue_changes, and luca_review_queue_sla in the same namespace, the description never distinguishes plain item listing from those aggregate/variant views.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real preconditions—required scopes and 'review queue access' on the API key—and explains that workspaceId/workspaceSlug override the environment-configured default. But it offers no guidance on when to choose this over luca_review_queue_summary or luca_review_queue_changes, which is the main selection ambiguity an agent faces here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_media_retryRetry a draft's failed mediaADestructiveInspect
Retry a failed voice-note transcription so the draft can be reviewed. Only re-transcribes; never redrafts or sends.
Luca operation: POST /api/review-queue/{id}/media/{mediaId}/retry Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| mediaId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: required scopes (review_queue:write, luca:queue_ops), redacted data sensitivity, and the Idempotency-Key contract including server-side key generation. It does not say whether the prior transcription is overwritten (relevant given destructiveHint=true), which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The behavioral sentence is front-loaded and the operational metadata (endpoint, scopes, idempotency, workspace override) is compact and scannable. The 'Luca operation: POST ...' line is boilerplate but cheap.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers auth scopes, sensitivity, idempotency and workspace targeting. An agent has everything needed to invoke this mutation correctly in one call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the description mostly restates what the schema already documents for idempotencyKey, workspaceId and workspaceSlug. It leaves the two required UUIDs (id, mediaId) to be inferred from the title's 'draft's failed media' phrasing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retry a failed voice-note transcription') and scopes the outcome ('so the draft can be reviewed'). The clause 'Only re-transcribes; never redrafts or sends' cleanly separates it from siblings like luca_review_queue_regenerate and luca_review_queue_drafting_retry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The failure condition (a failed media transcription) is clearly implied as the trigger, and the exclusion of redrafting/sending tells the agent when NOT to reach for it. It never names an alternative sibling explicitly, so the routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_objection_variantRecord an objection variant choiceAInspect
Record which objection-specialist variant was picked for one queued draft. It is how the objection tests learn which handling works, so record the variant the coach actually chose.
Luca operation: POST /api/review-queue/{id}/objection-variant Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description supplies information annotations cannot: required scopes review_queue:write and luca:queue_ops, the redacted data sensitivity, and the Idempotency-Key requirement with the consequence of omitting it. It does not state whether re-recording a variant overwrites a prior choice, which matters for a learning-signal write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and rationale are front-loaded in the opening sentence, followed by compact operational facts (operation, scopes, idempotency, workspace override). No sentence is pure filler, though the scope/sensitivity line is dense boilerplate rather than tool-specific guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the return value needn't be explained, and auth, idempotency, and workspace override are covered. What is missing is the accepted label vocabulary and the preconditions on the queued draft — information an agent needs to call this write correctly rather than guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60% and the description only restates the idempotency and workspace-override semantics already documented in the schema. The most important parameter, body.label (the variant identifier, minLength 1, no enum), is undocumented in both schema and description — the agent cannot tell what valid label values look like.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb, resource, and scope: recording which objection-specialist variant was picked for one queued draft. That is distinct from every sibling (approve, reject, regenerate, explain), so an agent can identify the operation without opening the schema. It falls short of a 5 only because the sibling contrast is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Record the variant the coach actually chose" implies the timing (after a coach selects a variant) and the purpose (feeding objection tests). However, it never says what state the draft must be in, whether this must precede approve/reject, or what to do if no variant was chosen — the agent is left to infer the workflow position.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_regenerateRedraft a queued replyADestructiveInspect
Replace a pending draft by having Luca draft its turn again, with an optional hint on what to change. An approved or sent draft can't be replaced, and a turn restarts at most 3 times across retry and regenerate. With auto-send on for the channel, the new draft can send without review.
Luca operation: POST /api/review-queue/{id}/regenerate Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (destructive=true, openWorld=true, idempotentHint=false) by disclosing the 3-restart cap, the auto-send risk ('the new draft can send without review'), the confirm: true rejection behavior, and the Idempotency-Key requirement. These are exactly the side-effect and retry details an agent needs before invoking a destructive redraft.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key behavior and the approved/sent exclusion are front-loaded in the first two sentences. The remaining scope/endpoint/destructive boilerplate is somewhat repetitive with what the schema's confirm description already says, but it is short and skimmable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, nested-object tool with an output schema, the description covers prerequisites, side effects, retry semantics and workspace overrides. The main residual gap is not stating what happens to the replaced draft or what occurs once the 3-restart cap is hit, but nothing critical to a correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage, the schema already documents confirm, workspaceId, workspaceSlug and idempotencyKey. The description adds meaning beyond it by explaining the purpose of the optional 'hint' ('what to change') and by tying idempotencyKey to safe retries and the server-generated fallback, though it does not describe hint constraints or body shape further.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Replace a pending draft by having Luca draft its turn again' with an optional hint. An agent can tell it is a redraft/replace operation, but it does not name which sibling it is distinct from despite many close relatives (luca_review_queue_drafting_retry, luca_review_queue_objection_variant, luca_review_queue_drafting).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful preconditions: only pending drafts, an approved or sent draft can't be replaced, and a turn restarts at most 3 times. However, it never routes the agent between this tool and luca_review_queue_drafting_retry or luca_review_queue_objection_variant, which overlap heavily, so the when-to-use-vs-alternative guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_rejectReject a queued draftADestructiveInspect
Reject a pending review-queue draft so it never sends. Stops any related booking-recovery cadence and emits review.rejected.
Luca operation: POST /api/review-queue/{id}/reject Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by disclosing concrete side effects: it stops a related booking-recovery cadence and emits a review.rejected event, plus required scopes and the idempotency contract. The 'Requires Idempotency-Key' line is also reconciled with the server auto-generating a key, so no annotation conflict. It stops short of saying whether the rejection is reversible or what state the draft ends in.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the effect and side effects before the API/scopes boilerplate, which is the right ordering. The scope and operation lines are somewhat redundant with metadata but compact enough to earn their place for a write operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be described, and auth/idempotency/workspace override are all covered. What remains missing is irreversibility and the restore path (luca_review_queue_restore exists), plus guidance on reasonCode selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%: workspaceId, workspaceSlug and idempotencyKey already carry schema descriptions, and the description merely restates them. The undocumented parts — body.reasonCode (a 6-value enum with no explanation of when each applies) and body.note — get no help from the description, which is the biggest gap for a reject operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Reject) on a specific resource (a pending review-queue draft) and adds the outcome 'so it never sends', which distinguishes it from approve/regenerate siblings. It never names the closest alternatives (luca_review_queue_bulk_reject, luca_review_queue_approve), so differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'reject a pending draft', but there is no explicit when-to-use, when-not-to-use, or pointer to bulk_reject for multiple drafts or approve for the opposite action. The agent must infer routing from the tool name among ~180 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_restoreRestore a rejected draftADestructiveInspect
Restore a rejected review-queue item back to pending. Fails if it's a booking message whose recovery window already passed.
Luca operation: POST /api/review-queue/{id}/restore Required scopes: review_queue:write Required OAuth scope: luca:queue_ops; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses the operation endpoint, required scopes, data sensitivity, idempotency-key behavior, and workspace override behavior. It also states a concrete failure condition, giving an agent useful behavioral context for retries and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and failure condition are front-loaded, followed by operational details. It is appropriately sized for a mutation tool, though some scope and endpoint boilerplate could be trimmed without losing much.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a four-parameter mutation tool with annotations and an output schema. It covers the action, failure condition, authentication scopes, idempotency behavior, and workspace override, which are the key details an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, which sets a baseline of 3. The description explains idempotencyKey and workspace override behavior, but those details largely repeat schema descriptions, and the required id parameter is not further described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: restoring a rejected review-queue item back to pending. It distinguishes the action from sibling review-queue tools such as approve and reject, so an agent can identify the correct tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates the intended scenario: restoring a rejected item to pending. It also gives an important failure condition for booking messages whose recovery window has passed, though it does not explicitly compare this tool with alternatives like approve or reject.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_slaCheck the review queue's response timesARead-onlyIdempotentInspect
Read median first-response time and its daily trend. Tells you whether the queue is being cleared fast enough.
Luca operation: GET /api/review-queue/sla Required scopes: review_queue:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the bar is lower, yet the description adds genuinely useful operational context: the underlying GET endpoint, required scopes (review_queue:read, luca:read), full_content data sensitivity, and that no idempotency key is needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core metric and its interpretation in the first two sentences, followed by a compact operational metadata block. Nothing is wasted, though the metadata block is dense enough to slightly dilute the read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, annotations carry the safety profile, and the description supplies endpoint, scopes, sensitivity, and workspace-override behavior. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both params are documented there, so the baseline is 3. The description adds the meaningful detail that these override the default workspace configured by the environment, which the schema's bare 'Optional Luca workspace id override' does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: reading median first-response time and its daily trend, with the outcome it informs (whether the queue is cleared fast enough). This clearly separates it from siblings like luca_review_queue_list or luca_review_queue_explain, but it never names or contrasts with any of them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when you'd want the metric ('Tells you whether the queue is being cleared fast enough') and notes how to target a workspace, but gives no explicit when-to-use vs alternatives guidance and no exclusions relative to the many review_queue siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_review_queue_summarySummarize the review queueARead-onlyIdempotentInspect
Read how many drafts are pending and the newest few, with lead names and hot-lead flags but no draft text. Cheaper than listing the queue.
Luca operation: GET /api/review-queue/summary Required scopes: review_queue:read Required OAuth scope: luca:read; data sensitivity: full_content Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
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 substantive context beyond that: bounded result size ('newest few'), field-level disclosure limits (lead names and hot-lead flags, no draft text), relative cost, required OAuth scope/data sensitivity, and the environment-configured default workspace.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The leading sentence front-loads the payload shape and the cost comparison in two tight clauses. The trailing block (endpoint, scopes, idempotency) is structured but partly redundant with annotations, which already state idempotency and read-only behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers scope, cost, auth and workspace defaults. What is missing is how the two workspace override parameters interact when both are supplied, a minor gap for a 2-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description adds meaning the schema does not: the workspace parameters override a default workspace configured by the environment, which explains the zero-required-parameter design. It does not clarify precedence between workspaceId and workspaceSlug.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read count of pending drafts plus newest few) and enumerates exactly what is and isn't included (lead names, hot-lead flags, no draft text). It also distinguishes itself from the sibling luca_review_queue_list by framing itself as 'cheaper than listing the queue.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Cheaper than listing the queue' plus the 'no draft text' constraint gives the agent a clear alternative and cost tradeoff, effectively routing bulk/inspection work to luca_review_queue_list. It stops short of an explicit 'use list instead when you need X' statement, so it is clear context rather than full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_safety_accountsCheck connected account safetyARead-onlyIdempotentInspect
Read each connected channel account's safety status and 24-hour send count.
Luca operation: GET /api/account-safety Required scopes: safety:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and closed-world behavior. The description adds important context beyond annotations: the exact endpoint, required scopes (safety:read, luca:read), data sensitivity (redacted), and the note that idempotency is not required. This is useful operational detail for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action and scope, then lists technical requirements in a compact, scannable form. Every line contributes necessary information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with two optional parameters, an output schema, and rich annotations, the description covers the operation, required auth, sensitivity, idempotency, and workspace override. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 both optional workspace parameters. The description adds only a minor clarification that the default workspace comes from the environment. With the schema doing the heavy lifting, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read each connected channel account's safety status and 24-hour send count.' This is a unique resource among the sibling tools, so an agent can identify the operation without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context for overriding the workspace via workspaceId or workspaceSlug, but it does not state when to use this tool versus alternatives or any usage exclusions. Usage is implied by the read operation, which is minimally adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_triage_inboxTriage the review queueARead-onlyIdempotentInspect
Return the coach's prioritized reply queue: pending drafts with lead context and, for the top items, why Luca drafted what it drafted. With a redacted OAuth grant, lead names and draft text can be blanked; describe them as unavailable rather than empty. Start a review session here: it reads the queue and sends nothing. Example: call with { explainTop: 3 } to get the queue plus explanations for the three most urgent drafts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max queue items to return (default 20). | |
| explainTop | No | How many of the top items to attach a full explanation to (default 3). | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds useful behavioral context beyond annotations: under a redacted OAuth grant, lead names and draft text may be blanked and should be described as unavailable rather than empty. This is valuable edge-case transparency, though it does not discuss rate limits 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and return content, then moves to behavioral edge cases and a practical example. The sentences are generally efficient, though the redaction caveat interrupts the flow slightly before the usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, 100% schema coverage, and presence of an output schema, the description covers enough for an agent to call this correctly. It explains the queue content, redaction behavior, no-send safety, and an example invocation, though it could better distinguish this tool from sibling review-queue tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented. The description adds meaning through the example 'call with { explainTop: 3 }' and explains that top items get full explanations, which reinforces the role of explainTop beyond a bare schema label.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it returns the coach's prioritized reply queue with pending drafts, lead context, and explanations for top items. It clearly describes what the tool does, but it does not explicitly differentiate itself from nearby siblings such as luca_review_queue_list or luca_review_queue_explain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context by saying 'Start a review session here' and clarifying that it reads the queue and sends nothing. It does not explicitly name alternatives or state when not to use this tool versus the many other review-queue siblings, so it falls short of full explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_usage_messagesRead this period's message countARead-onlyIdempotentInspect
Read the message pool: used, allowed, and remaining for the period. Check this before starting work that drafts in bulk.
Luca operation: GET /api/usage/messages Required scopes: usage:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint=false, so the safety profile is covered. The description adds real context beyond that: required scopes (usage:read, luca:read), data sensitivity 'redacted', and that the default workspace comes from environment config. The line 'Does not require idempotency' is slightly loose wording against idempotentHint=true, but it refers to an idempotency key, not idempotency itself, so it is not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the pre-flight usage tip are front-loaded in two tight sentences, followed by clearly labeled metadata lines (operation, scopes, sensitivity). The boilerplate is structured rather than rambling, though a few lines are administrative noise for a simple read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with an output schema, the description covers what is read, when to read it, auth scope, and workspace override behavior. Nothing essential is missing; the only soft spot is the ambiguous idempotency phrasing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes further by explaining that workspaceId/workspaceSlug override a default workspace 'configured by environment' and that either one may be used. That default-workspace behavior is not derivable from the schema strings alone, so it earns above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('Read the message pool') and even enumerates the returned values (used, allowed, remaining) scoped to 'the period'. This is clearly a usage/quota read, distinguishable in spirit from the sibling luca_usage_spend, though the description never names that sibling explicitly to draw the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a concrete usage condition: 'Check this before starting work that drafts in bulk,' which tells the agent when to call it. There is no when-not guidance or explicit alternative (e.g., use luca_usage_spend for cost rather than message counts), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_usage_spendRead this period's spendARead-onlyIdempotentInspect
Read model spend for the period, rolled up by agent and by day, against the plan's cap.
Luca operation: GET /api/usage Required scopes: usage:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 genuinely useful context beyond annotations: the underlying endpoint (GET /api/usage), required scopes (usage:read, luca:read), 'data sensitivity: redacted', and that idempotency is not required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first sentence, then presents operation/scope metadata in compact lines. Slightly boilerplate-heavy (endpoint, scopes, idempotency) but each line carries machine-usable information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and annotations cover the safety profile. The description adds auth scopes, redaction level, and workspace-override behavior; the only real omission is any explanation of the `since` window parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; workspaceId and workspaceSlug are documented in the schema and the description clarifies they override the environment-configured default. However, the `query.since` parameter has no description in either the schema or the description, leaving the time-window control only vaguely implied by 'for the period'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (model spend) with scope details: 'for the period, rolled up by agent and by day, against the plan's cap.' This is clearly distinguishable from the sibling luca_usage_messages, though the description never explicitly names or contrasts with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (read spend for the current period) and there is one conditional instruction: override the default workspace with workspaceId/workspaceSlug. But there is no guidance on when to choose this over related tools like luca_usage_messages, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_voice_corpusRead the coach's voice corpusARead-onlyIdempotentInspect
List the coach's voice corpus: the writing every draft is matched against. Entry id, source, channel, and age always come back; the writing itself is blanked for a redacted-tier key.
Luca operation: GET /api/voice Required scopes: voice:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-open-world, so the safety profile is covered. The description adds real behavior beyond them: which fields always come back and that the writing body is blanked for a redacted-tier key, plus the required scopes and data sensitivity. Pagination/result limits are unstated, keeping it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and its meaning, then structured operation/scope/behavior lines. Most sentences earn their place; the 'Does not require idempotency' line is near-redundant against the idempotentHint annotation and slightly muddies rather than clarifies, costing it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description still notes the key returned fields and the redaction behavior. Scopes, sensitivity, auth, and workspace override are all covered; only result volume/pagination behavior for the corpus listing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes slightly beyond the schema by explaining what the override actually does ('override the default workspace configured by environment'), which clarifies why an agent might supply either parameter, though it doesn't add format or precedence detail between id and slug.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the coach's voice corpus') and explains what the corpus is ('the writing every draft is matched against'), plus the fields returned and the redaction rule. It does not distinguish itself from the sibling luca_voice_profile, which appears to be the nearest alternative, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the definition of the corpus and by the note that workspaceId/workspaceSlug override the environment default. There is no explicit statement of when to call this versus luca_voice_profile or any other voice-related sibling, and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_voice_profileRead the coach's voice fingerprintARead-onlyIdempotentInspect
Read a non-verbatim voice-fingerprint summary: version, example count, and last refresh. No corpus text.
Luca operation: GET /api/voice/profile Required scopes: voice:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive behavior, so the bar is lower; the description still adds real context by declaring the data sensitivity (redacted), the required scopes, and that no corpus text is exposed. It also clarifies that an idempotency key is not required, which usefully explains what the caller must supply beyond the annotation's idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool reads and what it deliberately excludes ('No corpus text') in the first two clauses, then tucks the operational metadata (operation, scopes, workspace override) afterward. No redundant restatement of the title or schema; every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema covering the return shape, the description only needs to disambiguate scope and inputs, which it does via the corpus exclusion and workspace-override note. It is nearly complete, missing only an explicit pointer to when a caller should choose this versus the corpus/profile siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 description adds meaning the schema lacks: it explains that these parameters override a default workspace configured by the environment. That default-workspace semantics is not in the schema field text, so it genuinely extends parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a non-verbatim voice-fingerprint summary') and names exactly what it returns: version, example count, last refresh. The phrase 'No corpus text' differentiates it from the sibling luca_voice_corpus without needing to open either schema, so an agent can pick the right one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The workspace override instruction ('Use workspaceId or workspaceSlug to override the default workspace configured by environment') gives useful invocation context, and 'No corpus text' hints at when to prefer it over luca_voice_corpus. But there is no explicit when-to-use / when-not-to-use statement or named alternative, so usage remains implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_deliveries_listList webhook deliveriesARead-onlyIdempotentInspect
List webhook deliveries.
Luca operation: GET /api/webhook-subscriptions/deliveries Required scopes: webhooks:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 context beyond annotations: required scopes (webhooks:read, luca:read) and data sensitivity (redacted). The 'does not require idempotency' line is mildly confusing against idempotentHint=true but refers to the request contract, not the endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then compact operational metadata (operation, scopes, workspace override) each on its own line. Slight redundancy between 'Required scopes: webhooks:read' and 'Required OAuth scope: luca:read', but overall tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the auth/scope requirements plus workspace override are covered. The remaining gap is pagination/filtering behavior for the list (limit semantics), which is minor given the schema and output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; workspaceId and workspaceSlug already carry descriptions in the schema that the description merely restates. The description adds no syntax or behavior detail for the undocumented 'limit' parameter, so it does not compensate for the coverage gap. Baseline 3 fits when the schema does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List webhook deliveries') and even names the underlying operation (GET /api/webhook-subscriptions/deliveries), which is unambiguous. It does not, however, explicitly distinguish this from nearby siblings like luca_webhooks_events_list or luca_webhooks_deliveries_replay.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage-like sentence is the workspace override instruction, which is really parameter guidance rather than when-to-use. There is no statement of when to prefer this over luca_webhooks_events_list or luca_webhooks_deliveries_replay, and no prerequisites or exclusions beyond the scope listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_deliveries_replayReplay a webhook deliveryADestructiveInspect
Replay one webhook delivery without changing the event id. Re-triggers the subscriber's downstream automation.
Luca operation: POST /api/webhook-subscriptions/deliveries/{deliveryId}/replay Required scopes: webhooks:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| deliveryId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Going well beyond the annotations (which only declare destructive/openWorld/not-idempotent), the description discloses required scopes (webhooks:write, luca:full), data sensitivity, that Idempotency-Key is mandatory with a server-generated fallback, the hard confirm:true gate with rejection on omission, and that workspace can be overridden. That is exactly the operational context an agent needs before a side-effecting call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core effect is front-loaded in the first sentence, and the operational constraints (scopes, idempotency, confirm, workspace) follow in short, scannable lines. The Luca operation string and sensitivity label are boilerplate padding, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, side-effecting operation with an output schema already present, the description supplies everything needed to call it correctly: the effect, the mandatory confirm gate, idempotency handling, scope requirements, and workspace override. Nothing material is missing, and return values need not be described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so confirm, workspaceId, workspaceSlug, and idempotencyKey are already documented in the schema, including the server-generates-a-key behavior. The description largely repeats that content and adds nothing new about deliveryId or parameter format, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Replay one webhook delivery') and clarifies the effect ('Re-triggers the subscriber's downstream automation'), which is more than a restated title. It does not, however, explicitly distinguish itself from the close siblings luca_webhooks_events_replay and luca_webhooks_events_bulk_replay, leaving the agent to infer that this operates on a delivery rather than an event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention of Idempotency-Key for 'safe retries' hints at a retry/recovery scenario, and the confirm requirement signals a deliberate re-trigger. There is no explicit when-to-use, when-not-to-use, or pointer to events_replay / bulk_replay for other cases, so the agent must infer the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_events_bulk_replayReplay a batch of webhook eventsADestructiveInspect
Bulk replay webhook events by type and time range. Re-triggers downstream automations at scale.
Luca operation: POST /api/webhook-subscriptions/events/replay Required scopes: webhooks:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/openWorld/non-idempotent, and the description goes well beyond them: required scopes (webhooks:write, luca:full), the mandatory confirm:true gate with rejection on omission, the Idempotency-Key requirement and server-side generation fallback, and the workspace override mechanism. It also states the real-world consequence, that downstream automations get re-fired.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by compact operational lines (endpoint, scopes, idempotency, confirm, workspace). The scope/sensitivity line is slightly jargon-heavy but every line carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be described. For a destructive, non-idempotent batch operation the description covers safety gating, retry semantics, and workspace scoping. Minor gaps: how already-delivered events are treated and whether the 100-item limit caps the batch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3; the description adds operational meaning for confirm (rejected without it), idempotencyKey (safe retries, server generates if omitted), and workspaceId/workspaceSlug (override the environment default). It adds nothing about from/to/eventTypes/limit beyond what the schema already encodes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb+resource+scope: 'Bulk replay webhook events by type and time range,' which separates it from a single-event replay. It stops short of explicitly naming luca_webhooks_events_replay or luca_webhooks_deliveries_replay, so the 'bulk' distinction relies on the agent inferring it from the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Re-triggers downstream automations at scale' implies the batch/multi-event use case, but the description never says when to prefer this over luca_webhooks_events_replay (single) or luca_webhooks_deliveries_replay, nor any prerequisites beyond scopes. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_events_listList webhook eventsARead-onlyIdempotentInspect
List canonical webhook events of one type, newest first, in the delivered payload fields. Falls back to a documented sample payload when the workspace has none yet.
Luca operation: GET /api/webhook-events Required scopes: webhooks:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, non-destructive, and closed-world. The description adds meaningful context beyond that: required scopes ('webhooks:read', 'luca:read'), redacted data sensitivity, the sample-payload fallback, and the underlying GET endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the core behavior and then provides structured operational details for scopes and workspace override. It is slightly verbose around idempotency and operation metadata, but no sentence is seriously wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description supplies the remaining agent-relevant context: auth scopes, sensitivity, fallback behavior, and workspace override. It would be stronger with an explicit comparison to related webhook delivery tools, but it is otherwise sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the nested query object is documented by the schema. The description reinforces that exactly one event type is required and that results are newest first, and it mentions workspace override, but it adds little about the limit parameter or enum semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List canonical webhook events') and scopes the operation to one event type, newest first. It is clear what the tool does, though it does not explicitly differentiate itself from related webhook tools such as luca_webhooks_deliveries_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the fallback behavior when no events exist and how to override the workspace, which gives useful usage context. However, it does not say when to use this tool versus luca_webhooks_deliveries_list or the replay tools, nor does it state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_events_replayReplay a webhook eventADestructiveInspect
Replay one canonical webhook event. Re-triggers subscribers' downstream automations.
Luca operation: POST /api/webhook-subscriptions/events/{eventId}/replay Required scopes: webhooks:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| eventId | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by naming the actual downstream effect (subscribers' automations re-fire), the required scopes (webhooks:write, luca:full), the redacted data sensitivity, and the server-side idempotency-key generation fallback. It repeats the destructiveHint signal rather than refining it, and says nothing about partial-failure behavior or whether replays are themselves reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first line and the operational constraints follow in a compact block of labeled lines. The endpoint-path and scope metadata are boilerplate but cheap, and there is no redundant prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described; within that constraint the description covers auth scopes, the destructive confirm gate, idempotency strategy, and workspace override. That is enough for an agent to invoke this single-event replay correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 67% schema coverage, the schema already documents confirm, idempotencyKey, workspaceId and workspaceSlug – the description largely restates those same points. eventId is required yet only constrained by minLength, and the nested body.subscriptionId is undocumented in both schema and description, leaving its purpose unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replay one canonical webhook event') plus the consequence ('Re-triggers subscribers' downstream automations'). The word 'one' implicitly separates it from bulk replay, but the sibling luca_webhooks_events_bulk_replay is never named, so the differentiation must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions for invocation (must pass confirm: true, idempotencyKey for safe retries) but never states when to choose this over bulk_replay or deliveries_replay. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_signature_guideRead the webhook signature guideARead-onlyIdempotentInspect
Describe Luca webhook HMAC verification.
Luca operation: GET /api/webhook-subscriptions/signature-guide Required scopes: webhooks:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. The description adds useful context beyond that: the exact endpoint, the webhooks:read scope, OAuth scope luca:read, and that data sensitivity is redacted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by terse operation/scope metadata lines. Nothing is redundant, though the stacked metadata lines read more like a spec dump than prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, and the description covers endpoint, scopes, idempotency, and workspace override. It is essentially complete for a read-only guide tool, missing only explicit competitive framing against the other webhook tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both params are optional, so the baseline is 3. The description goes slightly beyond the schema by explaining that workspaceId/workspaceSlug override 'the default workspace configured by environment', which the schema's 'Optional ... override' text does not fully convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: describe Luca webhook HMAC verification, with the concrete operation GET /api/webhook-subscriptions/signature-guide. It is clearly distinguishable from siblings like luca_webhooks_test_delivery or luca_webhooks_subscriptions_create, though it does not explicitly contrast itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives operational context (required scopes, no idempotency requirement, workspace override) but never states when an agent should reach for this guide versus other webhook tools. Usage is implied by the tool name rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_subscriptions_createCreate a webhook subscriptionADestructiveInspect
Create an outbound webhook subscription.
Luca operation: POST /api/webhook-subscriptions Required scopes: webhooks:write Required OAuth scope: luca:full; data sensitivity: redacted Does not require idempotency. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While the annotations mark it as destructive, the description adds critical behavioral context by specifying *how* the destruction is governed (the `confirm: true` gate). It also clarifies operational constraints like scoping and required OAuth scopes, providing richer behavioral context than the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The information is dense but highly structured. It front-loads the core purpose, follows with required operational parameters (scopes), and concludes with critical safety and contextual requirements, maximizing efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a complex, destructive API call, the definition is comprehensive. It covers the endpoint, required permissions, safety gates, and deployment/scoping context (default workspace vs. override), leaving virtually no operational uncertainty for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides meaning beyond the schema by detailing the operational inputs (`confirm: true`) and the purpose of the scoping parameters (`workspaceId` or `workspaceSlug` override). This compensates for the 75% schema coverage by clarifying necessary operational logic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create an outbound webhook subscription') and provides the associated REST operation (`POST /api/webhook-subscriptions`). This is specific and leaves no ambiguity regarding its function relative to sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description sets multiple critical usage rules: it defines the necessary scopes, explicitly warns of a 'real-world side effect,' and dictates a non-negotiable usage pattern: 'You must pass confirm: true.' This level of instruction is exceptional for ensuring safe and correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_subscriptions_deleteDelete a webhook subscriptionADestructiveIdempotentInspect
Delete an outbound webhook subscription. Terminal, idempotent soft delete: delivery history stays queryable and the subscription can never be resurrected.
Luca operation: DELETE /api/webhook-subscriptions/{id} Required scopes: webhooks:write Required OAuth scope: luca:full; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint, but the description adds key non-obvious behavior: the delete is soft, delivery history remains queryable, and the subscription cannot be resurrected. Required scopes (webhooks:write, luca:full) are also disclosed. The 'Does not require idempotency' line is slightly confusing next to idempotentHint=true, but is best read as no idempotency key needed — not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the behavioral warning in the first sentence, then structured metadata on separate lines. The scope/OAuth lines are boilerplate but compact and relevant; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutation tool with strong annotation coverage, an output schema, and a description that supplies the crucial soft-delete/irreversibility context plus auth requirements. An agent has everything needed to call it safely; only an explicit alternative-path pointer is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% with workspaceId/workspaceSlug already described there; the description adds the meaningful detail that those params override a default workspace configured by the environment. The required 'id' has only a UUID pattern and no prose, but its role is obvious from the operation path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete an outbound webhook subscription') and immediately clarifies that it is a soft delete with terminal semantics, distinguishing it from luca_webhooks_subscriptions_update/list. Also names the underlying endpoint, so an agent can map it precisely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong usage context: 'terminal, idempotent soft delete' that 'can never be resurrected', which warns the agent this is irreversible at the logical level. It does not point at an alternative sibling (e.g., disable via update), so the when-not-to-use branch is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_subscriptions_listList webhook subscriptionsARead-onlyIdempotentInspect
List outbound webhook subscriptions.
Luca operation: GET /api/webhook-subscriptions Required scopes: webhooks:read Required OAuth scope: luca:read; data sensitivity: redacted Does not require idempotency. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds genuine value beyond that with the OAuth scope requirements and the "data sensitivity: redacted" note, telling the agent the payload is sanitized. The "Does not require idempotency" line merely restates idempotentHint, so it is redundant rather than harmful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key purpose is front-loaded in the first line, followed by a compact metadata block. Most lines earn their place, but "Does not require idempotency" is boilerplate that duplicates the annotation and could be dropped.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be described, and the description covers auth scopes, data sensitivity, and workspace scoping. The remaining gap is the behavior of the query parameters (pagination limit, includeHealth default of true), which an agent would need to invoke the tool efficiently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description reinforces the workspaceId/workspaceSlug override behavior by explaining that it overrides the environment-configured default, which is useful context the schema only hints at. However, the nested query parameters (limit, includeHealth) have no descriptions in the schema and no explanation in the description, leaving the includeHealth enum semantics undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List outbound webhook subscriptions") and grounds it in the concrete endpoint GET /api/webhook-subscriptions. It is clearly distinguishable from the mutating siblings (create/update/delete) by the name and verb, though it never explicitly separates itself from the read-only siblings like luca_webhooks_deliveries_list or luca_webhooks_events_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the required scopes (webhooks:read, luca:read) and explains the workspace override pattern, which implies the calling context. However, there is no explicit guidance on when to choose this over luca_webhooks_deliveries_list or luca_webhooks_events_list, which are the plausible confusable read tools in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_subscriptions_updateUpdate a webhook subscriptionADestructiveInspect
Update an outbound webhook subscription.
Luca operation: PATCH /api/webhook-subscriptions/{id} Required scopes: webhooks:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, and the description reinforces this with a concrete consequence ('sends workspace events to an outside URL') plus the confirm: true rejection rule. It also adds genuinely non-obvious behavior: an Idempotency-Key is required and the server generates one if omitted, scopes are enumerated, and data sensitivity is marked 'redacted'. The idempotency note does not contradict idempotentHint=false — it describes the key mechanism that makes retries safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line, followed by short scannable lines for operation, scopes, idempotency, the destructive gate, and workspace override. It reads as a template with some boilerplate repetition of the confirm rationale, but no line is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations plus the description cover safety and auth. What's missing for a PATCH mutation with a nested body is the update semantics: which fields are patchable, whether omitted fields are left unchanged, and whether changing targetUrl or eventTypes affects in-flight deliveries or requires re-verification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the description covers three of the six parameters (idempotencyKey, confirm, workspaceId/workspaceSlug) with meaningful context about defaults and server-side generation. The significant gap is the nested `body` object: the description never mentions that status, targetUrl, eventTypes, or consumerMetadata are the fields being updated, so the agent must read the schema to learn what can actually change.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Update an outbound webhook subscription') and anchors it to the concrete operation PATCH /api/webhook-subscriptions/{id}. The tool name plus this text makes it distinguishable from luca_webhooks_subscriptions_create/delete/list, though the description itself never explicitly contrasts with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives solid preconditions — required scopes (webhooks:write, luca:full), the mandatory confirm: true gate, and workspace override behavior — which tells the agent how to invoke it successfully. However, there is no guidance on when to choose this over luca_webhooks_subscriptions_create, delete, or test_delivery, and no statement of what a partial update does versus a full replace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
luca_webhooks_test_deliverySend a test webhookADestructiveInspect
Queue a canonical test webhook event.
Luca operation: POST /api/webhook-subscriptions/test-delivery Required scopes: webhooks:write Required OAuth scope: luca:full; data sensitivity: redacted Requires Idempotency-Key. Provide idempotencyKey for safe retries, or the server will generate one. Destructive: has a real-world side effect. You must pass confirm: true; the call is rejected without it. Use workspaceId or workspaceSlug to override the default workspace configured by environment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| confirm | No | This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it. | |
| workspaceId | No | Optional Luca workspace id override. | |
| workspaceSlug | No | Optional Luca workspace slug override. | |
| idempotencyKey | No | Stable key for safe retries. If omitted, the MCP server generates a unique key for this call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the underlying operation (POST /api/webhook-subscriptions/test-delivery), required scopes, the intent scope and data sensitivity, the Idempotency-Key requirement with server-side generation fallback, and the hard confirm: true gate. These are exactly the side-effect and auth facts an agent needs before invoking a destructive, open-world call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then organized into short labeled lines for operation, scopes, idempotency, destructiveness, and workspace override. The "Luca operation" and scope lines are somewhat boilerplate but each carries a distinct fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations and an output schema already present, the description fills the remaining gaps: side-effect confirmation, idempotency behavior, auth/scope requirements, and workspace scoping. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the baseline is 3. The description adds useful meaning for idempotencyKey, confirm, and the workspaceId/workspaceSlug override, but says nothing about the body payload or the event `type` enum, which is the tool's most consequential argument and is left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Queue a canonical test webhook event", which is clearly distinct from the sibling write tools (subscriptions_create/update, events_replay, deliveries_replay). It does not explicitly name which sibling to use instead for real deliveries or replays, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The "test" framing makes the intended context (verifying an endpoint/subscription) clear, and it lists the operational preconditions: webhooks:write scope, Idempotency-Key, and confirm: true. It gives no explicit when-not-to-use guidance or pointer to the alternative tool for triggering real or replayed events.
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.
79 tool updates
v0.4.1- Changed
luca_analytics_call_intelligence2 fields changed- added
Input schema / properties / query / properties / channelAdded value: +{ + "enum": [ + "telegram", + "instagram", + "messenger", + "whatsapp" + ], + "type": "string" +} - added
Input schema / properties / query / properties / periodAdded value: +{ + "enum": [ + "this_week", + "this_month", + "last_week", + "last_month", + "last_30_days" + ], + "type": "string" +}
- Changed
luca_book_call10 fields changed- changed
Input schema / properties / bookingTypeId / descriptionPrevious value: -"The booking type to book under, from luca_bookings_types_list. Required when provider is google_calendar, and it must be an active google_calendar type."New value: +"The call type to book, from luca_bookings_types_list. Its provider is the calendar the call lands on." - changed
Input schema / properties / idempotencyKey / descriptionPrevious value: -"Reuse the same key when retrying this exact booking. A keyed call skips the availability check and lets the API replay the first result."New value: +"Reuse the same key when retrying this exact booking, so a repeat of a request that already reached the API cannot book the call twice." - added
Input schema / properties / inviteeEmailAdded value: +{ + "description": "The lead's email. The provider sends the invite there.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / inviteeNameAdded value: +{ + "description": "The lead's name as the invite should show it.", + "maxLength": 200, + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / providerRemoved value: -{ - "description": "The coach's booking provider. Sent with the booking and used for the availability check. Pass it when the coach is not on Calendly, or the availability check reads the wrong calendar. Left off, the check reads Calendly and the API records the booking as manual.", - "enum": [ - "manual", - "calendly", - "cal_com", - "google_calendar", - "iclosed", - "gohighlevel" - ], - "type": "string" -} - changed
Input schema / properties / slotAt / descriptionPrevious value: -"ISO-8601 start time for the call, with an offset."New value: +"ISO-8601 start time for the call, with an offset. It must be an open slot of the call type, as luca_bookings_managed_availability lists them." - added
Input schema / properties / timezoneAdded value: +{ + "description": "IANA time zone the booking is shown in, such as Europe/Madrid. Defaults to UTC.", + "minLength": 1, + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "leadId", - "slotAt" -]New value: +[ + "leadId", + "bookingTypeId", + "slotAt", + "inviteeEmail" +] - removed
Output schema / properties / provenanceRemoved value: -{ - "additionalProperties": false, - "properties": { - "note": { - "type": "string" - }, - "untrusted": { - "enum": [ - true - ], - "type": "boolean" - } - }, - "required": [ - "untrusted", - "note" - ], - "type": "object" -} - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "booked": { - "enum": [ - false - ], - "type": "boolean" - }, - "openSlots": { - "items": { - "type": "string" - }, - "type": "array" - }, - "reason": { - "enum": [ - "slot_not_available" - ], - "type": "string" - }, - "requestedSlotAt": { - "type": "string" - } - }, - "required": [ - "booked", - "reason", - "requestedSlotAt", - "openSlots" - ], - "type": "object" - }, - { - "additionalProperties": true, - "properties": { - "booking": { - "additionalProperties": true, - "properties": { - "bookingTypeId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "calendlyEventId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "calendlyInviteeId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "cancellationReason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "cancelledAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "coachId": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "endAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "leadId": { - "type": "string" - }, - "locationDetails": { - "type": "object" - }, - "locationType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "outcomeObservedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "outcomeSource": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "provider": { - "type": "string" - }, - "providerEventId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "providerInviteeId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "providerVersion": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "rawPayload": { - "type": "object" - }, - "reconciliationState": { - "type": "string" - }, - "rescheduledFromBookingId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "slotAt": { - "type": "string" - }, - "status": { - "type": "string" - }, - "timezone": { - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "type": "object" - }, - "operation": { - "additionalProperties": true, - "properties": { - "providerSyncId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "state": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object", - "x-luca-redacted-fields": [ - "booking.rawPayload" - ] - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "booked": { + "enum": [ + false + ], + "type": "boolean" + }, + "openSlots": { + "items": { + "type": "string" + }, + "type": "array" + }, + "reason": { + "enum": [ + "slot_not_available" + ], + "type": "string" + }, + "requestedSlotAt": { + "type": "string" + } + }, + "required": [ + "booked", + "reason", + "requestedSlotAt", + "openSlots" + ], + "type": "object" + }, + { + "additionalProperties": true, + "properties": { + "bookingId": { + "type": "string" + }, + "displayText": { + "type": "string" + }, + "finalStartsAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "managementUrl": { + "type": "string" + }, + "meetingUrl": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "state": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "type": "object" + } +]
- Changed
luca_bookings_availability2 fields changed- added
Input schema / properties / query / properties / end / descriptionAdded value: +"End of the time range, exclusive. Defaults to 7 days after start." - added
Input schema / properties / query / properties / start / descriptionAdded value: +"Start of the time range, inclusive. Defaults to now."
- Changed
luca_bookings_create2 fields changed- added
Input schema / properties / body / properties / locationDetails / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Input schema / properties / body / properties / rawPayload / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
luca_bookings_managed_availability3 fields changed- added
Input schema / properties / query / properties / end / descriptionAdded value: +"End of the time range, exclusive. Defaults to 7 days after start." - added
Input schema / properties / query / properties / start / descriptionAdded value: +"Start of the time range, inclusive. Defaults to now." - added
Input schema / requiredAdded value: +[ + "query" +]
- Added
luca_bookings_provider_requests_create - Added
luca_bookings_provider_requests_get - Added
luca_bookings_recovery_get - Added
luca_bookings_recovery_stop - Changed
luca_bookings_update1 field changed- added
Input schema / properties / body / properties / rawPayload / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
luca_broadcasts_approve2 fields changed- added
Output schema / properties / result / properties / retryBlockedReasonAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "recipients[].messageBody", - "safetyReport.findings[].evidence", - "sampleMessages[].body", - "segmentSnapshot.excludedRecipients[].displayName", - "segmentSnapshot.leads[].customFields", - "segmentSnapshot.leads[].displayName", - "segmentSnapshot.leads[].messageBody" -]New value: +[ + "recipients[].messageBody", + "safetyReport.findings[].evidence", + "sampleMessages[].body", + "segmentSnapshot.excludedRecipients[].displayName", + "segmentSnapshot.leads[].customFields", + "segmentSnapshot.leads[].displayName", + "segmentSnapshot.leads[].messageBody", + "segmentSnapshot.leads[].templateMapping", + "segmentSnapshot.leads[].templatePart" +]
- Changed
luca_broadcasts_cancel3 fields changed- changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +] - added
Output schema / properties / result / properties / retryBlockedReasonAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "recipients[].messageBody", - "safetyReport.findings[].evidence", - "sampleMessages[].body", - "segmentSnapshot.excludedRecipients[].displayName", - "segmentSnapshot.leads[].customFields", - "segmentSnapshot.leads[].displayName", - "segmentSnapshot.leads[].messageBody" -]New value: +[ + "recipients[].messageBody", + "safetyReport.findings[].evidence", + "sampleMessages[].body", + "segmentSnapshot.excludedRecipients[].displayName", + "segmentSnapshot.leads[].customFields", + "segmentSnapshot.leads[].displayName", + "segmentSnapshot.leads[].messageBody", + "segmentSnapshot.leads[].templateMapping", + "segmentSnapshot.leads[].templatePart" +]
- Changed
luca_broadcasts_create4 fields changed- added
Input schema / properties / body / properties / segment / properties / groups / items / properties / rules / items / properties / value / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / body / properties / segment / properties / rules / items / properties / value / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +] - added
Output schema / properties / result / properties / retryBlockedReasonAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "recipients[].messageBody", - "safetyReport.findings[].evidence", - "sampleMessages[].body", - "segmentSnapshot.excludedRecipients[].displayName", - "segmentSnapshot.leads[].customFields", - "segmentSnapshot.leads[].displayName", - "segmentSnapshot.leads[].messageBody" -]New value: +[ + "recipients[].messageBody", + "safetyReport.findings[].evidence", + "sampleMessages[].body", + "segmentSnapshot.excludedRecipients[].displayName", + "segmentSnapshot.leads[].customFields", + "segmentSnapshot.leads[].displayName", + "segmentSnapshot.leads[].messageBody", + "segmentSnapshot.leads[].templateMapping", + "segmentSnapshot.leads[].templatePart" +]
- Changed
luca_broadcasts_get2 fields changed- added
Output schema / properties / result / properties / retryBlockedReasonAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "recipients[].messageBody", - "safetyReport.findings[].evidence", - "sampleMessages[].body", - "segmentSnapshot.excludedRecipients[].displayName", - "segmentSnapshot.leads[].customFields", - "segmentSnapshot.leads[].displayName", - "segmentSnapshot.leads[].messageBody" -]New value: +[ + "recipients[].messageBody", + "safetyReport.findings[].evidence", + "sampleMessages[].body", + "segmentSnapshot.excludedRecipients[].displayName", + "segmentSnapshot.leads[].customFields", + "segmentSnapshot.leads[].displayName", + "segmentSnapshot.leads[].messageBody", + "segmentSnapshot.leads[].templateMapping", + "segmentSnapshot.leads[].templatePart" +]
- Changed
luca_broadcasts_launch2 fields changed- added
Output schema / properties / result / properties / retryBlockedReasonAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "recipients[].messageBody", - "safetyReport.findings[].evidence", - "sampleMessages[].body", - "segmentSnapshot.excludedRecipients[].displayName", - "segmentSnapshot.leads[].customFields", - "segmentSnapshot.leads[].displayName", - "segmentSnapshot.leads[].messageBody" -]New value: +[ + "recipients[].messageBody", + "safetyReport.findings[].evidence", + "sampleMessages[].body", + "segmentSnapshot.excludedRecipients[].displayName", + "segmentSnapshot.leads[].customFields", + "segmentSnapshot.leads[].displayName", + "segmentSnapshot.leads[].messageBody", + "segmentSnapshot.leads[].templateMapping", + "segmentSnapshot.leads[].templatePart" +]
- Changed
luca_broadcasts_pause3 fields changed- changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +] - added
Output schema / properties / result / properties / retryBlockedReasonAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "recipients[].messageBody", - "safetyReport.findings[].evidence", - "sampleMessages[].body", - "segmentSnapshot.excludedRecipients[].displayName", - "segmentSnapshot.leads[].customFields", - "segmentSnapshot.leads[].displayName", - "segmentSnapshot.leads[].messageBody" -]New value: +[ + "recipients[].messageBody", + "safetyReport.findings[].evidence", + "sampleMessages[].body", + "segmentSnapshot.excludedRecipients[].displayName", + "segmentSnapshot.leads[].customFields", + "segmentSnapshot.leads[].displayName", + "segmentSnapshot.leads[].messageBody", + "segmentSnapshot.leads[].templateMapping", + "segmentSnapshot.leads[].templatePart" +]
- Changed
luca_broadcasts_preview3 fields changed- changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +] - added
Output schema / properties / result / properties / retryBlockedReasonAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "recipients[].messageBody", - "safetyReport.findings[].evidence", - "sampleMessages[].body", - "segmentSnapshot.excludedRecipients[].displayName", - "segmentSnapshot.leads[].customFields", - "segmentSnapshot.leads[].displayName", - "segmentSnapshot.leads[].messageBody" -]New value: +[ + "recipients[].messageBody", + "safetyReport.findings[].evidence", + "sampleMessages[].body", + "segmentSnapshot.excludedRecipients[].displayName", + "segmentSnapshot.leads[].customFields", + "segmentSnapshot.leads[].displayName", + "segmentSnapshot.leads[].messageBody", + "segmentSnapshot.leads[].templateMapping", + "segmentSnapshot.leads[].templatePart" +]
- Changed
luca_broadcasts_retry3 fields changed- changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +] - added
Output schema / properties / result / properties / retryBlockedReasonAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "recipients[].messageBody", - "safetyReport.findings[].evidence", - "sampleMessages[].body", - "segmentSnapshot.excludedRecipients[].displayName", - "segmentSnapshot.leads[].customFields", - "segmentSnapshot.leads[].displayName", - "segmentSnapshot.leads[].messageBody" -]New value: +[ + "recipients[].messageBody", + "safetyReport.findings[].evidence", + "sampleMessages[].body", + "segmentSnapshot.excludedRecipients[].displayName", + "segmentSnapshot.leads[].customFields", + "segmentSnapshot.leads[].displayName", + "segmentSnapshot.leads[].messageBody", + "segmentSnapshot.leads[].templateMapping", + "segmentSnapshot.leads[].templatePart" +]
- Changed
luca_cadences_pause1 field changed- changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +]
- Changed
luca_call_events_feedback1 field changed- added
Input schema / properties / body / properties / expectedOutcomeUpdatedAtAdded value: +{ + "anyOf": [ + { + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + { + "type": "null" + } + ], + "format": "date-time" +}
- Changed
luca_campaigns_comment_events_list2 fields changed- removed
Output schema / properties / result / properties / analytics / properties / pendingReviewRemoved value: -{ - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" -} - removed
Output schema / properties / result / properties / analytics / properties / reviewRateRemoved value: -{ - "type": "number" -}
- Changed
luca_campaigns_comment_simulation_suite_run1 field changed- changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +]
- Changed
luca_campaigns_create2 fields changed- added
Input schema / properties / body / properties / graph / properties / edges / items / properties / condition / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Input schema / properties / body / properties / graph / properties / nodes / items / properties / config / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
luca_campaigns_draft_update2 fields changed- added
Input schema / properties / body / properties / graph / properties / edges / items / properties / condition / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Input schema / properties / body / properties / graph / properties / nodes / items / properties / config / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
luca_campaigns_generate2 fields changed- added
Input schema / properties / body / properties / existingGraph / properties / edges / items / properties / condition / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Input schema / properties / body / properties / existingGraph / properties / nodes / items / properties / config / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
luca_campaigns_set_status1 field changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_campaigns_simulations_create4 fields changed- added
Input schema / properties / body / properties / context / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Input schema / properties / body / properties / eventPayload / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Input schema / properties / body / properties / lead / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +]
- Changed
luca_channels_get2 fields changed- added
Output schema / properties / result / properties / aiDmAutoSendActiveAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / result / properties / aiDmAutoSendEnabledAdded value: +{ + "type": "boolean" +}
- Added
luca_channels_set_ai_dm_auto_send - Changed
luca_close_call_loop1 field changed- changed
Output schema / properties / result / properties / feedback / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": true, - "properties": { - "callEvent": { - "additionalProperties": true, - "properties": { - "bookedAt": { - "type": "string" - }, - "bookingId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "callSequenceNumber": { - "type": "number" - }, - "coachNotes": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "coachRating": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "completedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "createdAt": { - "type": "string" - }, - "crmPermanentlyFailed": { - "type": "boolean" - }, - "crmSyncError": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "crmSyncStatus": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "crmSynced": { - "type": "boolean" - }, - "feedbackFields": { - "anyOf": [ - { - "additionalProperties": true, - "properties": { - "followUpNeeded": { - "type": "boolean" - }, - "followUpNote": { - "type": "string" - }, - "objectionHandlingAccurate": { - "type": "boolean" - }, - "surprise": { - "type": "string" - }, - "wasQualified": { - "type": "string" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - }, - "id": { - "type": "string" - }, - "leadChannel": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "leadId": { - "type": "string" - }, - "leadName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "outcome": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "outcomeUpdatedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "scheduledAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "summary": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "summarySource": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "summaryStatus": { - "type": "string" - }, - "summaryStructured": { - "anyOf": [ - { - "additionalProperties": true, - "properties": { - "bookingTriggers": { - "type": "array" - }, - "coachingRecommendation": { - "type": "string" - }, - "crmNote": { - "type": "string" - }, - "keyObjections": { - "type": "array" - }, - "leadGoals": { - "type": "array" - }, - "riskFactors": { - "type": "array" - } - }, - "type": "object" - }, - { - "type": "null" - } - ] - } - }, - "type": "object" - } - }, - "type": "object", - "x-luca-redacted-fields": [ - "callEvent.coachNotes", - "callEvent.crmSyncError", - "callEvent.feedbackFields.followUpNote", - "callEvent.feedbackFields.surprise", - "callEvent.leadName", - "callEvent.summary", - "callEvent.summaryStructured" - ] - }, - { - "additionalProperties": false, - "properties": { - "feedbackError": { - "type": "string" - } - }, - "required": [ - "feedbackError" - ], - "type": "object" - } - ] - }, - { - "additionalProperties": false, - "properties": { - "reason": { - "enum": [ - "no_call_event_for_booking" - ], - "type": "string" - }, - "reported": { - "enum": [ - false - ], - "type": "boolean" - } - }, - "required": [ - "reported", - "reason" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "callEvent": { + "additionalProperties": true, + "properties": { + "bookedAt": { + "type": "string" + }, + "bookingId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "callSequenceNumber": { + "type": "number" + }, + "coachNotes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "coachRating": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "completedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": "string" + }, + "crmPermanentlyFailed": { + "type": "boolean" + }, + "crmSyncError": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "crmSyncStatus": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "crmSynced": { + "type": "boolean" + }, + "feedbackFields": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "followUpNeeded": { + "type": "boolean" + }, + "followUpNote": { + "type": "string" + }, + "objectionHandlingAccurate": { + "type": "boolean" + }, + "surprise": { + "type": "string" + }, + "wasQualified": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "leadChannel": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "leadId": { + "type": "string" + }, + "leadName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "outcome": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "outcomeUpdatedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "summary": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "summarySource": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "summaryStatus": { + "type": "string" + }, + "summaryStructured": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "bookingTriggers": { + "type": "array" + }, + "coachingRecommendation": { + "type": "string" + }, + "crmNote": { + "type": "string" + }, + "keyObjections": { + "type": "array" + }, + "leadGoals": { + "type": "array" + }, + "riskFactors": { + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + }, + "type": "object", + "x-luca-redacted-fields": [ + "callEvent.coachNotes", + "callEvent.crmSyncError", + "callEvent.feedbackFields.followUpNote", + "callEvent.feedbackFields.surprise", + "callEvent.leadName", + "callEvent.summary", + "callEvent.summaryStructured" + ] + }, + { + "additionalProperties": false, + "properties": { + "feedbackError": { + "type": "string" + } + }, + "required": [ + "feedbackError" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "reason": { + "enum": [ + "no_call_event_for_booking" + ], + "type": "string" + }, + "reported": { + "enum": [ + false + ], + "type": "boolean" + } + }, + "required": [ + "reported", + "reason" + ], + "type": "object" + } +]
- Changed
luca_coach_niche_profile1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "audience": { - "type": "string" - }, - "callToAction": { - "type": "string" - }, - "defaultLanguage": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "disqualifiers": { - "type": "array" - }, - "faqs": { - "type": "array" - }, - "guarantees": { - "type": "array" - }, - "languages": { - "type": "array" - }, - "niche": { - "type": "string" - }, - "objections": { - "type": "array" - }, - "offer": { - "type": "string" - }, - "offers": { - "type": "array" - }, - "outcomes": { - "type": "array" - }, - "priceRange": { - "type": "string" - }, - "profileUpdatedAt": { - "type": "string" - }, - "sellFramework": { - "additionalProperties": true, - "properties": { - "customGuidance": { - "type": "string" - }, - "customStages": { - "type": "array" - }, - "id": { - "type": "string" - }, - "objectionPriorityOverride": { - "type": "array" - }, - "overrides": { - "type": "array" - } - }, - "type": "object" - }, - "sensitivity": { - "type": "string" - }, - "testimonials": { - "type": "array" - }, - "toneBoundaries": { - "type": "array" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "audience": { + "type": "string" + }, + "bookingUrl": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "callMinutes": { + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "callToAction": { + "type": "string" + }, + "defaultLanguage": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "disqualifiers": { + "type": "array" + }, + "faqs": { + "type": "array" + }, + "guarantees": { + "type": "array" + }, + "languages": { + "type": "array" + }, + "niche": { + "type": "string" + }, + "objections": { + "type": "array" + }, + "offer": { + "type": "string" + }, + "offers": { + "type": "array" + }, + "outcomes": { + "type": "array" + }, + "priceRange": { + "type": "string" + }, + "profileUpdatedAt": { + "type": "string" + }, + "sellFramework": { + "additionalProperties": true, + "properties": { + "customGuidance": { + "type": "string" + }, + "customStages": { + "type": "array" + }, + "id": { + "type": "string" + }, + "objectionPriorityOverride": { + "type": "array" + }, + "overrides": { + "type": "array" + } + }, + "type": "object" + }, + "sensitivity": { + "type": "string" + }, + "testimonials": { + "type": "array" + }, + "toneBoundaries": { + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
luca_conversations_get6 fields changed- added
Output schema / properties / result / properties / conversation / properties / qualificationProgress / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +] - added
Output schema / properties / result / properties / conversation / properties / unreadAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / result / properties / lead / properties / customFields / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / properties / result / properties / pendingReview / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "coachId": { - "type": "string" - }, - "confidence": { - "type": "number" - }, - "conversationId": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "criticIssues": {}, - "draftBody": { - "type": "string" - }, - "id": { - "type": "string" - }, - "originThreadId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "qualification": {}, - "resolvedAt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "sourceMessageId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "status": { - "type": "string" - }, - "voiceMatchScore": { - "type": "number" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "coachId": { + "type": "string" + }, + "confidence": { + "type": "number" + }, + "conversationId": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "criticIssues": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "draftBody": { + "type": "string" + }, + "id": { + "type": "string" + }, + "originThreadId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "qualification": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "resolvedAt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "sourceMessageId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": "string" + }, + "voiceMatchScore": { + "type": "number" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / result / properties / replyFailuresAdded value: +{ + "type": "array" +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "conversation.qualificationProgress", - "copilotContext.leadDisplayName", - "lead.customFields", - "lead.displayName", - "lead.externalUserId", - "lead.profilePhotoUrl", - "messages[].body", - "messages[].media", - "messages[].mediaUrls", - "messages[].rawPayload", - "pendingReview.criticIssues", - "pendingReview.draftBody", - "pendingReview.qualification" -]New value: +[ + "conversation.qualificationProgress", + "copilotContext.leadDisplayName", + "lead.customFields", + "lead.displayName", + "lead.externalUserId", + "lead.profilePhotoUrl", + "messages[].body", + "messages[].media", + "messages[].mediaUrls", + "messages[].rawPayload", + "pendingReview.criticIssues", + "pendingReview.draftBody", + "pendingReview.qualification", + "replyFailures[].body", + "replyFailures[].content" +]
- Changed
luca_conversations_list1 field changed- added
Input schema / properties / query / properties / leadIdAdded value: +{ + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" +}
- Added
luca_conversations_media_retry - Added
luca_conversations_reply_failure_dismiss - Added
luca_conversations_reply_failure_retry - Changed
luca_conversations_send2 fields changed- changed
Input schema / properties / body / properties / outboundContent / properties / parts / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "id": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "text": { - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "text" - ], - "type": "string" - } - }, - "required": [ - "id", - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "altText": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - "caption": { - "maxLength": 1024, - "minLength": 1, - "type": "string" - }, - "fileName": { - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "id": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "mediaKind": { - "enum": [ - "image", - "video", - "audio", - "voice", - "document" - ], - "type": "string" - }, - "type": { - "enum": [ - "media" - ], - "type": "string" - }, - "uploadId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - } - }, - "required": [ - "id", - "type", - "uploadId", - "mediaKind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "expiresAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "id": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "interactionKind": { - "enum": [ - "buttons", - "list", - "quick_replies", - "inline_buttons" - ], - "type": "string" - }, - "options": { - "items": { - "additionalProperties": false, - "properties": { - "action": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bookingTypeId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "endsAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "inviteeEmail": { - "format": "email", - "type": "string" - }, - "inviteeName": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "slotId": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "startsAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "timezone": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "booking.select_slot" - ], - "type": "string" - } - }, - "required": [ - "type", - "bookingTypeId", - "slotId", - "startsAt", - "endsAt", - "timezone", - "inviteeEmail" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bookingId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "bookingTypeId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "endsAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "slotId": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "startsAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "timezone": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "booking.reschedule" - ], - "type": "string" - } - }, - "required": [ - "type", - "bookingId", - "bookingTypeId", - "slotId", - "startsAt", - "endsAt", - "timezone" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bookingId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "reason": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "booking.cancel" - ], - "type": "string" - } - }, - "required": [ - "type", - "bookingId" - ], - "type": "object" - } - ] - }, - "description": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "title": { - "maxLength": 200, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "id", - "title" - ], - "type": "object" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "prompt": { - "maxLength": 1024, - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "interactive" - ], - "type": "string" - } - }, - "required": [ - "id", - "type", - "interactionKind", - "prompt", - "options" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "language": { - "minLength": 1, - "type": "string" - }, - "name": { - "minLength": 1, - "type": "string" - }, - "parameters": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "buttonIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "enum": [ - "header", - "body", - "button" - ], - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "key": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "text" - ], - "type": "string" - }, - "parameterName": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "value": { - "maxLength": 4096, - "type": "string" - } - }, - "required": [ - "key", - "component", - "index", - "kind", - "value" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "buttonIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "enum": [ - "header" - ], - "type": "string" - }, - "fileName": { - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "key": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "image", - "video", - "document" - ], - "type": "string" - }, - "parameterName": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "uploadId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - } - }, - "required": [ - "key", - "component", - "index", - "kind", - "uploadId" - ], - "type": "object" - } - ] - }, - "maxItems": 100, - "type": "array" - }, - "providerMetadata": { - "type": "object" - }, - "renderedPreview": { - "maxLength": 16000, - "type": "string" - }, - "templateId": { - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "template" - ], - "type": "string" - }, - "versionHash": { - "pattern": "^sha256:[a-f0-9]{64}$", - "type": "string" - } - }, - "required": [ - "id", - "type", - "templateId", - "name", - "language", - "versionHash", - "parameters", - "renderedPreview" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "text": { + "minLength": 1, + "type": "string" + }, + "textGroupId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "type": { + "enum": [ + "text" + ], + "type": "string" + } + }, + "required": [ + "id", + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "altText": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + "caption": { + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + "fileName": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "id": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "mediaKind": { + "enum": [ + "image", + "video", + "audio", + "voice", + "document" + ], + "type": "string" + }, + "type": { + "enum": [ + "media" + ], + "type": "string" + }, + "uploadId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + } + }, + "required": [ + "id", + "type", + "uploadId", + "mediaKind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "expiresAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "id": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "interactionKind": { + "enum": [ + "buttons", + "list", + "quick_replies", + "inline_buttons" + ], + "type": "string" + }, + "options": { + "items": { + "additionalProperties": false, + "properties": { + "action": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bookingTypeId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "endsAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "inviteeEmail": { + "format": "email", + "type": "string" + }, + "inviteeName": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "slotId": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "startsAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "timezone": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "booking.select_slot" + ], + "type": "string" + } + }, + "required": [ + "type", + "bookingTypeId", + "slotId", + "startsAt", + "endsAt", + "timezone", + "inviteeEmail" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bookingId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "bookingTypeId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "endsAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "slotId": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "startsAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "timezone": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "booking.reschedule" + ], + "type": "string" + } + }, + "required": [ + "type", + "bookingId", + "bookingTypeId", + "slotId", + "startsAt", + "endsAt", + "timezone" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bookingId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "reason": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "booking.cancel" + ], + "type": "string" + } + }, + "required": [ + "type", + "bookingId" + ], + "type": "object" + } + ] + }, + "description": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "title": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "title" + ], + "type": "object" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "prompt": { + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "interactive" + ], + "type": "string" + } + }, + "required": [ + "id", + "type", + "interactionKind", + "prompt", + "options" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "id": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "language": { + "minLength": 1, + "type": "string" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "parameters": { + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "buttonIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "component": { + "enum": [ + "header", + "body", + "button" + ], + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "key": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "text" + ], + "type": "string" + }, + "parameterName": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "value": { + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "key", + "component", + "index", + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "buttonIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "component": { + "enum": [ + "header" + ], + "type": "string" + }, + "fileName": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "key": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "image", + "video", + "document" + ], + "type": "string" + }, + "parameterName": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "uploadId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + } + }, + "required": [ + "key", + "component", + "index", + "kind", + "uploadId" + ], + "type": "object" + } + ] + }, + "maxItems": 100, + "type": "array" + }, + "providerMetadata": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "type": "object" + }, + "renderedPreview": { + "maxLength": 16000, + "type": "string" + }, + "templateId": { + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "template" + ], + "type": "string" + }, + "versionHash": { + "pattern": "^sha256:[a-f0-9]{64}$", + "type": "string" + } + }, + "required": [ + "id", + "type", + "templateId", + "name", + "language", + "versionHash", + "parameters", + "renderedPreview" + ], + "type": "object" + } +] - added
Input schema / properties / body / properties / replacesReplyFailureIdAdded value: +{ + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" +}
- Added
luca_conversations_send_status - Changed
luca_integrations_crm_connections_create1 field changed- added
Input schema / properties / body / properties / settings / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +}
- Added
luca_integrations_crm_connections_disconnect - Changed
luca_integrations_crm_connections_webhooks_setup1 field changed- changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +]
- Changed
luca_integrations_crm_mappings_confirm1 field changed- added
Input schema / properties / body / properties / mappings / items / properties / transform / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
luca_integrations_crm_sync_runs_create3 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "This tool has a real-world side effect: it messages real leads, books, moves, or cancels a call, changes a lead's consent, imports leads, writes to a connected calendar or CRM, sends workspace events to an outside URL, or re-triggers downstream automations. Pass confirm: true to proceed; the call is rejected without it.", - "type": "boolean" -} - changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +] - added
Output schema / properties / result / properties / conflictReport / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Removed
luca_knowledge_approve_suggestion - Changed
luca_knowledge_reject_suggestion2 fields changed- added
Output schema / properties / result / properties / suggestion / properties / currentValue / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +] - added
Output schema / properties / result / properties / suggestion / properties / suggestedValue / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_consents_grant1 field changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_consents_revoke1 field changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_create2 fields changed- added
Input schema / properties / body / properties / customFields / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / result / properties / lead / properties / customFields / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_draft1 field changed- changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +]
- Added
luca_leads_drafting_pause - Added
luca_leads_drafting_resume - Changed
luca_leads_explain1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "at": { - "type": "string" - }, - "confidence": { - "type": "number" - }, - "leadId": { - "type": "string" - }, - "qualification": {}, - "status": { - "type": "string" - } - }, - "type": "object" - }, - { - "additionalProperties": true, - "properties": { - "leadId": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "status": { - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "at": { + "type": "string" + }, + "confidence": { + "type": "number" + }, + "leadId": { + "type": "string" + }, + "qualification": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": true, + "properties": { + "leadId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "type": "object" + } +]
- Changed
luca_leads_field_definitions_list1 field changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_field_definitions_upsert2 fields changed- added
Input schema / properties / body / properties / options / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_identities_attach1 field changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_import_apply2 fields changed- added
Input schema / properties / body / properties / rows / items / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_import_preview2 fields changed- added
Input schema / properties / body / properties / rows / items / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_leads_update2 fields changed- added
Input schema / properties / body / properties / customFields / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / result / properties / lead / properties / customFields / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } +]
- Changed
luca_memory_update5 fields changed- added
Input schema / properties / body / properties / evidence / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - added
Input schema / properties / body / properties / metadata / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +] - added
Output schema / properties / result / properties / factOriginAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / result / properties / sourceFieldAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +}
- Changed
luca_review_queue_approve2 fields changed- changed
Input schema / properties / body / properties / outboundContent / properties / parts / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "id": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "text": { - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "text" - ], - "type": "string" - } - }, - "required": [ - "id", - "type", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "altText": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - }, - "caption": { - "maxLength": 1024, - "minLength": 1, - "type": "string" - }, - "fileName": { - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "id": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "mediaKind": { - "enum": [ - "image", - "video", - "audio", - "voice", - "document" - ], - "type": "string" - }, - "type": { - "enum": [ - "media" - ], - "type": "string" - }, - "uploadId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - } - }, - "required": [ - "id", - "type", - "uploadId", - "mediaKind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "expiresAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "id": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "interactionKind": { - "enum": [ - "buttons", - "list", - "quick_replies", - "inline_buttons" - ], - "type": "string" - }, - "options": { - "items": { - "additionalProperties": false, - "properties": { - "action": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "bookingTypeId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "endsAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "inviteeEmail": { - "format": "email", - "type": "string" - }, - "inviteeName": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "slotId": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "startsAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "timezone": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "booking.select_slot" - ], - "type": "string" - } - }, - "required": [ - "type", - "bookingTypeId", - "slotId", - "startsAt", - "endsAt", - "timezone", - "inviteeEmail" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bookingId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "bookingTypeId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "endsAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "slotId": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "startsAt": { - "format": "date-time", - "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", - "type": "string" - }, - "timezone": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "booking.reschedule" - ], - "type": "string" - } - }, - "required": [ - "type", - "bookingId", - "bookingTypeId", - "slotId", - "startsAt", - "endsAt", - "timezone" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bookingId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "reason": { - "maxLength": 500, - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "booking.cancel" - ], - "type": "string" - } - }, - "required": [ - "type", - "bookingId" - ], - "type": "object" - } - ] - }, - "description": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "id": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "title": { - "maxLength": 200, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "id", - "title" - ], - "type": "object" - }, - "maxItems": 20, - "minItems": 1, - "type": "array" - }, - "prompt": { - "maxLength": 1024, - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "interactive" - ], - "type": "string" - } - }, - "required": [ - "id", - "type", - "interactionKind", - "prompt", - "options" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "id": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - }, - "language": { - "minLength": 1, - "type": "string" - }, - "name": { - "minLength": 1, - "type": "string" - }, - "parameters": { - "items": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "buttonIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "enum": [ - "header", - "body", - "button" - ], - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "key": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "text" - ], - "type": "string" - }, - "parameterName": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "value": { - "maxLength": 4096, - "type": "string" - } - }, - "required": [ - "key", - "component", - "index", - "kind", - "value" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "buttonIndex": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "component": { - "enum": [ - "header" - ], - "type": "string" - }, - "fileName": { - "maxLength": 255, - "minLength": 1, - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "key": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "kind": { - "enum": [ - "image", - "video", - "document" - ], - "type": "string" - }, - "parameterName": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "uploadId": { - "format": "uuid", - "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", - "type": "string" - } - }, - "required": [ - "key", - "component", - "index", - "kind", - "uploadId" - ], - "type": "object" - } - ] - }, - "maxItems": 100, - "type": "array" - }, - "providerMetadata": { - "type": "object" - }, - "renderedPreview": { - "maxLength": 16000, - "type": "string" - }, - "templateId": { - "minLength": 1, - "type": "string" - }, - "type": { - "enum": [ - "template" - ], - "type": "string" - }, - "versionHash": { - "pattern": "^sha256:[a-f0-9]{64}$", - "type": "string" - } - }, - "required": [ - "id", - "type", - "templateId", - "name", - "language", - "versionHash", - "parameters", - "renderedPreview" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "id": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "text": { + "minLength": 1, + "type": "string" + }, + "textGroupId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "type": { + "enum": [ + "text" + ], + "type": "string" + } + }, + "required": [ + "id", + "type", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "altText": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + }, + "caption": { + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + "fileName": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "id": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "mediaKind": { + "enum": [ + "image", + "video", + "audio", + "voice", + "document" + ], + "type": "string" + }, + "type": { + "enum": [ + "media" + ], + "type": "string" + }, + "uploadId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + } + }, + "required": [ + "id", + "type", + "uploadId", + "mediaKind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "expiresAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "id": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "interactionKind": { + "enum": [ + "buttons", + "list", + "quick_replies", + "inline_buttons" + ], + "type": "string" + }, + "options": { + "items": { + "additionalProperties": false, + "properties": { + "action": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "bookingTypeId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "endsAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "inviteeEmail": { + "format": "email", + "type": "string" + }, + "inviteeName": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "slotId": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "startsAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "timezone": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "booking.select_slot" + ], + "type": "string" + } + }, + "required": [ + "type", + "bookingTypeId", + "slotId", + "startsAt", + "endsAt", + "timezone", + "inviteeEmail" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bookingId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "bookingTypeId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "endsAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "slotId": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "startsAt": { + "format": "date-time", + "pattern": "^(?:\\d{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|\\d{4}-(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|\\d{4}-02-(?:0[1-9]|1\\d|2[0-8])|(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$", + "type": "string" + }, + "timezone": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "booking.reschedule" + ], + "type": "string" + } + }, + "required": [ + "type", + "bookingId", + "bookingTypeId", + "slotId", + "startsAt", + "endsAt", + "timezone" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "bookingId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "reason": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "booking.cancel" + ], + "type": "string" + } + }, + "required": [ + "type", + "bookingId" + ], + "type": "object" + } + ] + }, + "description": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "id": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "title": { + "maxLength": 200, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "title" + ], + "type": "object" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" + }, + "prompt": { + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "interactive" + ], + "type": "string" + } + }, + "required": [ + "id", + "type", + "interactionKind", + "prompt", + "options" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "id": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + }, + "language": { + "minLength": 1, + "type": "string" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "parameters": { + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "buttonIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "component": { + "enum": [ + "header", + "body", + "button" + ], + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "key": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "text" + ], + "type": "string" + }, + "parameterName": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "value": { + "maxLength": 4096, + "type": "string" + } + }, + "required": [ + "key", + "component", + "index", + "kind", + "value" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "buttonIndex": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "component": { + "enum": [ + "header" + ], + "type": "string" + }, + "fileName": { + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "key": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "kind": { + "enum": [ + "image", + "video", + "document" + ], + "type": "string" + }, + "parameterName": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "uploadId": { + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" + } + }, + "required": [ + "key", + "component", + "index", + "kind", + "uploadId" + ], + "type": "object" + } + ] + }, + "maxItems": 100, + "type": "array" + }, + "providerMetadata": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "type": "object" + }, + "renderedPreview": { + "maxLength": 16000, + "type": "string" + }, + "templateId": { + "minLength": 1, + "type": "string" + }, + "type": { + "enum": [ + "template" + ], + "type": "string" + }, + "versionHash": { + "pattern": "^sha256:[a-f0-9]{64}$", + "type": "string" + } + }, + "required": [ + "id", + "type", + "templateId", + "name", + "language", + "versionHash", + "parameters", + "renderedPreview" + ], + "type": "object" + } +] - changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +]
- Added
luca_review_queue_bulk_approve - Added
luca_review_queue_bulk_reject - Added
luca_review_queue_changes - Added
luca_review_queue_drafting - Added
luca_review_queue_drafting_cancel - Added
luca_review_queue_drafting_dismiss - Added
luca_review_queue_drafting_retry - Changed
luca_review_queue_explain1 field changed- changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "confidence": { - "type": "number" - }, - "createdAt": { - "type": "string" - }, - "criticIssues": {}, - "draftBody": { - "type": "string" - }, - "id": { - "type": "string" - }, - "leadId": { - "type": "string" - }, - "qualification": {}, - "status": { - "type": "string" - }, - "voiceMatchScore": { - "type": "number" - } - }, - "type": "object" - }, - { - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "leadId": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "status": { - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "confidence": { + "type": "number" + }, + "createdAt": { + "type": "string" + }, + "criticIssues": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "draftBody": { + "type": "string" + }, + "id": { + "type": "string" + }, + "leadId": { + "type": "string" + }, + "qualification": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": "string" + }, + "voiceMatchScore": { + "type": "number" + } + }, + "type": "object" + }, + { + "additionalProperties": true, + "properties": { + "id": { + "type": "string" + }, + "leadId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "type": "object" + } +]
- Changed
luca_review_queue_list5 fields changed- added
Input schema / properties / query / properties / leadIdAdded value: +{ + "format": "uuid", + "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", + "type": "string" +} - added
Input schema / properties / query / properties / status / enumAdded value: +[ + "pending", + "approved", + "rejected", + "sent", + "superseded", + "stale" +] - removed
Input schema / properties / query / properties / status / minLengthRemoved value: -1 - added
Output schema / properties / result / properties / asOfAdded value: +{ + "type": "string" +} - changed
Output schema / properties / result / x-luca-redacted-fieldsPrevious value: -[ - "items[].criticIssues", - "items[].draftBody", - "items[].draftParts", - "items[].leadDisplayName", - "items[].media", - "items[].mediaContext", - "items[].objectionVariants", - "items[].qualification", - "items[].safetyFindings", - "items[].signals" -]New value: +[ + "items[].criticIssues", + "items[].draftBody", + "items[].draftContent", + "items[].draftParts", + "items[].leadDisplayName", + "items[].media", + "items[].mediaContext", + "items[].objectionVariants", + "items[].qualification", + "items[].safetyFindings", + "items[].signals" +]
- Added
luca_review_queue_regenerate - Changed
luca_review_queue_reject1 field changed- added
Input schema / properties / bodyAdded value: +{ + "additionalProperties": false, + "properties": { + "note": { + "maxLength": 280, + "minLength": 1, + "type": "string" + }, + "reasonCode": { + "enum": [ + "wrong_facts", + "wrong_tone", + "too_long", + "too_pushy", + "should_not_reply", + "other" + ], + "type": "string" + } + }, + "type": "object" +}
- Added
luca_review_queue_summary - Changed
luca_triage_inbox3 fields changed- changed
Output schema / properties / result / properties / explanations / additionalProperties / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": true, - "properties": { - "confidence": { - "type": "number" - }, - "createdAt": { - "type": "string" - }, - "criticIssues": {}, - "draftBody": { - "type": "string" - }, - "id": { - "type": "string" - }, - "leadId": { - "type": "string" - }, - "qualification": {}, - "status": { - "type": "string" - }, - "voiceMatchScore": { - "type": "number" - } - }, - "type": "object" - }, - { - "additionalProperties": true, - "properties": { - "id": { - "type": "string" - }, - "leadId": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "status": { - "type": "string" - } - }, - "type": "object" - } - ], - "x-luca-redacted-fields": [ - "criticIssues", - "draftBody", - "qualification" - ] - }, - { - "additionalProperties": false, - "properties": { - "explainError": { - "type": "string" - } - }, - "required": [ - "explainError" - ], - "type": "object" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "confidence": { + "type": "number" + }, + "createdAt": { + "type": "string" + }, + "criticIssues": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "draftBody": { + "type": "string" + }, + "id": { + "type": "string" + }, + "leadId": { + "type": "string" + }, + "qualification": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": "string" + }, + "voiceMatchScore": { + "type": "number" + } + }, + "type": "object" + }, + { + "additionalProperties": true, + "properties": { + "id": { + "type": "string" + }, + "leadId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "type": "object" + } + ], + "x-luca-redacted-fields": [ + "criticIssues", + "draftBody", + "qualification" + ] + }, + { + "additionalProperties": false, + "properties": { + "explainError": { + "type": "string" + } + }, + "required": [ + "explainError" + ], + "type": "object" + } +] - added
Output schema / properties / result / properties / queue / properties / asOfAdded value: +{ + "type": "string" +} - changed
Output schema / properties / result / properties / queue / x-luca-redacted-fieldsPrevious value: -[ - "items[].criticIssues", - "items[].draftBody", - "items[].draftParts", - "items[].leadDisplayName", - "items[].media", - "items[].mediaContext", - "items[].objectionVariants", - "items[].qualification", - "items[].safetyFindings", - "items[].signals" -]New value: +[ + "items[].criticIssues", + "items[].draftBody", + "items[].draftContent", + "items[].draftParts", + "items[].leadDisplayName", + "items[].media", + "items[].mediaContext", + "items[].objectionVariants", + "items[].qualification", + "items[].safetyFindings", + "items[].signals" +]
- Changed
luca_webhooks_events_bulk_replay1 field changed- removed
Input schema / requiredRemoved value: -[ - "body" -]
- Changed
luca_webhooks_events_list1 field changed- added
Input schema / requiredAdded value: +[ + "query" +]
- Changed
luca_webhooks_events_replay1 field changed- changed
Input schema / requiredPrevious value: -[ - "eventId", - "body" -]New value: +[ + "eventId" +]
- Changed
luca_webhooks_subscriptions_create1 field changed- added
Input schema / properties / body / properties / consumerMetadata / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +}
- Changed
luca_webhooks_subscriptions_update2 fields changed- added
Input schema / properties / body / properties / consumerMetadata / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - changed
Input schema / requiredPrevious value: -[ - "id", - "body" -]New value: +[ + "id" +]
- Changed
luca_webhooks_test_delivery2 fields changed- added
Input schema / properties / body / properties / data / additionalPropertiesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array" + }, + { + "type": "null" + } + ] +} - removed
Input schema / requiredRemoved value: -[ - "body" -]
203 tool updates
v0.4.0- First observed
luca_analytics_benchmark_consent - First observed
luca_analytics_benchmarks - First observed
luca_analytics_call_intelligence - First observed
luca_analytics_call_intelligence_calls - First observed
luca_analytics_content_attribution - First observed
luca_analytics_content_performance - First observed
luca_analytics_crm_sync_health - First observed
luca_analytics_deep_dive - First observed
luca_analytics_forecast - First observed
luca_analytics_funnel - First observed
luca_analytics_ghosted_leads - First observed
luca_analytics_insights - First observed
luca_analytics_lead_score - First observed
luca_analytics_learning_insights - First observed
luca_analytics_loss_reasons - First observed
luca_analytics_magic_monday - First observed
luca_analytics_objection_drilldown - First observed
luca_analytics_objections - First observed
luca_analytics_recommendations - First observed
luca_analytics_revenue - First observed
luca_analytics_rollup - First observed
luca_analytics_speed_impact - First observed
luca_analytics_topic_performance - First observed
luca_analytics_trends - First observed
luca_analytics_trust_score - First observed
luca_approve_and_send - First observed
luca_book_call - First observed
luca_bookings_availability - First observed
luca_bookings_brief - First observed
luca_bookings_calendars_list - First observed
luca_bookings_calendars_remove - First observed
luca_bookings_calendars_select - First observed
luca_bookings_cancel - First observed
luca_bookings_create - First observed
luca_bookings_get - First observed
luca_bookings_guest_links_create - First observed
luca_bookings_guest_links_revoke - First observed
luca_bookings_lifecycle_attention - First observed
luca_bookings_lifecycle_resolution - First observed
luca_bookings_list - First observed
luca_bookings_managed_availability - First observed
luca_bookings_needs_outcome - First observed
luca_bookings_outcome_get - First observed
luca_bookings_outcome_history - First observed
luca_bookings_outcome_reasons_create - First observed
luca_bookings_outcome_reasons_list - First observed
luca_bookings_outcome_reasons_update - First observed
luca_bookings_outcome_record - First observed
luca_bookings_provider_sync_retry - First observed
luca_bookings_providers_get - First observed
luca_bookings_providers_list - First observed
luca_bookings_types_attendees - First observed
luca_bookings_types_attendees_add - First observed
luca_bookings_types_attendees_remove - First observed
luca_bookings_types_create - First observed
luca_bookings_types_delete - First observed
luca_bookings_types_list - First observed
luca_bookings_types_schedule - First observed
luca_bookings_types_schedule_replace - First observed
luca_bookings_types_update - First observed
luca_bookings_update - First observed
luca_broadcasts_approve - First observed
luca_broadcasts_cancel - First observed
luca_broadcasts_create - First observed
luca_broadcasts_get - First observed
luca_broadcasts_launch - First observed
luca_broadcasts_list - First observed
luca_broadcasts_pause - First observed
luca_broadcasts_preview - First observed
luca_broadcasts_retry - First observed
luca_cadences_pause - First observed
luca_cadences_rescue_start - First observed
luca_call_events_backfill - First observed
luca_call_events_by_booking - First observed
luca_call_events_by_lead - First observed
luca_call_events_feedback - First observed
luca_call_events_get - First observed
luca_call_events_needing_feedback - First observed
luca_call_events_push_to_crm - First observed
luca_call_events_summary_generate - First observed
luca_call_events_summary_replace - First observed
luca_call_events_undo_outcome - First observed
luca_campaigns_analytics - First observed
luca_campaigns_comment_events_list - First observed
luca_campaigns_comment_simulation_suite_run - First observed
luca_campaigns_create - First observed
luca_campaigns_draft_update - First observed
luca_campaigns_duplicate - First observed
luca_campaigns_enroll - First observed
luca_campaigns_enrollments_list - First observed
luca_campaigns_enrollments_timeline - First observed
luca_campaigns_generate - First observed
luca_campaigns_get - First observed
luca_campaigns_list - First observed
luca_campaigns_provider_capabilities - First observed
luca_campaigns_publish - First observed
luca_campaigns_set_status - First observed
luca_campaigns_simulations_create - First observed
luca_campaigns_simulations_get - First observed
luca_campaigns_simulations_list - First observed
luca_campaigns_versions_list - First observed
luca_capabilities_get - First observed
luca_channels_catalog - First observed
luca_channels_features - First observed
luca_channels_get - First observed
luca_channels_list - First observed
luca_close_call_loop - First observed
luca_coach_audit_log - First observed
luca_coach_niche - First observed
luca_coach_niche_profile - First observed
luca_coach_objection_playbook - First observed
luca_coach_post_call_crm_mapping - First observed
luca_coach_post_call_deal_sync - First observed
luca_coach_post_call_settings - First observed
luca_coach_profile - First observed
luca_conversations_get - First observed
luca_conversations_list - First observed
luca_conversations_messages - First observed
luca_conversations_partial_send_retry - First observed
luca_conversations_send - First observed
luca_draft_reply - First observed
luca_find_leads - First observed
luca_flag_for_human - First observed
luca_insights_dismiss - First observed
luca_insights_mark_actioned - First observed
luca_insights_mark_read - First observed
luca_insights_settings_get - First observed
luca_insights_settings_update - First observed
luca_insights_unread_count - First observed
luca_integrations_connectors_list - First observed
luca_integrations_crm_connections_create - First observed
luca_integrations_crm_connections_health - First observed
luca_integrations_crm_connections_list - First observed
luca_integrations_crm_connections_schema - First observed
luca_integrations_crm_connections_webhooks_setup - First observed
luca_integrations_crm_mappings_confirm - First observed
luca_integrations_crm_mappings_suggest - First observed
luca_integrations_crm_oauth_url - First observed
luca_integrations_crm_sync_runs_create - First observed
luca_integrations_crm_sync_runs_list - First observed
luca_integrations_events_list - First observed
luca_knowledge_approve_suggestion - First observed
luca_knowledge_reject_suggestion - First observed
luca_knowledge_sources_disconnect - First observed
luca_knowledge_sources_list - First observed
luca_knowledge_sources_sync - First observed
luca_knowledge_suggestions - First observed
luca_leads_consents_grant - First observed
luca_leads_consents_revoke - First observed
luca_leads_create - First observed
luca_leads_draft - First observed
luca_leads_explain - First observed
luca_leads_field_definitions_list - First observed
luca_leads_field_definitions_upsert - First observed
luca_leads_get - First observed
luca_leads_identities_attach - First observed
luca_leads_import_apply - First observed
luca_leads_import_preview - First observed
luca_leads_list - First observed
luca_leads_notes_add - First observed
luca_leads_notes_delete - First observed
luca_leads_update - First observed
luca_learning_ab_tests_get - First observed
luca_learning_ab_tests_list - First observed
luca_learning_framework_performance - First observed
luca_learning_panel - First observed
luca_learning_proposals_dismiss - First observed
luca_learning_proposals_list - First observed
luca_memory_list - First observed
luca_memory_set_archived - First observed
luca_memory_update - First observed
luca_morning_report - First observed
luca_pause_cadence - First observed
luca_post_call_queue - First observed
luca_reports_morning - First observed
luca_reports_scorecard - First observed
luca_reschedule_call - First observed
luca_rescue_silent_leads - First observed
luca_review_queue_approve - First observed
luca_review_queue_explain - First observed
luca_review_queue_list - First observed
luca_review_queue_media_retry - First observed
luca_review_queue_objection_variant - First observed
luca_review_queue_reject - First observed
luca_review_queue_restore - First observed
luca_review_queue_sla - First observed
luca_safety_accounts - First observed
luca_triage_inbox - First observed
luca_usage_messages - First observed
luca_usage_spend - First observed
luca_voice_corpus - First observed
luca_voice_profile - First observed
luca_webhooks_deliveries_list - First observed
luca_webhooks_deliveries_replay - First observed
luca_webhooks_events_bulk_replay - First observed
luca_webhooks_events_list - First observed
luca_webhooks_events_replay - First observed
luca_webhooks_signature_guide - First observed
luca_webhooks_subscriptions_create - First observed
luca_webhooks_subscriptions_delete - First observed
luca_webhooks_subscriptions_list - First observed
luca_webhooks_subscriptions_update - First observed
luca_webhooks_test_delivery
TDQS
Scored across 223 tools
The set contains many near-duplicate aliases and overlapping composites: luca_leads_draft vs luca_draft_reply, luca_review_queue_approve vs luca_approve_and_send, luca_bookings_outcome_record vs luca_close_call_loop, and several analytics rollups. With 223 tools, an agent will struggle to choose between similarly purposed reads and writes.
Most tools use a luca_ prefix plus snake_case resource_action names, but the set mixes resource-first names with verb-object names like luca_find_leads, luca_book_call, and luca_flag_for_human. The many alias-style composites further weaken predictability.
223 tools is far beyond a well-scoped surface for a coaching/sales assistant API. The count is extreme and includes numerous convenience aliases that duplicate existing API operations.
Coverage is broad across leads, conversations, review queue, bookings, campaigns, broadcasts, webhooks, CRM integrations, analytics, and knowledge/memory. Some lifecycle operations are intentionally app-only, but the overall surface is rich with only minor intentional gaps.
Maintenance
Related MCP Connectors
Hosted MCP server for marketing agencies: connect Google Ads, GA4, Search Console, Meta, LinkedIn and more to Claude or ChatGPT. Pull reports and make changes via OAuth login, no setup.
Hosted Klaviyo MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted Instagram MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted CallRail MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- FlicenseAqualityCmaintenanceA unified MCP server that lets Claude query any SQLite database and build live Streamlit dashboards — all from a single conversation.101-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that turns an AI lead management system into a conversational tool any MCP-compatible AI client can control directly, with tools, resources, and prompts for lead classification, tracking, and weekly reviews.1MIT
- AlicenseCqualityCmaintenanceMCP server for the cig.chat API that lets you connect Claude, Cursor, or any MCP client to your cig.chat bot to manage subscribers, tags, flows, WhatsApp templates, broadcasts, and shop operations in plain language.25697 npmMIT
- FlicenseAqualityBmaintenanceOutbound sales agent for Claude Code. MCP server handles prospect list building, dedup, quotas, and structured rejection feedback, while the plugin runs per-prospect research, email writing, Gmail sending, and reply tracking. Open source, self-hostable.553-