Iridium: LinkedIn MCP Server
Server Details
LinkedIn MCP for Claude, ChatGPT, Grok, Hermes: triage inbox, comment, find people, live profiles
- Status
- Healthy
- Uptime
- 0.2% over 16 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 64 tools
The set contains several clusters of closely related tools: five overlapping people-search/lookup tools (find_person, find_prospects, search_prospects, discover_prospects, get_linkedin_profile), three DM-scheduling tools (schedule_manual_dm, schedule_chat_reply, schedule_dm_to_person), and four parallel approve_*/skip_*/rewrite_* families. The descriptions work hard to carve boundaries (badge vs post text, one person vs group, existing thread vs new), which makes them usable, but the sheer overlap means an agent can easily misselect without reading long prose. Distinct enough to score 3, not clean enough for 4.
Nearly everything follows a snake_case verb_noun pattern (list_drafts, approve_draft, schedule_chat_reply, find_prospects), grouped into coherent families. Minor deviations exist: connect_linkedin_* tools use awkward word-order and suffixes (connect_linkedin_checkpoint_mcp, connect_linkedin_li_at), and bare names like create_sequence/enroll_prospect lack an obvious family context. Overall readable and predictable.
At 64 tools this is far beyond a comfortable surface for an agent, with near-duplicate search tools and four separate draft-type families each having list/approve/rewrite/skip variants. Two tools (create_sequence, enroll_prospect) are permanently disabled and return 501, adding dead weight. The scope is large but the count is heavy enough to hurt selection reliability.
Coverage is unusually thorough: connecting accounts (four methods), inbox backfill/search/threading, prospect discovery, draft lifecycles for outreach/comment/content/reply, scheduling/rescheduling/cancel, sent and received connection requests, settings, activity log, jobs, and issue reporting. The notable gap is multi-step sequences, which are explicitly disabled and only workaroundable by manual per-message scheduling. Minor: no OAuth status/polling tool beyond the webhook promise.
Available Tools
64 toolsapprove_comment_draftAInspect
Approve Comment Draft
Approve one comment draft and schedule it to post. THIS PUBLISHES A PUBLIC COMMENT.
The comment appears on someone else's post under the user's name, so call this only when the user has explicitly approved this specific comment. It counts against their daily comment limit.
Args: handle: cdft_ handle from list_comment_drafts. comment_text: replacement text. Omit to post the drafted text as written. comment_at: "now" to post immediately, or ISO-8601 with an offset. Omit to let Iridium pick a time.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| comment_at | No | ||
| comment_text | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it warns that this publishes a public comment, appears on someone else's post under the user's name, and counts against their daily comment limit. These are exactly the side effects an agent needs before invoking a public posting action.
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 well structured with a clear warning, usage note, and parameter list. The trailing 'Responses: 200' section is low-value boilerplate given there is no output schema, but the rest 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?
Given the complexity of a public-posting action with three parameters and no annotations or output schema, the description covers purpose, required user consent, side effects, and every parameter's meaning and omission behavior. Nothing essential 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 description coverage is 0%, so the description must compensate, and it does: handle is tied to list_comment_drafts, comment_text is a replacement that can be omitted to post the draft as written, and comment_at accepts 'now', ISO-8601 with offset, or omission to let Iridium pick a time.
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: approve one comment draft and schedule it to post. It explicitly distinguishes the action as publishing a public comment, separating it from siblings like approve_content_draft or approve_reply_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?
It gives a clear usage condition: call only when the user has explicitly approved this specific comment. It also warns that the action counts against the daily comment limit. However, it does not explicitly name alternative tools like edit_comment_draft or skip_comment_draft for adjacent workflows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_content_draftAInspect
Approve Content Draft
Publish or schedule one of the user's own LinkedIn posts. THIS POSTS PUBLICLY.
The post appears on the user's profile. Call this only when they have explicitly approved this specific post.
Args: handle: ctnt_ handle from list_content_drafts. post_text: the final text to publish. Required, because the user is expected to edit before publishing. scheduled_at: ISO-8601 with an offset to schedule it. Omit to publish immediately.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| post_text | Yes | ||
| scheduled_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It strongly discloses that the action posts publicly, appears on the user's profile, and requires explicit approval, though it does not cover permissions, reversibility, or failure 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 key warning and usage condition are front-loaded, and the args section is efficient. The generic responses boilerplate adds little value, but overall it remains 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?
For a high-impact publish/schedule tool with no annotations and no output schema, the description covers the essential public-posting risk, approval condition, and all three parameters. It leaves some gaps around account requirements, reversibility, and error handling.
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 0%, so the description must compensate, and it does. It explains handle origin via list_content_drafts, post_text as final editable text and required, and scheduled_at as ISO-8601 with offset where omission publishes immediately.
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 resource: publish or schedule one of the user's own LinkedIn posts, generated from a content draft handle. It clearly distinguishes this from approval tools for comments and replies by naming LinkedIn posts and list_content_drafts.
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 precondition: call only when the user has explicitly approved this specific post. It also points to list_content_drafts as the source of the handle, but it does not explicitly name the relevant alternatives such as rewrite_content_draft or skip_content_draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_draftAInspect
Approve Draft
Approve one connection-note draft and schedule it. THIS SENDS.
Call it only when the user has explicitly asked for this specific draft to go out. Finding or drafting something is not permission to approve it. The connection request counts against the user's daily limit.
Returns a draft_ handle for the scheduled send, usable with reschedule_send and cancel_scheduled, so there is no need to call list_scheduled afterwards.
Args: handle: draft_ handle from list_drafts, discover_prospects, or run_outreach_pipeline. override_text: replacement note text. Omit to send the drafted text as written, or pass "" to send the connection request with no note at all. send_at: "now" to send immediately, or ISO-8601 with an offset, for example "2026-06-11T09:00:00+00:00". Omit and Iridium picks a sensible time.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| send_at | No | ||
| override_text | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and it does so well: it flags 'THIS SENDS', notes that the connection request counts against the user's daily limit, and returns a draft_ handle that lets the agent skip list_scheduled. What it doesn't cover is failure behavior (what happens if the send is rejected or the daily limit is already hit) or the permission/auth model.
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?
Information is front-loaded: purpose first, the 'THIS SENDS' warning second, then the permission rule, then args. Every sentence carries weight. Minor deduction for the redundant title repetition at the top and slightly loose line breaks that add no value.
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 no annotations, no output schema, and zero schema coverage, the description covers purpose, consent semantics, rate-limit impact, return value, and all three parameters — enough to call it correctly. The remaining gap is error/failure handling and whether an approval can be reversed beyond the referenced cancel_scheduled.
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 0%, so the description has to define all three parameters itself, and it does: handle is tied to its producing tools; override_text spells out the non-obvious omission-vs-empty-string distinction (omit = send drafted text, "" = no note at all); send_at documents the literal "now", ISO-8601 with an offset plus an example, and the omit-and-Iridium-chooses default. This is meaningful semantics the schema cannot 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?
The description names a specific verb (approve) and a specific resource (one connection-note draft) and states the follow-on effect (schedule/send it). Naming the draft type as 'connection-note' distinguishes it from the sibling approve_comment_draft, approve_reply_draft, and approve_content_draft tools, so an agent can route correctly 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?
It explicitly sets the when/when-not condition: 'Call it only when the user has explicitly asked for this specific draft to go out. Finding or drafting something is not permission to approve it.' That exclusion clause is exactly the guardrail a tool with an irreversible send side effect needs, and it also points at the source tools (list_drafts, discover_prospects, run_outreach_pipeline) that produce the handle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_reply_draftBInspect
Approve Reply Draft
Approve a reply draft and schedule it into the existing thread. THIS SENDS. It adds no new connection and does not count against the daily limit.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| send_at | No | ||
| override_text | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose several non-obvious traits: the action sends immediately, it schedules into an existing thread, it adds no new connection, and it does not consume the daily limit. It omits irreversibility, permission requirements, and what reschedule_send or cancel_scheduled would do afterward, leaving real gaps for a send 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 core sentence is well front-loaded and the send warning is prominent, but the trailing '### Responses: **200**: Successful Response' block is scraped OpenAPI noise that adds nothing for an agent and pads the 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?
This is a sending/mutation tool with no annotations, no output schema, and 0% parameter documentation. The description would need to cover parameter meaning, send semantics, and reversibility to be adequate; it covers only the high-level effect, which is not enough for an agent to call it safely.
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 0% across three parameters, so the description must compensate and does not. 'Schedule it' faintly hints at send_at, but 'handle' and 'override_text' — the latter being a meaningful content-override switch — are entirely unexplained in both schema and 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?
States a specific verb and resource ('Approve a reply draft') plus the effect ('schedule it into the existing thread'), which implicitly distinguishes it from approve_comment_draft / approve_content_draft / approve_draft siblings. It never names those alternatives 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?
The emphatic 'THIS SENDS' warns the agent that this is a dispatch operation, implying it should be used only once a draft is ready to go out. However, there is no explicit when-to-use guidance, no preconditions, and no routing to sibling tools like draft_reply, rewrite_reply_draft, or skip_reply_draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backfill_chatsAInspect
Backfill Chats
Pull all existing LinkedIn conversations from Unipile into Iridium — every thread in one pass, not a page at a time. Run this once after connecting LinkedIn to populate your inbox; re-running is safe and repairs older rows in place.
Records each thread's kind (regular DM / inmail / sponsored / linkedin_offer), its subject line where it has one, and a real message preview. Re-run it once after an upgrade to repair rows that predate those fields. Takes 10-30 seconds depending on conversation count.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses idempotency ('re-running is safe'), in-place repair of stale rows, the specific fields populated (kind, subject, real preview), and a 10-30 second runtime. It omits auth prerequisites beyond the 'after connecting LinkedIn' hint, rate limits, and failure 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 core action and the single-pass contrast, then the operational details. Slightly redundant — the 'repair rows that predate those fields' idea is stated twice — plus schema boilerplate in the responses section, but no sentence is truly 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 zero-param, no-annotation, no-output-schema mutation, the description covers purpose, timing, idempotency, populated fields, and runtime. It could do more on prerequisites (which of the connect_linkedin_* tools must precede it) and on whether it returns a count or summary.
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 tool takes zero parameters, so the baseline is 4; the description correctly implies no input is needed and doesn't waste words on nonexistent arguments.
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 (backfill/pull) and concrete resources (LinkedIn conversations from Unipile into Iridium) with an explicit scope contrast: 'every thread in one pass, not a page at a time,' which distinguishes it from the paginated list_chats/search_chats 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 triggering conditions: run once after connecting LinkedIn, and re-run once after an upgrade to repair older rows. It does not explicit exclude other cases (e.g. 'do not use this to read chats during normal operation'), but the 'once after connecting' framing implies the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_jobAInspect
Cancel Job
Stop a background search that has not finished. What it already found stays readable with get_job. Nothing is sent or changed on LinkedIn; it only stops looking.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the burden well: it declares this is not a LinkedIn-visible action ('Nothing is sent or changed on LinkedIn; it only stops looking') and that partial results survive cancellation. It omits whether cancelling is reversible, what happens if the job already finished, and whether a cancelled job can be restarted.
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 content is front-loaded in two tight sentences with no wasted wording. The trailing 'Responses: 200 Successful Response' block is boilerplate generated text that adds nothing and slightly dilutes the 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 single-parameter cancellation tool with no output schema, the description covers the important agent-facing facts: it's a local stop, not an outward action, and prior findings remain accessible. Missing only job_id sourcing and post-cancellation job state.
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?
There is one required parameter (job_id, UUID) with 0% schema description coverage, and the description never mentions it — no guidance on where the job_id comes from (presumably get_job or a listing call) or what happens on an invalid/unknown ID. The prose compensates for nothing on the parameter side.
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 Job') and narrows the scope precisely: 'Stop a background search that has not finished.' That framing distinguishes it from get_job (which reads results) and from the many draft/scheduled-send siblings, none of which are background searches.
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?
Says when to call it (an unfinished background search) and what to use instead to retrieve partial output ('stays readable with get_job'). The condition 'has not finished' implicitly excludes completed jobs, but there is no explicit when-not-to-use or guidance on the already-finished/completed case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_scheduledAInspect
Cancel Scheduled
Cancel a connection request (or message) that is SCHEDULED but has NOT been sent yet, so it never reaches LinkedIn. Use when the user says cancel / stop / don't send / take back for something still waiting in the queue (find it with list_scheduled). Synonyms: cancel invite, unschedule, pull back, stop sending, remove from queue. If it has already been sent, this changes nothing and says so: use withdraw_connection_request instead. If it is being sent at this moment it reports that; check list_scheduled shortly.
Args: handle: draft_ handle from list_scheduled or approve_draft.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral load and does most of it: it discloses state-dependent outcomes — no-op plus a message if already sent, a 'in the process of sending' report plus a recommendation to re-check list_scheduled, and that it prevents the item from ever reaching LinkedIn. Gaps remain around permissions, idempotency, and the error shape if the handle 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 state condition ('SCHEDULED but NOT sent') is front-loaded in the first sentence and the routing to the alternative follows immediately. The synonym list ('cancel invite, unschedule, pull back, stop sending, remove from queue') is somewhat padded and is the main thing that 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 single-parameter mutation with no annotations and no output schema, the description covers the trigger, the prerequisite lookup, the postcondition, and both edge cases. It does not describe what a success response contains or what happens if the handle is unknown or already cancelled twice, which 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 coverage is 0%, so the description must compensate, and it does: it identifies 'handle' as the draft_ handle obtained from list_scheduled or approve_draft, which the schema only names as 'handle'. It stops short of showing the literal prefix format or what happens with an invalid handle, keeping it 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+resource ('Cancel a connection request (or message) that is SCHEDULED but has NOT been sent yet') with the scope explicitly narrowed by the queue state, which sharpens it well beyond the bare name. It also names the exact alternative (withdraw_connection_request) for the adjacent case, so the agent can distinguish it from siblings 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 explicit trigger phrasing ('cancel / stop / don't send / take back'), tells the agent to locate the item with list_scheduled, and names the exclusion: if already sent, use withdraw_connection_request instead. When-to-use, prerequisites, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
classify_inboxAInspect
Classify Inbox
Triage the inbox into buckets (default: recruiter_inbound, candidate_reply,
cold_outreach_reply, spam) with a confidence per thread. Cache-first; repeat it to finish
a large backlog (remaining).
Each thread is judged on its type (regular DM / inmail / sponsored / linkedin_offer), the
sender's name and headline, the subject line if it has one, and the latest message.
linkedin_offer threads are labelled spam with no model call (auto_labeled).
Args:
taxonomy: optional custom list of labels to bucket into
limit: max PROVIDER CALLS to spend this call, retries included (default 25). Keep it
near 20 — the calls are sequential and a larger batch can outrun the client
timeout. failed counts threads the model would not label.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| taxonomy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does well: it discloses cache-first behavior, sequential provider calls with retries counted against `limit`, client-timeout risk at larger batches, `failed` semantics, and that linkedin_offer threads are auto-labelled with no model call. It does not state auth requirements or whether labels are persisted to the inbox.
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?
Core behavior, defaults, and the batching caveat are front-loaded with no wasted sentences. The trailing '### Responses: **200** ... Content-Type: application/json' block is auto-generated filler that adds nothing.
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 2-param, no-annotation, no-output-schema tool it is nearly self-sufficient: it names the bucket outputs, the `remaining` / `failed` / `auto_labeled` fields, and the judging signals used per thread. The remaining gap is the absence of any statement about authorization or side effects on the inbox itself.
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 0% and both parameters are undocumented in the schema, so the description must compensate — and it does. It explains that `limit` counts provider calls (not threads), includes retries, defaults to 25, and recommends keeping it near 20 to avoid client timeouts; `taxonomy` is framed as an optional custom label list overriding the defaults.
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 — 'Triage the inbox into buckets' — plus the default label set and the per-thread confidence output. It is clearly distinct from thread-level siblings like summarize_thread or get_thread, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable usage context: cache-first, so repeat the call to drain a large backlog, and watch `remaining`. It also defines the default taxonomy so the agent knows what happens if it omits that arg. It stops short of explicit when-not-to-use or a named competing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_linkedin_checkpoint_mcpAInspect
Connect Linkedin Checkpoint Mcp
Submit a LinkedIn 2FA verification code to complete the connection. Use this after connect_linkedin_credentials returns checkpoint=True.
Args: account_id: The account_id returned by connect_linkedin_credentials code: The verification code LinkedIn sent to your email or phone
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| account_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the prerequisite state and a minimal response contract (200 / application/json), but says nothing about failure behavior for an invalid or expired code, retry limits, or whether the account ends up connected or persisted on partial success. That is a meaningful gap for a mutation-style flow step.
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 instruction and the prerequisite are front-loaded in the first two sentences, and the Args block is compact. The leading header line 'Connect Linkedin Checkpoint Mcp' merely restates the tool name and earns nothing, which is the only real 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 two-required-parameter tool with no annotations and no output schema, the description covers the prerequisite, both parameters, and the success status. It is usable as-is but incomplete on the error path, which matters most in a 2FA step where an invalid code is the common outcome.
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 0%, so the description must compensate, and it does: account_id is tied to the value returned by connect_linkedin_credentials, and code is tied to the code LinkedIn sent to email or phone. It adds real provenance and intent beyond the bare schema titles, though it omits format details such as code length or whether leading zeros matter.
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 body states a specific verb and resource: submit a LinkedIn 2FA verification code to complete the connection. It explicitly distinguishes itself from the sibling connect_linkedin_credentials by naming that tool's checkpoint=True output as the trigger, so an agent can tell the two apart 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?
It gives a clear, explicit condition for use: 'Use this after connect_linkedin_credentials returns checkpoint=True', which effectively names the alternative and the branch that selects this tool. It stops short of a when-not rule, e.g. what to do if checkpoint is False or if the code is rejected, so it is not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_linkedin_credentialsBInspect
Connect Linkedin Credentials
Connect LinkedIn via username and password. Creates a fresh Unipile-managed session. It does NOT touch your existing browser session, so your LinkedIn tab stays logged in.
If LinkedIn requires 2FA, returns checkpoint=True with an account_id. Follow up with connect_linkedin_checkpoint to complete the flow.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | ||
| password | Yes | ||
| username | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose meaningful behavior: the session is Unipile-managed and the existing browser session is untouched, and the 2FA outcome shape is described. Still missing for a credential-handling mutation: how the password is stored/transmitted, whether an existing connection is overwritten, and what happens on invalid credentials.
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 content is front-loaded and each sentence adds information — mechanism, non-interference with the browser session, then the 2FA branch. The trailing '### Responses: 200 Successful Response / Content-Type: application/json' block is auto-generated filler that contributes nothing.
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 and no annotations, so the description must cover return shape; it describes the checkpoint=True branch but not the plain success payload beyond the boilerplate 200 line. Combined with the undocumented country parameter, an agent can start the call but cannot fully predict the result.
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 0%, so the description must compensate, and it only partly does: username and password appear in the prose but get no format guidance (email vs handle, app password vs 2FA-wrapped). The third parameter, country, is never mentioned and is entirely undocumented — a notable gap since it likely affects session/geo 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 verb and resource ('Connect LinkedIn via username and password') plus the mechanism ('Creates a fresh Unipile-managed session'), which implicitly distinguishes it from the credential-free siblings connect_linkedin_url and connect_linkedin_li_at. It does not name those 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?
The 2FA branch is handled well: 'If LinkedIn requires 2FA, returns checkpoint=True with an account_id. Follow up with connect_linkedin_checkpoint.' That is a real when-to-use-next rule. However, nothing says when to choose this over connect_linkedin_li_at or connect_linkedin_url, or what to do if an account is already connected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_linkedin_li_atBInspect
Connect Linkedin Li At
Connect LinkedIn by pasting your li_at session cookie. Lower friction than OAuth, with no redirect needed.
To get your li_at cookie:
Log in to linkedin.com in Chrome
Open DevTools → Application → Cookies → linkedin.com
Copy the value of the 'li_at' cookie
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| li_at | Yes | ||
| country | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description usefully discloses that authentication relies on a pasted session cookie and that no redirect is involved. It does not explain what happens after connection, whether credentials are stored, failure modes, or security implications, so the behavioral picture is only partially 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?
The description is short and front-loads the main purpose before the relevant cookie-acquisition steps. The redundant heading 'Connect Linkedin Li At' and boilerplate 200 response line slightly reduce efficiency, but the content is easy to scan.
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 connection tool with no annotations, no output schema, and 0% schema coverage, the description adequately explains the required secret. It remains incomplete because it omits the country parameter and post-connection behavior, which an agent would need to invoke the tool confidently.
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 0%, so the description must compensate. It provides detailed guidance on obtaining and copying the required li_at value, but it never mentions the optional country parameter or its purpose, leaving one of two parameters 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 clearly states a specific action and resource: connect LinkedIn by supplying the li_at session cookie. It distinguishes the method from OAuth and redirect-based flows, though it does not explicitly name or contrast the other connect_linkedin_* 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?
It gives the necessary precondition—having a li_at cookie—and notes that this is lower friction than OAuth with no redirect, which implies when the method is appropriate. However, it never explicitly says when to use this instead of connect_linkedin_credentials, connect_linkedin_url, or connect_linkedin_checkpoint_mcp.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_linkedin_urlAInspect
Connect Linkedin Url
Get a Unipile hosted-auth URL to connect LinkedIn. The user opens this URL in their browser to complete the OAuth flow. No password or cookie is needed. Connection is confirmed automatically via webhook once the user completes the flow.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose the important flow: returns a hosted-auth URL, user completes OAuth in browser, no password/cookie needed, and the connection is confirmed asynchronously via webhook. It omits details such as URL expiry/single-use behavior, auth requirements for calling the tool itself, and error cases.
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 after the repeated title, and the OAuth flow is described efficiently. The response boilerplate (200 content-type) is minor standard noise but does not obscure 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?
For a zero-parameter tool with no output schema, the description covers what the tool returns and how the user completes the flow. It is not fully complete because it lacks explicit sibling selection guidance and does not describe the response body beyond a 200 status/content type.
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 tool takes zero parameters, so there is no parameter semantics burden; the baseline for a parameterless tool is 4. The schema coverage note is not relevant because there are no inputs to document.
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: get a Unipile hosted-auth URL to connect LinkedIn. It distinguishes the mechanism from credential-based siblings by saying no password or cookie is needed, though it never names those sibling tools 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 explains the hosted OAuth flow and implies this is the no-credentials path, but it does not explicitly say when to use this instead of connect_linkedin_credentials, connect_linkedin_li_at, or connect_linkedin_checkpoint_mcp. For an agent choosing among several LinkedIn-connection tools, that routing 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.
create_sequenceAInspect
Create Sequence
CURRENTLY DISABLED. This tool returns 501 and creates nothing.
Multi-step sequences are switched off while the per-recipient safety checks are rebuilt. Do not call this. To do multi-step follow-up today, approve one message now and schedule the next with schedule_manual_dm or schedule_chat_reply at a later send_at.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| steps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses that the endpoint returns 501, creates nothing, and is disabled pending rebuilt per-recipient safety checks. That is exactly the behavioral context an agent needs to avoid a failed 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 critical information is front-loaded: disabled, returns 501, do not call, and alternatives. The trailing OpenAPI-style '200 Successful Response' boilerplate is unnecessary and somewhat misleading for a tool that actually returns 501, but the core message is 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?
Given that this is a disabled tool with no output schema and no annotations, the description is complete for its practical purpose: it prevents invocation and redirects to working alternatives. Detailed parameter semantics are less relevant because the tool cannot currently be used.
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?
There are two required parameters at 0% schema description coverage, and the description does not explain name, steps, kind, template, or delay_days semantics. The phrase 'multi-step sequences' hints at the steps concept but does not compensate for the missing parameter documentation.
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 multi-step sequence) and immediately clarifies effective behavior: the tool is disabled and creates nothing. It also distinguishes itself from the alternatives by naming schedule_manual_dm and schedule_chat_reply.
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 prohibition — 'Do not call this' — and names concrete alternatives with the condition that selects them: approve one message now and schedule later follow-ups with schedule_manual_dm or schedule_chat_reply using a later send_at.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_accountAInspect
Delete Account
Delete your Iridium account. Deactivates your account immediately, destroys the LinkedIn session at Unipile, and cancels your subscription. All scheduled work stops at once. Your personal data (profiles, drafts, chats, settings) is retained for 30 days and then permanently erased; your action history is retained for audit.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does so well: it discloses immediate deactivation, session destruction, subscription cancellation, halting of scheduled work, 30-day data retention followed by permanent erasure, and separate audit retention. These are exactly the consequences an agent needs before invoking a destructive, irreversible-class 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 effects are front-loaded and delivered as short, scannable clauses with no filler prose. The trailing "### Responses: 200 Successful Response / Content-Type: application/json" block is generated boilerplate that adds no value and slightly dilutes the otherwise tight structure.
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-parameter destructive tool with no output schema, the description covers consequences, timing, and data lifecycle thoroughly. It stops short of stating whether a confirmation step or specific auth is required, and whether the 30-day retention window allows restoration.
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 tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate. It correctly implies no configuration is needed — deletion is all-or-nothing.
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 your Iridium account") and adds scope detail — LinkedIn session destroyed at Unipile, subscription cancelled — which distinguishes it from the otherwise similar disconnect_linkedin sibling. It never names that sibling explicitly, so the differentiation is implicit rather than spelled 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 is implied by the severity of the described effects ("All scheduled work stops at once"), which signals this is a terminal action rather than a routine one. However, there is no explicit when-to-use/when-not guidance and no named alternative such as disconnect_linkedin for users who only want to unlink LinkedIn.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnect_linkedinAInspect
Disconnect Linkedin
Disconnect your LinkedIn account from Iridium. Removes the connection from Unipile and clears it from your profile. Everything that needs LinkedIn stops until it is reconnected.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the connection is removed from Unipile, cleared from the profile, and that all LinkedIn-dependent functionality stops until reconnection. It does not state permission requirements or whether any historical data is retained, but the core effects are well disclosed.
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-loads the key effect and consequence. It wastes some space repeating the tool name as a heading and includes boilerplate response formatting, but the substantive content 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?
For a zero-parameter disconnect operation without annotations or an output schema, the description gives enough context to understand the action and its immediate impact. It could be slightly more complete by stating whether reconnection requires full authentication again, but the essential behavior is covered.
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 tool takes zero parameters, so there are no parameter semantics to explain. The baseline for a zero-parameter tool applies, and the description correctly avoids unnecessary parameter commentary.
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 pair: disconnecting the LinkedIn account from Iridium. It also names the concrete systems affected, Unipile and the user profile, making the operation distinguishable from sibling connection tools such as connect_linkedin_* and broader destructive tools like delete_account.
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 happens after disconnection, but it does not say when an agent should choose this tool over alternatives, nor does it name any alternative tools. There are no explicit exclusions or prerequisites for deciding to disconnect versus, for example, deleting the account.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_prospectsAInspect
Discover Prospects
Search for people, read their profiles, and generate connection note drafts. Up to 3 people come back right here, in about 10 to 40 seconds. More than 3 run in the background: you get a job_id at once, drafts appear in list_drafts and get_job as each is written, and the user is emailed when it finishes or pauses. Returns draft handles ready to approve or skip. Complement to run_outreach_pipeline, which works from the user's saved targets.
CHOOSING BETWEEN discover_prospects AND find_person The deciding question: does the user NAME a specific person, or DESCRIBE a kind of person?
USE find_person when the user names someone (a first and last name), however much else they say about them:
"Message Jane Doe, she used to be at Acme."
"Is this the John Smith who was at Acme?"
"Find Pat Lee at Globex and connect." Returns who they are plus proof (e.g. Acme, 2018-2024). Cost: 1 search plus up to 2 profile reads. Drafts nothing. To write to them afterwards, pass the handle to schedule_dm_to_person.
USE discover_prospects when the user describes a GROUP by role, place or topic and wants connection notes written for whoever is found:
"Find 5 ML engineers in San Francisco and draft notes to them."
"Reach out to heads of growth in Austin." Searches by query and location, reads each person's profile AND posts, and drafts a note per person. Cost: 1 search plus 2 reads per person (about 11 actions for 5 people). Nothing sends; drafts land in list_drafts. Use it only when the user wants drafts.
NEITHER (use find_prospects or search_prospects) when the user wants a list to browse, or to check a badge such as #hiring, with no notes wanted.
NEVER use discover_prospects to look up a named person: it cannot filter by name or former employer, it returns strangers, and it spends about 11 actions doing so. NEVER use find_person to build a list: it returns at most 2 people.
AMBIGUOUS: "Find me Acme alumni named Jane." This could mean one specific Jane (find_person) or any number of Janes who used to work at Acme, with notes drafted (discover_prospects). A first name only, or a plural, is a group. DO NOT GUESS: the two cost very different amounts and discover_prospects drafts messages. Ask the user one question before calling either, for example: "Do you mean one specific person (give me their full name), or should I find several people matching this and draft notes to them?" Then call exactly one tool.
If the user gave a full name plus any context, choose find_person without asking. Ask only when the request could fit both.
Data accuracy: profile names, companies, and headlines are fetched live from LinkedIn and reflect real, current information. Notes reference actual post content when available; when no posts are found, notes are conservative and based only on verifiable headline/company data.
suggested_send_at is a suggestion only. Nothing sends until approve_draft is explicitly called. Drafts remain in pending_review indefinitely.
Each draft includes a profile field with: about, current_role, past_companies,
education, certifications, skills, follower_count, recent_posts. Display this
alongside the note so the user understands who was found.
Args: query: Search query e.g. "ML engineer at Series B startup" location: Location filter e.g. "San Francisco Bay Area" limit: Max prospects to process (1-10, default 5) hiring_only: the profile BADGE (is_hiring), not post text. This tool opens every candidate's full profile anyway, so the badge is genuinely CONFIRMED here rather than guessed — the filter is applied after that fetch and costs nothing extra. Use it for "find me hiring managers to connect with". Default false (no filter). For "who POSTED about hiring", use search_posts_by_topic: different question, different people, and free. open_to_work_only: same, for the is_open_to_work BADGE. If both this and hiring_only are true, a candidate matching either badge is kept.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| location | Yes | ||
| hiring_only | No | ||
| open_to_work_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: 10-40s synchronous path vs background job with job_id, notification by email on finish/pause, cost in actions (~11 for 5 people), and the critical safety fact that nothing sends until approve_draft and drafts persist indefinitely in pending_review. These are exactly the traits an agent can't infer from the schema.
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?
Headings and front-loading are strong and the cost/behavior facts are placed where an agent needs them. It is longer than necessary in places, repeating the group-vs-named distinction and restating the action cost in two sections, which costs it the top score.
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?
There is no output schema, so return values must be in prose — and they are: up to 3 results inline, otherwise a job_id with drafts surfaced via list_drafts and get_job, plus the full profile field list to display next to the note. Nothing needed to call or interpret results 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 0%, so the description must compensate and it does: query and location get example formats, limit gets its range and default, hiring_only is defined as the profile badge rather than post text with its application point (after profile fetch, no extra cost) and a pointer to search_posts_by_topic for the post-text question, and open_to_work_only's OR interaction with hiring_only is spelled out.
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 specific verbs and resources ("Search for people, read their profiles, and generate connection note drafts") and then explicitly separates itself from find_person, find_prospects/search_prospects, search_posts_by_topic and run_outreach_pipeline. An agent can classify a request against this tool 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?
Provides an explicit decision rule (named person vs described group), worked example utterances for each branch, an explicit NEVER list for both directions, and a disambiguation protocol for the ambiguous case that says to ask one question rather than guess. This is about as complete as usage guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_replyAInspect
Draft Reply
Generate a reply to a conversation, using the full thread + your voice, for review. Creates a pending reply draft, one per thread. Approve, rewrite, or skip it next.
Args: chat_handle: chat_ handle from list_chats / search_chats / list_replies intent: optional steer for the reply (a goal or tone)
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| intent | No | ||
| chat_handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the important behavior: this creates a *pending* draft rather than sending anything, uses the full thread plus the user's voice, and is limited to one draft per thread. It omits what happens on a duplicate request (error vs. replace) and any permission or rate-limit 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?
The core sentences are tight and front-loaded, but the repeated title "Draft Reply" and the trailing "### Responses: **200**..." OpenAPI boilerplate add text that does not help an agent invoke the 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?
For a two-parameter creation tool with no output schema, the description covers what it makes, what it doesn't do (send), the review path, and both inputs. Missing only the return shape and duplicate-draft handling, which are minor given no 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 0%, so the description must compensate — and it does, documenting both parameters: chat_handle's provenance ("from list_chats / search_chats / list_replies") and intent as an optional goal-or-tone steer. It doesn't describe the handle's format, though that is acceptable given it is an opaque token from sibling tools.
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 ("Generate a reply to a conversation") and pins the scope ("Creates a pending reply draft, one per thread"), which separates it from rewrite_reply_draft and approve_reply_draft. It does not name 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?
Gives clear usage context: generate a draft "for review" and then "Approve, rewrite, or skip it next," which maps the agent onto the correct follow-up tools. It stops short of explicit exclusions (e.g., when to prefer getting a thread summary first or when a draft already exists).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_comment_draftBInspect
Edit Comment Draft
Replace a comment draft's text with text the user wrote. Saves only, does not post.
Use this when the user dictates their own wording. Approving is still a separate step.
Args: handle: cdft_ handle from list_comment_drafts. comment_text: the exact text to store on the draft.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| updated_content | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It usefully states that the tool saves only and does not post, and that approval is separate, but it does not cover permissions, whether the edit overwrites existing text, behavior when no updated content is supplied, or response details.
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 content is front-loaded and reasonably brief, but it repeats the title, includes an Args section, and adds boilerplate about a 200 response and application/json content type that does not help tool selection or 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?
For a mutation tool with no annotations and no output schema, the description covers the main save-versus-post distinction and the handle. However, the parameter-name mismatch and missing permission/overwrite behavior leave notable gaps 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 0%, so the description needs to clarify both parameters. It explains the handle as a cdft_ value from list_comment_drafts, but refers to the text parameter as 'comment_text' while the schema defines 'updated_content'; this mismatch creates confusion, and the nullable updated_content behavior is 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 description states a specific verb and resource: edit a comment draft by replacing its text with text the user wrote. It also distinguishes saving from posting and approving, giving an agent a clear sense of the operation, though it does not explicitly contrast edit_comment_draft with rewrite_comment_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?
It gives a clear usage condition: 'Use this when the user dictates their own wording,' and clarifies that approving is still a separate step. It does not explicitly name the alternative rewrite tool, but the when-to-use guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enroll_prospectAInspect
Enroll Prospect
CURRENTLY DISABLED. This tool returns 501 and enrolls nobody.
See create_sequence. Schedule follow-ups explicitly instead.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| prospect_handle | Yes | ||
| sequence_handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it discloses the single most important trait: the tool fails with 501 and has no side effects. It adds no detail about what enrollment would do if re-enabled or what the error payload looks like, 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?
'CURRENTLY DISABLED' is front-loaded where it will be seen first, and the alternative follows immediately. The trailing '### Responses: 200 Successful Response' block is leftover boilerplate that is arguably misleading given the 501 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?
For a disabled tool with two opaque params and no output schema, the description supplies everything an agent actually needs: do not call it, use create_sequence, schedule manually. Parameter documentation would be nice but is low-value while the endpoint is inert.
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 0% and both required parameters (prospect_handle, sequence_handle) are undocumented in the schema, yet the description says nothing about their format or where the handles come from. Since the tool is unusable this matters less, but the gap is real.
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 verb+resource ('Enroll Prospect') is clear, and the description immediately qualifies it with 'CURRENTLY DISABLED ... enrolls nobody', so an agent knows exactly what the tool would do and that it currently does nothing. It doesn't explicitly state what enrollment means (prospect into sequence), but the parameter names and sibling set make that inferable.
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 when-not ('This tool returns 501 and enrolls nobody') plus a named alternative ('See create_sequence') and a concrete fallback ('Schedule follow-ups explicitly instead'). This is the strongest possible routing guidance for a dead tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_personAInspect
Find Person
Find ONE specific person by name — optionally pinned by where they used to work — and get a definitive answer in a single call. The user never needs their LinkedIn id or URL.
CHOOSING BETWEEN discover_prospects AND find_person The deciding question: does the user NAME a specific person, or DESCRIBE a kind of person?
USE find_person when the user names someone (a first and last name), however much else they say about them:
"Message Jane Doe, she used to be at Acme."
"Is this the John Smith who was at Acme?"
"Find Pat Lee at Globex and connect." Returns who they are plus proof (e.g. Acme, 2018-2024). Cost: 1 search plus up to 2 profile reads. Drafts nothing. To write to them afterwards, pass the handle to schedule_dm_to_person.
USE discover_prospects when the user describes a GROUP by role, place or topic and wants connection notes written for whoever is found:
"Find 5 ML engineers in San Francisco and draft notes to them."
"Reach out to heads of growth in Austin." Searches by query and location, reads each person's profile AND posts, and drafts a note per person. Cost: 1 search plus 2 reads per person (about 11 actions for 5 people). Nothing sends; drafts land in list_drafts. Use it only when the user wants drafts.
NEITHER (use find_prospects or search_prospects) when the user wants a list to browse, or to check a badge such as #hiring, with no notes wanted.
NEVER use discover_prospects to look up a named person: it cannot filter by name or former employer, it returns strangers, and it spends about 11 actions doing so. NEVER use find_person to build a list: it returns at most 2 people.
AMBIGUOUS: "Find me Acme alumni named Jane." This could mean one specific Jane (find_person) or any number of Janes who used to work at Acme, with notes drafted (discover_prospects). A first name only, or a plural, is a group. DO NOT GUESS: the two cost very different amounts and discover_prospects drafts messages. Ask the user one question before calling either, for example: "Do you mean one specific person (give me their full name), or should I find several people matching this and draft notes to them?" Then call exactly one tool.
If the user gave a full name plus any context, choose find_person without asking. Ask only when the request could fit both.
LinkedIn applies the name and employer filters itself, so a match already satisfied them.
The profile is then read (profile only, no posts; at most 2 matches; cached) to show WHEN:
proof lists the matching job, e.g. Acme, Software Engineer, 2018-2024, status "past".
Read verdict:
confirmed exactly one person matched every filter you gave. Use its handle.
ambiguous two or more did. Compare headline and location, or add a filter
(company, location, title) and call again.
unverified NOBODY matched your filters; these people share only the name. Do not
present them as the person asked for.
none nobody by that name.
A match is a person who satisfies the filters, not proof they are the one the user means:
check headline and location against what the user said.
Cost: 1 search, plus 1 profile read per match when evidence is on (free if cached).
evidence=false skips the profile read: the match is still confirmed, with no dates.
If the daily budget is spent the matches still come back, without proof, and
budget_exhausted is set.
SEVERAL PEOPLE: send people (a list of the same fields, up to 50) instead of name. Up to 3
are answered right here as {"status": "done", "results": [...]}. More than 3 return a job_id
at once, keep working in the background at a pace LinkedIn tolerates, and email the user when
they pause or finish. Read them with get_job: results appear as they come in, and each
confirmed person carries a handle you can use straight away.
Args:
name: full name, e.g. "Jane Doe". The last word is the surname. (Or send people.)
past_company: a company they USED to work at, e.g. "Acme".
company: a company they work at NOW.
location: where they are now, e.g. "San Francisco".
title: words from their current title, e.g. "Chief Scientist".
keywords: a soft hint (e.g. a former city). Narrows the search; proves nothing.
evidence: read the profile to show dates (default true).
include_history: also return their whole work history (default false).
Returns {"verdict", "matches", "more", "searches", "profiles_opened", "budget_exhausted",
"note"}. Each match: handle, name, headline, location, distance, profile_url, and (when
read) proof [{company, role, from, to, status}]. Pass handle straight to
schedule_dm_to_person, get_linkedin_profile (for posts) or enroll_prospect.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| title | No | ||
| people | No | ||
| company | No | ||
| evidence | No | ||
| keywords | No | ||
| location | No | ||
| past_company | No | ||
| include_history | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: it says drafts nothing, explains read costs, caching, budget exhaustion, match limits, verdict semantics, and background job behavior for larger batches. It also clarifies that handling writing requires passing the returned handle to schedule_dm_to_person.
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 well structured, opening with purpose and routing guidance before arguments and returns. It is still quite long and repeats cost and drafting details in multiple sections, so it is slightly verbose 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 nine parameters, no annotations, no output schema, and zero schema descriptions, the description is remarkably complete. It explains return fields, verdict meanings, proof behavior, job_id flow for more than three people, and next-tool handoff, leaving no material gap 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 0%, but the description documents every parameter with examples, defaults, and meaning: name surname handling, past vs current company, location, title, soft keywords, evidence, include_history, and the people list alternative. This fully compensates for the schema 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: find ONE specific person by name, optionally pinned by past employer. It explicitly distinguishes this from discover_prospects and from list-oriented tools like find_prospects/search_prospects, so an agent can route correctly 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?
It gives explicit when-to-use, when-not-to-use, and alternatives, including concrete user phrasings. It also handles the ambiguous case by instructing the agent to ask one clarifying question and then call exactly one tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_prospectsAInspect
Find Prospects
Find people on LinkedIn and, optionally, verify and write to a few of them — one tool that spends only what the filters you asked for actually cost.
USE THIS as the default for any "find me people who..." request. It searches once, narrows for free on the fields the search already returned, and opens full profiles only for the number you allow, best candidates first.
This is the tool that answers "who actually HAS the #hiring badge / the #opentowork
badge". Set hiring or open_to_work and give it max_touches: it orders the bucket
by the free signals most likely to carry the badge, opens that many profiles — the only
place the badge exists — and tells you which candidates it CONFIRMED. Cost is 1 profile
touch per candidate confirmed, except that a full Recruiter seat confirms "open to work"
for free at search time. Read confirmed and each candidate's confirmed / badges to
see who is verified; the rest of the bucket is unverified and the response says so.
Four phases, and you control where it stops: max_touches=0 (default) search + free narrowing only. No profile is opened, nothing is charged against the daily profile budget. This is a browse. max_touches=N additionally opens up to N full profiles (profile AND posts together, in one pass), best-first, to CONFIRM the badge filters. Already-known people are served from cache for free and never counted against N. want_notes=true additionally drafts a connection note for the confirmed candidates, reusing profiles already read — no extra LinkedIn reads, ever. Nothing sends; drafts land in list_drafts.
"#hiring" and "#opentowork" mean TWO DIFFERENT THINGS on LinkedIn, and which one the user means decides what the search costs:
BADGE the frame on someone's PROFILE (is_hiring / is_open_to_work). It is NOT in
any people-search result and NOT in their posts. Seeing it means opening
that person's profile — one profile touch each — with a single exception:
a full Recruiter seat can filter "open to work" at search time for free.
This tool's hiring and open_to_work flags mean the BADGE.
POST TEXT the hashtag someone typed into a POST. Free to search, opens nobody's
profile, and says nothing about their badge. That is search_posts_by_topic,
not this tool — "who POSTED about hiring" is a different question from
"who HAS the hiring badge", and they return different people.
Honesty contract, worth relaying to the user: checked is how many profiles this call
actually opened, cached how many were reused free, confirmed how many really carry the
badge, and count - checked - cached are candidates NOBODY has verified. When the daily
budget is spent, the candidate list still comes back with budget_exhausted set — the
tool never returns an empty list to mean "out of budget", and never silently stops early.
Args:
query: what to search for, e.g. "ML engineer" or "Head of Growth".
location: plain-text location, e.g. "San Francisco" or "United States".
limit: bucket size to search for (1-100; classic LinkedIn plans return at most 10).
company / headline_keywords / exclude_headline_keywords / network_distance: free
filters applied to the search results themselves — they cost nothing, so use them
freely to cut the list before spending touches. Any-of within a filter, all-of
across filters. network_distance: DISTANCE_1 (direct connections), DISTANCE_2, DISTANCE_3.
hiring: set this to find people who really have the #hiring profile BADGE (not post
text). It is the only way to get that answer: no LinkedIn plan can filter on the
badge at search time, so candidates are ORDERED by the free signals that correlate
with it and then CONFIRMED by opening profiles — 1 touch per candidate confirmed,
on every tier, capped by max_touches. The response marks each confirmed candidate
and counts them in confirmed. With max_touches=0 nothing is confirmed and this
flag only changes the order. For "who POSTED about hiring" use
search_posts_by_topic instead: free, and a different question with different people.
open_to_work: set this to find people who really have the #opentowork profile BADGE
(not post text). On a full Recruiter seat LinkedIn confirms it at search time for
free (its own spotlight, 0 touches, results arrive pre-filtered); on every other
plan — Recruiter Lite included — it falls back to order-then-confirm at 1 touch
per candidate confirmed, capped by max_touches. The tool picks whichever route
this account can actually use, and the response says which candidates are
confirmed either way.
posted_recently: neither badge nor post text — an ACTIVITY filter ("posted at all in
the past 30 days", regardless of what about). Free at search time, Sales Navigator
seats only; on other plans the search runs without it and tier_note says so.
max_touches: how many profiles this call may open BEFORE answering (0-10, default 0).
You wait for these, up to 3. More than 3 runs in the background instead: you get a
job_id at once, read the bucket and the confirmations as they arrive with get_job, and
the user is emailed when it finishes.
background_touches: how many of the best remaining candidates to confirm AFTER the
answer is sent (0-10, default 0). You do NOT wait for these and they are NOT
confirmed in this response — background.queued says how many are running. Ask
again in a moment and they come back already confirmed, at no extra cost, because
they land in the same cache. Use this to keep a long list moving without making
the user wait: "here are 25 people, the best 8 are being confirmed now".
want_notes: draft a connection note per confirmed candidate. Default false.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| hiring | No | ||
| company | No | ||
| location | Yes | ||
| want_notes | No | ||
| max_touches | No | ||
| open_to_work | No | ||
| posted_recently | No | ||
| network_distance | No | ||
| headline_keywords | No | ||
| background_touches | No | ||
| exclude_headline_keywords | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does so in detail: per-candidate touch cost, free cache reuse, the fact that max_touches>3 returns a job_id and emails the user on completion, background_touches results arriving only on a later call, and the explicit guarantee that budget exhaustion returns a populated list with budget_exhausted set rather than an empty list. It also discloses plan-dependent behavior (full Recruiter seat confirms open-to-work for free; Recruiter Lite falls back to order-then-confirm; posted_recently works only on Sales Navigator with a tier_note otherwise). This is exactly the behavior an agent cannot infer from schema or 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?
Front-loaded and sectioned: purpose, default-usage claim, phase ladder, badge-vs-post-text distinction, honesty contract, then arguments — an agent can stop reading once it has what it needs. However the badge/cost story is told three or four times over (the 'who HAS the #hiring badge' line, the BADGE vs POST TEXT block, then again inside the hiring and open_to_work arg entries), so several sentences restate prior ones rather than earning new 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?
For a 13-parameter, no-annotation, no-output-schema tool with tier-dependent branching, this is close to complete: it names the response fields an agent must read (checked, cached, confirmed, budget_exhausted, tier_note, background.queued) and cross-references get_job and list_drafts, which compensate for the missing output schema. The remaining hole is that the three overlapping prospect-search siblings are never disambiguated, leaving the agent's tool-selection decision only partly closed.
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 0% and there are 13 parameters, so the description must compensate entirely — and it documents all 13, including ranges/defaults (limit 1-100 with a note that classic plans cap at 10; max_touches 0-10 default 0), filter-combination logic ('any-of within a filter, all-of across filters'), and enum meaning for network_distance (DISTANCE_1 = direct connections). Crucially it also clarifies what a flag does NOT mean (hiring = profile badge, not post text) and what happens to the flag on unsupported plans, which is semantics no schema could carry.
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 chain ('find people on LinkedIn and, optionally, verify and write to a few of them') and explicitly declares itself the default for 'find me people who...' requests, which is far more than a name restatement. It sharply differentiates from search_posts_by_topic, but says nothing about the two most confusable siblings, search_prospects and discover_prospects, whose names an agent could easily mistake for this 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?
Gives unusually explicit when-to-use routing for search_posts_by_topic ('who POSTED about hiring' vs 'who HAS the hiring badge') plus a clear decision ladder over max_touches=0 / N / want_notes and background_touches, framed as cost tradeoffs. The gap is that it offers no exclusion or comparison against search_prospects or discover_prospects, so the agent is told 'use this as default' without being told what those siblings are for or when they'd win.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_stale_threadsAInspect
Find Stale Threads
Surface dropped balls, meaning threads with no activity in days:
ghosted → you sent the last message and got no reply
owed_reply → they replied and you haven't responded
Threads with a pending scheduled reply are excluded. Oldest first, except threads whose
contact shows a cached #hiring or #OpenToWork profile BADGE sort ahead of ones that don't.
hiring_signal: true when this contact's cached LinkedIn profile shows the #hiring or #OpenToWork profile BADGE (not post text) — best-effort, from a prior profile fetch, never a new one. False means either confirmed absent or never checked; treat it as "nothing to report," not a confirmed negative.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full load and does well: it discloses the inactivity window, the scheduled-reply exclusion, the non-obvious sort order, and — importantly — that hiring_signal comes from a cached prior profile fetch and 'never a new one,' so no side effect occurs. It also warns that false is not a confirmed negative. It never states pagination/truncation behaviour, which is the main behavioral 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 body is front-loaded and well structured: purpose, then a scannable bullet list of the two thread states, then exclusions, sort order, and the hiring_signal caveat. The trailing '### Responses / 200 / Content-Type' block is generated boilerplate that adds nothing and is the only real 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?
With no annotations and no output schema, the description still covers the shape of the result set (stale state labels, ordering, the hiring_signal field and its epistemic status), which is the hard part. The remaining gap is result-count/pagination semantics, which matters for a default-limited 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 description coverage is 0%, so the description must document both parameters and does not. `days` is only echoed as 'threads with no activity in `days`' with no mention of the default of 7. `limit` is never mentioned at all, so an agent cannot tell that results are silently capped at 50.
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 ('Find Stale Threads') and then operationally defines the result set with the ghosted / owed_reply split and the exclusion of threads with a pending scheduled reply. An agent knows exactly what set comes back. It stops short of naming how it differs from siblings like list_chats or search_chats, which share the inbox surface.
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 definitions — this is the triage tool for dropped balls, and the exclusion rule tells you when a thread will not appear. But there is no explicit 'use this instead of list_chats when…' and no stated preconditions (e.g. LinkedIn connection state) that would route the agent between inbox tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activity_logAInspect
Get Activity Log
Read the user's activity log. Every action Iridium has taken, newest first.
Iridium records every attempted action in an append-only ledger: what ran, when, whether it succeeded, and the text that was actually sent. This tool reads it. Nothing is sent or changed by calling it.
USE THIS when the user asks what happened, in any form: "what did you do today?" "did that comment actually post?" "show me everything from yesterday" "what failed?"
Answer from this log rather than from memory of earlier turns in the conversation. The log is the record; the conversation is not.
Each entry has: at, action (readable label), surface, status, target (who or what it touched), summary (one sentence), detail (the text that was sent), and error when it failed. Entries older than the user's data-retention window may have no target name, because the profile behind it has been erased. That is expected and is not a failure.
Args: limit: Entries per page, 1-100 (default 20). cursor: next_cursor from a previous call, to fetch the following page. surface: "linkedin" for actions taken on LinkedIn, "iridium" for actions inside Iridium such as sign-ins and draft decisions. Omit for both. status: "success", "failed", or "skipped". Omit for all. action_type: exact slug filter, e.g. "comment_send". Omit for all.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| status | No | ||
| surface | No | ||
| action_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden and does so well: it declares 'Nothing is sent or changed by calling it' (read-only safety), discloses newest-first ordering, cursor pagination, and the retention-window caveat where target names may be erased. Missing only things like rate limits or result-size ceilings.
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 safety before the usage triggers and arg docs; every section serves a purpose. The quoted example queries add real routing value, though the entry-field enumeration borders on 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?
Despite no output schema and no annotations, the description specifies the returned entry fields (at, action, surface, status, target, summary, detail, error) and the pagination contract via next_cursor. An agent has everything needed to call it and interpret results.
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 0% and the schema has no enums, yet the description documents every parameter: limit (1-100, default 20), cursor (next_cursor from prior call), surface values ('linkedin'/'iridium', omit for both), status values ('success'/'failed'/'skipped'), and action_type as an exact slug with an example. This fully compensates for the schema 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 ('Read the user's activity log'), its scope ('Every action Iridium has taken, newest first'), and its backing store (append-only ledger). An agent can immediately distinguish it from narrow siblings like get_last_action.
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 trigger conditions with concrete example queries ('what did you do today?', 'what failed?') and a strong directive to answer from the log rather than conversation memory. It does not name alternatives such as get_last_action for single-action lookups, so no exclusion guidance exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draft_detailAInspect
Get Draft Detail
Everything Iridium knows about one connection-note draft: the full note text, the angle it was written from, and the profile it is addressed to. Read-only.
Use this when the user asks why a draft says what it says, or wants the full text that list_drafts only previews.
Args: handle: draft_ handle from list_drafts.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden and does state 'Read-only' plus what content is returned, which is the key safety signal for a read tool. It does not cover failure modes (missing/invalid handle, cross-account access), 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?
Front-loaded with the effect and the return contents, then usage guidance; every prose sentence earns its place. Deducted for the redundant 'Get Draft Detail' header and the stray '### Responses: 200' boilerplate, which add nothing and mimic an output schema that doesn't exist.
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 one-parameter read tool with no output schema, the description says what comes back and how to get the handle, which is close to sufficient. Missing only the failure/edge behavior an agent would want when a handle is rejected.
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 0%, so the description must compensate; it does so by naming the parameter, giving its expected format ('draft_ handle') and its source (from list_drafts). That is enough for correct invocation, though it doesn't describe error behavior for a bad or stale handle.
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 (get one connection-note draft's full detail) and enumerates the payload: full note text, the angle it was written from, and the addressed profile. It also explicitly contrasts with list_drafts previews, so an agent can pick between them 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 two concrete trigger conditions ('user asks why a draft says what it says' or 'wants the full text') and names the alternative (list_drafts) plus why it is insufficient (it only previews). That is explicit when-to-use with the alternative surfaced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_jobAInspect
Get Job
Check on a search that is running in the background, and read what it has found so far.
Large searches (more than 3 people to look up, or a list to read and draft notes for) do not make you wait. They return a job_id straight away, keep working, and email the user when they pause or finish. Results appear here as they come in, so you can already message people, read their profiles or draft notes while the rest is still going.
Call with a job_id to get its status, how many are done, and every result so far (people carry
a handle you can pass to the other tools). Call with no job_id to list the latest jobs.
status: queued (starting), running, waiting (paused to stay within LinkedIn's limits; it
resumes by itself at resume_at and the user is emailed), done, stopped (LinkedIn kept
slowing the account down; wait a day), cancelled, failed. Read message: it says it in plain
words and is safe to relay to the user as written.
Args: job_id: the job to read. Omit to list the latest 10. limit: most results to return (1-200, default 50).
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| job_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: background/asynchronous execution, email notification at pause/finish, partial-result streaming, and the fact that results carry a `handle` usable with other tools. It enumerates every status value with its meaning, including the throttling case (waiting, resume_at, auto-resume) and the 'wait a day' case, plus guidance that `message` is safe to relay verbatim.
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 structured into behavior, status enumeration, and an Args block, all of which earn their place. A few phrases are conversational filler ('do not make you wait', 'it says it in plain words'), and the status list is dense but necessary for polling logic.
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 2-param, no-annotation, no-output-schema tool, the description covers execution model, return shape (status, done count, results, handle, message) and status lifecycle. The remaining gap is pagination: it says limit is 'most results to return' but never says whether more results exist beyond the limit or how to fetch them.
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 0%, so the Args block is doing real work: job_id is explained as 'the job to read, omit to list the latest 10' — behavior the nullable schema does not convey — and limit is described as max results. The limit text largely restates the schema's min/max/default, and the interaction between limit and job_id (does limit apply to listing jobs or to results?) is not spelled out.
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 the verb and resource precisely ('check on a search that is running in the background, and read what it has found so far') and covers both modes: with job_id you read one job, without it you list the latest jobs. An agent can distinguish it from siblings like cancel_job or get_activity_log from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the triggering context well: large searches return a job_id instead of blocking, and you can work on partial results while the rest runs. It also tells the agent when to omit job_id (list latest 10). It stops short of naming alternatives or explicit exclusions (e.g., use cancel_job to stop a job), so it is clear context rather than a full routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_last_actionAInspect
Get Last Action
Read back the single most recent action Iridium took, with its full text.
Use this to confirm something just happened, after approving or scheduling anything, or when the user asks "did that work?". Cheaper than get_activity_log when only the last action matters. Nothing is sent or changed by calling it.
Returns {"item": null} if the account has no recorded actions yet.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description explicitly discloses the safety profile ('Nothing is sent or changed by calling it') and the empty-state return ('{"item": null} if the account has no recorded actions yet'). It omits any note on auth or rate limits, but for a zero-parameter read this covers nearly all behavioral risk.
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 tight and front-loaded, but the description is padded with auto-generated boilerplate ('### Responses: **200**: Successful Response ... Content-Type: application/json') that conveys no decision-relevant information. The restated title line also adds nothing.
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?
There is no output schema, yet the description discloses the null case and that the full action text is returned, and it states the operation is side-effect free. It stops short of enumerating the fields of a non-null action item, which is the only remaining gap for a caller.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a parameterless tool applies. No misleading parameter language is introduced.
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 ('read back the single most recent action Iridium took') and states the returned payload ('with its full text'). This is immediately distinguishable from the sibling get_activity_log, which returns a broader history.
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 triggers ('to confirm something just happened, after approving or scheduling anything, or when the user asks "did that work?"') and names the alternative with the condition that selects it ('cheaper than get_activity_log when only the last action matters'). Both when-to-use and when-to-use-something-else are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_linkedin_profileAInspect
Get Linkedin Profile
Read the full LinkedIn profile(s) of people you already know, or several at once.
ONE PERSON, THREE TOOLS - use them in this order:
find_person WHO is this? A name (plus where they worked) returns a confirmed handle and proof. 1 search plus up to 2 profile reads.
get_linkedin_profile TELL ME MORE. A handle returns the full profile and posts. Call it only when find_person's headline and proof are not enough.
schedule_dm_to_person MESSAGE THEM. Pass the profile_handle from step 1. Never message from a name alone: sending by name guesses between people who share it. If find_person's verdict is not
confirmed, ask the user which person they mean before sending. Already in a conversation with them (see search_chats)? Use the chat_ handle with schedule_manual_dm instead; no lookup is needed.
At least one of name, linkedin_id, iridium_handle, linkedin_ids, or iridium_handles
must be provided. Prefer iridium_handle(s). name (with the optional hints company,
education, location, headline_keywords) is a keyword search that opens up to 5 full
profiles: to find ONE named person use find_person instead.
Costs one profile touch per person against the daily budget — this is the expensive way to look someone up, and the right one when you already hold a handle and want depth. To resolve a name, use find_person. To find people you cannot yet name, use find_prospects.
More than 3 handles run in the background (up to 50): you get a job_id at once, read the profiles as they arrive with get_job, and the user is emailed when it finishes.
Returns {"results": [...], "total": N, "query_used": str | None}.
Results are fully read: about, current_role, past_companies, education,
certifications, skills, recent_posts, prof_handle, and the two profile BADGES as
is_hiring / is_open_to_work. Opening the profile is the only thing that reveals those
badges, and this call already opened it, so they cost nothing extra here — this is the
cheapest confirmation available for a person you can already name. (find_prospects with
max_touches does the same for people you cannot yet name, one touch each.)
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| company | No | ||
| location | No | ||
| education | No | ||
| linkedin_id | No | ||
| linkedin_ids | No | ||
| iridium_handle | No | ||
| iridium_handles | No | ||
| headline_keywords | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the per-person cost against a daily budget, the background-job threshold (>3 handles, up to 50, returns job_id readable via get_job, user emailed on completion), and that opening the profile is what reveals the is_hiring / is_open_to_work badges. It also documents the return payload shape, none of which is in structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose first, then the three-tool ordering, then constraints, cost, and return shape. Some repetition creeps in — the find_prospects comparison and the badge/touch cost point are restated in the final paragraph — but the length is largely justified by the volume of 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 9-parameter tool with 0% schema coverage, no annotations, and no output schema, the description supplies everything needed: input constraints, cost model, async behavior, and the concrete response shape including the fields each result carries. Nothing an agent needs to call it correctly or interpret results 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 0% across 9 parameters, so the description must compensate, and it largely does: it states the at-least-one-of constraint across name/linkedin_id/iridium_handle/linkedin_ids/iridium_handles, expresses a preference ordering ('Prefer iridium_handle(s)'), and explains that name plus the hint fields is a keyword search opening up to 5 profiles. It does not explain the format expected for linkedin_id versus iridium_handle, 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?
States a specific verb and resource ('Read the full LinkedIn profile(s)') with scope clarification ('people you already know, or several at once'). It explicitly contrasts itself against the two sibling tools find_person and find_prospects in a labelled ordering block, so an agent can distinguish the tools 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?
Gives an explicit numbered workflow with when-to-use conditions ('Call it only when find_person's headline and proof are not enough') and when-not conditions ('to resolve a name, use find_person'; 'to find people you cannot yet name, use find_prospects'). It also names the alternative path for existing conversations (search_chats + schedule_manual_dm) and warns against messaging from a name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadAInspect
Get Thread
Read a full LinkedIn conversation with one person, local-first, using no Unipile quota
once synced. Returns the most recent messages oldest-first; pass before (the
returned next_cursor) to scroll up into older history.
Args: chat_handle: chat_ handle from list_chats / search_chats before: next_cursor from a prior call, to load older messages limit: messages per page (default 10, max 50)
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| before | No | ||
| chat_handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the burden and does well: it discloses that reads are local-first with no Unipile quota consumed once synced, that messages return oldest-first, and that paging walks backward through history. It omits what happens when a thread has not been synced yet (does it trigger a sync, fail, or return empty), which is the main remaining behavioral unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core prose and the Args block are tight and front-loaded, but the repeated 'Get Thread' header and the '### Responses: **200**: Successful Response (Success Response) Content-Type: application/json' boilerplate add no information and should have been stripped.
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 3-parameter read tool with no annotations and no output schema, the description covers quota behavior, ordering, and pagination, which is what an agent needs to call it correctly. It does not describe the shape of the returned message objects or the next_cursor field itself, leaving the agent to discover the response structure 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 0%, so the description must compensate, and it does: every one of the three parameters is explained, including the source of each value. It adds real meaning beyond the schema by stating the max of 50 for `limit`, which appears nowhere in the schema (which only shows default 10).
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 full LinkedIn conversation with one person') with a clear scope that separates it from list_chats/search_chats (which only supply the handle). It never explicitly contrasts with summarize_thread, the closest sibling that also operates on a thread, so it stops short of a clean 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 concrete guidance on provenance ('chat_handle from list_chats / search_chats') and on when to use the `before` parameter ('pass the returned next_cursor to scroll up into older history'). No explicit when-not-to-use or exclusion against summarize_thread, so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_profileAInspect
Get User Profile
The user's Iridium account state: their saved targeting and voice settings, daily limits and how much of each is used today, counts of pending drafts and queued sends, unread replies, and whether LinkedIn is connected. Read-only.
Check this before any bulk action to see what capacity is left, and before asking the user to supply a setting — it may already be set. The setting fields are named exactly as update_settings takes them, so anything read here can be written straight back.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and explicitly states that the operation is read-only and what account-state data is exposed. It also adds the useful behavioral detail that setting field names match update_settings, allowing read values to be written back directly. It does not discuss permissions, authentication, or data freshness, so it is strong but not fully exhaustive.
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 useful information is front-loaded: purpose, returned state, read-only status, and usage guidance appear immediately. The trailing Responses section is boilerplate API output and does not add much, but it is not large enough to undermine the otherwise efficient structure.
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 a zero-parameter, read-only tool with no output schema, the description is complete enough: it explains what the tool returns, when to use it, and how it relates to update_settings. An agent has sufficient information to decide whether to call it and how to interpret its role in the workflow.
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 tool takes zero parameters, so there are no input semantics to document; the baseline for zero parameters is 4. The note that setting fields align with update_settings is useful context but does not change the parameter semantics of this no-argument 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?
The description uses a specific verb (Get) and resource (User Profile) and enumerates the account state it returns: targeting/voice settings, daily limits and usage, pending drafts, queued sends, unread replies, and LinkedIn connection status. It also distinguishes the read-only nature from update_settings, so an agent can tell what this tool does 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?
It gives explicit when-to-use guidance: check before any bulk action to assess remaining capacity, and check before asking the user for a setting because it may already be set. It also frames the tool as read-only, making clear that write operations belong elsewhere, especially update_settings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chatsAInspect
List Chats
The user's LinkedIn conversations, most recent first. Reads from Iridium's synced copy, so it uses no LinkedIn quota.
Returns chat_ handles for get_thread, summarize_thread, draft_reply, and schedule_manual_dm. If the inbox looks empty on a new account, run backfill_chats once.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does add two valuable behavioral facts: the tool reads a synced copy and consumes no LinkedIn quota. However, it says nothing about freshness/staleness of the synced data, result volume, or whether the full history is returned given there are no pagination parameters.
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 useful content is front-loaded and tight, but the payload opens with a redundant "List Chats" heading and ends with auto-generated noise ("### Responses: **200**: Successful Response ... Content-Type: application/json") that conveys nothing an agent needs.
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?
There is no output schema, so the description must explain the return shape; it only offers the odd phrase "Returns chat_ handles for ...", which hints at an identifier field without documenting it. For a list tool that presumably returns a collection, more on return fields or ordering guarantees would be expected.
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 tool takes zero parameters, so the baseline of 4 applies. There is no parameter meaning for the description to add or omit.
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 the user's LinkedIn conversations) plus ordering semantics (most recent first) and data source (Iridium's synced copy). It names downstream consumers (get_thread, summarize_thread, draft_reply, schedule_manual_dm) and backfill_chats, which helps an agent place it in the workflow, but never explicitly contrasts with the sibling search_chats.
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?
"If the inbox looks empty on a new account, run backfill_chats once" is explicit conditional guidance with the correct alternative tool named. It also clarifies that this is the feeder for thread-level tools. It lacks an explicit when-not (e.g. use search_chats when you need filtering), 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.
list_comment_draftsAInspect
List Comment Drafts
List pending comment drafts awaiting review.
ALWAYS display every draft to the user in full:
Post by [author_name]: [post_text, the complete text, never truncated]
Drafted comment: [comment_text, displayed in full]
Do NOT call approve_comment_draft or schedule anything unless the user explicitly asks.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It contributes useful instructions to display every draft in full and not to approve drafts implicitly, but it does not explicitly confirm read-only behavior, pagination, ordering, or other operational traits.
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 display instructions are relevant, but the description repeats the title and includes a boilerplate 200 response note that adds little value. Overall it remains 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?
With no output schema and no annotations, the description should do more to explain the returned draft structure. It mentions author_name, post_text, and comment_text in the display template, but omits identifiers or other fields an agent might need to act on a draft.
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 tool has zero parameters, so there is no parameter semantics to explain. The schema coverage is complete and no additional parameter guidance is needed.
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 and resource: it lists pending comment drafts awaiting review. The resource name distinguishes it from reply drafts and content drafts, but the description does not explicitly explain how it differs from the generic sibling list_drafts.
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 establishes the usage context as reviewing pending drafts and explicitly warns not to call approve_comment_draft or schedule anything unless the user asks. However, it does not explain when to choose this tool over list_drafts or list_reply_drafts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connection_requestsAInspect
List Connection Requests
List the connection requests the user has RECEIVED and not yet answered: the people who want to connect with them. Use when the user wants to see, count, review or triage who is waiting to connect, e.g. "how many connection requests do I have", "who wants to connect with me", "check my invites", "go through my pending invitations", including a big backlog like 99+.
Synonyms the user may use: connection requests, connect requests, invitations, invites, LinkedIn invites, pending requests, pending invitations, inbound requests, incoming connections, network invitations, My Network invites, people who want to connect, requests to connect.
If the user mentions connection requests but it's unclear they want to work through them now, ask first: "Do you want to work with your connection requests right now?" Calling this can start a background review and an email, so don't call it speculatively.
Each request has the person's name and headline, the note they attached (often empty), any
message they have already sent in the inbox (message, e.g. a recruiter's InMail), and an
accept / maybe / decline suggestion with a confidence. Read-only: it makes no LinkedIn call
and answers nothing. If the list is stale or not yet labelled (reviewing true) it starts a
background review, and the user gets an email when it finishes, so tell them that and don't
wait.
Do NOT use to send connection requests (outreach tools), to read or send messages (list_chats / get_thread), or when the user hasn't asked about received connection requests.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does: it discloses the return shape (name, headline, optional note, existing inbox message, accept/maybe/decline suggestion with confidence) and the non-obvious side effect — a stale list (reviewing true) triggers a background review and an outbound email, so the agent should inform the user and not block. It even reconciles the 'read-only' claim with that side effect rather than hiding 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 and the ask-first warning appears before the detail block, which is the right ordering. Deductions for the redundant title restatement ('List Connection Requests') and a thirteen-item synonym enumeration that could be trimmed without losing routing 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 no-parameter tool with no annotations and no output schema, everything an agent needs is present: what it returns, that it can spawn an async background job and an email, and how to communicate that to the user. Nothing material is left to inference.
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 tool takes zero parameters, so the baseline is 4. The description goes beyond that only by describing the response fields, which is useful but not parameter 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, resource and directionality: 'List the connection requests the user has RECEIVED and not yet answered.' The uppercase RECEIVED and 'not yet answered' scope cleanly separate it from siblings like list_sent_connection_requests, respond_connection_request and withdraw_connection_request 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 example user phrasings ('how many connection requests do I have', 'check my invites'), an explicit ask-first rule for ambiguous mentions, and named exclusions — 'Do NOT use to send connection requests (outreach tools), to read or send messages (list_chats / get_thread)'. Alternatives and when-not conditions are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_content_draftsAInspect
List Content Drafts
The user's own LinkedIn post drafts, waiting for review. Nothing here has been published.
These are posts the user would publish under their own name, distinct from comment drafts (which go on other people's posts) and outreach drafts (which are connection notes). Show each draft in full and let the user decide. Publishing is a separate step.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden; it does convey read-only intent ('List', 'Nothing here has been published') and that drafts are returned in full for user review, with publishing kept as a separate action. It says nothing about pagination, volume limits, or ordering, which matters for a list endpoint with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first two lines and the sibling differentiation is compact. The trailing '### Responses: 200 ... Content-Type: application/json' block is API boilerplate that adds no selection value and slightly dilutes 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 zero-param read tool with no output schema and no annotations, the description supplies what matters: scope, what the records are, what they are not, and that review/publish is a separate step. Missing only return-shape details (fields per draft, ordering), which is a modest gap given the tool's simplicity.
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 tool takes zero parameters, so the baseline is 4; the description correctly implies no filtering arguments are available rather than claiming any narrowing controls. No parameter-related compensation is needed.
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 Content Drafts', the user's own LinkedIn post drafts') and immediately narrows scope with 'waiting for review. Nothing here has been published.' It explicitly distinguishes itself from the near-identical siblings list_comment_drafts and outreach drafts by naming both and explaining 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?
Clear context on when this list is the right one (posts under the user's own name vs. comments on others' posts vs. connection notes), and it flags that 'Publishing is a separate step', routing the agent toward the approve_* siblings. It stops short of naming a fallback like list_drafts for a mixed view, so the routing is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draftsAInspect
List Drafts
Connection-note drafts waiting for review. Nothing here has been sent.
Each entry has a draft_ handle, who it is addressed to, a preview of the note, and the time Iridium suggests sending it. Show the notes to the user and let them decide. Approving is a separate step: call approve_draft only when the user explicitly asks.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares a read-only surface implicitly (drafts waiting for review, none sent), enumerates the entry fields the caller will see, and warns that approval is a distinct action requiring explicit user consent. It stops short of stating volume, ordering, or whether results are truncated.
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 tightly front-loaded: what it lists, what state the items are in, what each entry contains, then the decision/approval rule. The trailing '### Responses: 200 Successful Response / Content-Type: application/json' block is HTTP boilerplate that adds no decision value for an agent.
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 no annotations and no output schema, the description must convey both safety profile and return shape, and it does describe entry fields and the non-destructive nature. Gaps are minor: no guidance on ordering, result size, or how to fetch full note text once a draft handle is chosen.
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 tool takes zero parameters, so there is no parameter semantics to convey and the schema can carry the full contract. The description usefully redirects that space to describing the shape of each returned entry instead.
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 a precise resource subset: connection-note drafts pending review, with the explicit clarification that nothing has been sent. That scoping distinguishes it from the other draft listings (list_reply_drafts, list_comment_drafts, list_content_drafts) without the agent having to open 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?
It sets explicit downstream behavior — show entries to the user and let them decide — and states the approval boundary: call approve_draft only when the user explicitly asks. It does not explicitly contrast with get_draft_detail or list_scheduled, so the routing guidance covers one sibling rather than the full field.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_repliesAInspect
List Replies
Inbound threads awaiting a reply (they messaged last, not yet actioned). Returns chat handles ready for draft_reply / get_thread / schedule_chat_reply.
hiring_signal: true when this sender's cached LinkedIn profile shows the #hiring or #OpenToWork profile BADGE (not post text) — best-effort, from a prior profile fetch, never a new one. False means either confirmed absent or never checked; treat it as "nothing to report," not a confirmed negative.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does substantially more than most: it defines the exact inclusion rule ('they messaged last, not yet actioned') and gives a careful caveat on hiring_signal — badge-only, cached from a prior fetch, never a live fetch, and false means 'nothing to report' rather than a confirmed negative. That prevents a real misread. It still omits ordering, result volume, and whether results are truncated, which matter for a listing 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 filter definition is front-loaded in the first sentence and the follow-up tool routing comes second, so the agent gets the gist immediately. The hiring_signal paragraph is long but earns its length by preventing a misinterpretation. The trailing '### Responses: **200**: Successful Response' block is auto-generated boilerplate that adds nothing.
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 no input params and no output schema, the description must cover what comes back, and it does at a high level ('chat handles'). The hiring_signal field is explained in depth. What is missing for a listing tool is ordering, page size, and truncation behavior — an agent cannot tell how many threads to expect or whether it needs to paginate.
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?
Zero parameters, so there is nothing for the description to document and the baseline is 4. The hiring_signal explanation usefully characterizes a returned field rather than an input, which is bonus context rather than compensation.
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 a precisely scoped resource: inbound threads where the counterparty messaged last and no action has been taken. That scoping parenthetical is what separates it from list_chats / list_reply_drafts without naming them, so an agent can reason about the difference. It stops short of explicitly contrasting with the sibling listing tools, which keeps it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the downstream workflow well ('Returns chat handles ready for draft_reply / get_thread / schedule_chat_reply'), so the agent knows what to do next with results. However, it never says when NOT to use this tool or names the alternative (e.g. list_chats for the full inbox, find_stale_threads for aging threads). Usage is inferable but not differentiated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reply_draftsBInspect
List Reply Drafts
Pending inbound-reply drafts awaiting your review.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the burden. It does disclose a meaningful behavioral trait beyond the name: only pending drafts are returned, not all drafts. However, it says nothing about ordering, pagination, or volume, and the trailing '### Responses: 200' block is raw HTTP boilerplate that adds no behavioral information.
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 useful content is two short sentences and is front-loaded, which is good. But the '### Responses: **200**: Successful Response / Content-Type: application/json' section is pure API documentation noise that wastes the reader's attention without earning 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-parameter read tool with no output schema, the description covers what it lists and the scope (pending), but leaves gaps: no indication of the fields a draft contains, ordering, or how the result feeds the approve/skip/rewrite 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?
The tool takes zero parameters and the schema is empty, so there is no parameter semantics to explain; the baseline of 4 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 and resource ('List Reply Drafts') and narrows scope to 'pending inbound-reply drafts awaiting your review.' That is clear enough to act on, but it never distinguishes this from the many similar siblings such as list_drafts, list_replies, list_comment_drafts, and list_content_drafts, so an agent must guess which list to 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?
The phrase 'awaiting your review' implies this is the queue of drafts that still need a decision (presumably feeding approve_reply_draft/skip_reply_draft/rewrite_reply_draft), but no explicit when-to-use, when-not-to-use, or alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduledAInspect
List Scheduled
Everything approved and queued to send, with the time each one goes out.
These have been approved and WILL send unless cancelled. Use reschedule_send to move one and cancel_scheduled to stop it.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the key behavioral trait that listed items are live and will send unless cancelled, and that each carries a send time. It does not cover ordering, whether past sends are included, pagination, or any read-only confirmation.
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 short, front-loaded sentences that state scope first, then consequence, then alternatives. The trailing '### Responses: 200 Successful Response' block is boilerplate that earns no place but does little harm.
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-parameter read tool with no output schema and no annotations, the description is nearly sufficient: it says what is listed and that each entry includes a send time. It could say more about the shape of each entry or whether results are bounded, but an agent can call it correctly as written.
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 tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate. The schema description coverage is 100% and the input object is empty, so no parameter explanation is owed.
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 Scheduled') and defines the scope precisely: 'Everything approved and queued to send, with the time each one goes out.' This implicitly separates it from list_drafts (unapproved) and list_replies, but never names those siblings explicitly, 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?
Explicitly routes the agent: use reschedule_send to move an item and cancel_scheduled to stop it. Adds the important condition 'WILL send unless cancelled'. What's missing is guidance on when to call this versus list_drafts or list_replies to find a queued item.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sent_connection_requestsAInspect
List Sent Connection Requests
List the user's SENT connection requests that are still pending, meaning awaiting acceptance, whatever their age and whether or not Iridium sent them. LinkedIn only keeps pending requests: accepted ones become connections, and declined, expired or withdrawn ones are gone. Use for "show/list my sent requests", "who hasn't accepted", "how many pending", "oldest pending", "clean up old invites". If the user asks for ALL requests Iridium sent, including accepted and failed ones, also read get_activity_log and say that acceptance isn't recorded there.
Synonyms the user may use: sent connection requests, sent invitations, pending invitations I sent, outgoing requests, invites awaiting acceptance, unanswered requests, requests nobody accepted, my outbound invites.
Read live from LinkedIn (a few times a day at most; it is budgeted). Each item has name,
headline, sent_at, days_waiting, the note sent, and a handle when Iridium sent it:
only those can be withdrawn with withdraw_connection_request. Requests sent by hand on
LinkedIn are listed without a handle. total is how many were read; complete: false
means there are more than 500 pending, so the oldest may be missing. Use order=oldest to
find the stalest.
Do NOT use for requests the user RECEIVED (list_connection_requests) or ones still queued to send (list_scheduled).
Args: limit: how many to return (default 100) order: newest or oldest first
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| order | No | newest |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and meets it: it discloses that data is read live from LinkedIn, budgeted to a few times a day, and that LinkedIn only retains pending requests. It also explains return fields, the `handle` presence/withdrawal constraint, `total` semantics, and the `complete: false` >500 caveat.
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 usage, then behavior and exclusions. It is somewhat long, especially the synonym list, but most sentences add real value for a tool with no annotations or output schema. A little trimming of the synonym block would improve it.
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 no annotations, no output schema, and only two optional parameters, the description is complete enough for correct invocation. It covers purpose, usage, alternatives, behavioral constraints, return values, edge cases, and parameter semantics, leaving no material gap for an 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?
Schema description coverage is 0%, so the description must compensate. It explains that `limit` is how many to return (default 100) and that `order` selects newest or oldest first, including the practical purpose of `order=oldest` for finding the stalest. The 500 maximum is only implied through the `complete: false` caveat rather than stated as a parameter constraint.
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: 'List the user's SENT connection requests that are still pending.' It immediately distinguishes this from received requests (list_connection_requests) and queued requests (list_scheduled), so an agent can select it without opening sibling 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 gives explicit when-to-use phrases ('show/list my sent requests', 'who hasn't accepted', 'oldest pending') and an explicit do-not-use clause for received or scheduled requests. Alternatives are named directly, leaving no inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_solved_issuesAInspect
List Solved Issues
Known problems the Iridium team has already fixed, newest first.
Returns a list of {title, resolution, solved_at}. Read-only — nothing is sent or changed.
USE THIS before report_issue, to check whether the thing you just hit is already solved, and when a user asks whether a problem they remember has been fixed.
DO NOT USE as general help or documentation: this is only the list of past breakages, not a description of what Iridium can do. Call list_tools for that.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and mostly does: it declares the operation read-only and side-effect free ('nothing is sent or changed'), states the sort order (newest first), and names the returned fields. It does not mention result size limits or pagination, which is the only remaining gap for a list 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?
Strong front-loading: purpose first, then use/do-not-use in caps-labelled blocks. Minor waste from the leading title restatement ('List Solved Issues') and the trailing HTTP '### Responses: **200**' boilerplate that adds nothing for an agent.
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-parameter read tool with no output schema, the description supplies everything an agent needs: ordering, returned fields, side-effect profile, and routing to siblings. There is no meaningful missing information.
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 tool takes no parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the description also correctly implies no filtering arguments are accepted.
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 plus a precise scope: 'Known problems the Iridium team has already fixed, newest first.' It is clearly separated from list_tools (capabilities) and report_issue (filing new bugs), so an agent can pick it 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 both a proactive trigger ('USE THIS before report_issue, to check whether the thing you just hit is already solved') and a reactive one ('when a user asks whether a problem they remember has been fixed'). It also names an explicit exclusion and the correct alternative ('DO NOT USE as general help or documentation... Call list_tools for that').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_toolsAInspect
List Tools
The Iridium tools available to this account, filtered by what the user has enabled.
Useful for answering "what can you do?" without guessing. A tool absent from this list is switched off for this account, so do not offer it.
Returns capabilities, the handful of jobs Iridium does, and tools, the flat list behind
them. Lead with the capabilities when answering the user. Read tools when picking the call.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and mostly does: it discloses that results are account-scoped and permission-filtered, that absence means the tool is disabled rather than nonexistent, and that responses are 200/JSON. It does not state read-only/no-side-effects explicitly or whether the list is cached, so one behavioral trait is 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?
The core content is front-loaded and tight: purpose, trigger, constraint, and return anatomy in three short sentences. The trailing '### Responses: 200 ... Content-Type: application/json' block is boilerplate from the spec dump and earns no place in the 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?
There is no output schema, no annotations, and no parameters, yet the description still explains the two return fields (capabilities and tools), the filtering semantics, and how to use each field. Nothing an agent needs to call this correctly and interpret it 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 tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It correctly adds no parameter noise.
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 Tools') and immediately narrows the scope: the Iridium tools available to this account, filtered by what the user has enabled. It is unmistakably a discovery/meta tool, which cleanly separates it from all 60+ action siblings like run_outreach_pipeline or list_drafts.
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 trigger ('answering "what can you do?" without guessing') and an explicit negative rule with a consequence: 'A tool absent from this list is switched off for this account, so do not offer it.' It also tells the agent which return field to use for which task (capabilities for user-facing answers, tools for picking the call).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_issueAInspect
Report Issue
Send the Iridium team an anonymous note about something that broke while you were working.
Returns {"received": true}. Nothing is sent to LinkedIn and nothing about the account is changed. This is NOT a support ticket: the report carries nothing that identifies the user, nobody will reply, and there is no way to follow it up. It exists so the team can see which workflows break most and which ones users cannot work without.
USE THIS when an Iridium tool failed, returned something wrong, or made a workflow the user cares about impossible to finish — especially if you have hit it more than once.
DO NOT USE when the user just needs to be told something (a cap was reached, LinkedIn is disconnected, a draft was skipped) — tell them, that is not a break. Do not use it to ask a question, request a feature, or chase a previous report. Call list_solved_issues first; if the problem is already fixed there, tell the user instead of reporting it again.
Args: what_broke: One line on what failed. Max 200 characters. how_it_happened: One line on the steps that led to it. Max 200 characters. frequency: One of first_time, sometimes, every_time. importance: One of nice_to_have, important, blocking — how much the user needs this workflow to work.
NEVER include personal or identifying information in either text field: no names, company names, job titles, message or post text, email addresses, phone numbers, URLs, @handles, or Iridium handles (draft_, chat_, prof_). Describe the shape of the failure, not the data it happened to. "Approving a connection note fails when the note ends in a question mark" is a report; anything naming a person is not. Text containing an identifier is rejected with 422 — restate it without one rather than working around the check.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| frequency | Yes | How often you have seen this failure. | |
| importance | Yes | How much the broken workflow matters to the user you are serving. | |
| what_broke | Yes | What failed, in one line. No names, companies, message text, emails, URLs, or Iridium handles — the field is rejected if it contains any. | |
| how_it_happened | Yes | The steps that led to it, in one line. Same rule: describe the shape of the failure, never the data it happened to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does it: it declares the anonymity policy, that nothing is sent to LinkedIn, that no account state changes, that nobody replies, that the report cannot be followed up, the exact return payload, and the 422 rejection behavior with guidance on how to recover. This is far beyond what a bare mutation flag would 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 purpose, then return contract, then use/don't-use, then arg guidance, then the privacy rule — a logical order an agent can scan. It is long and a few points repeat (the no-identifiers rule appears in the args block and again in the NEVER paragraph, and again in the schema), but every section earns its place given the privacy gate is a hard failure mode.
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 four-required-parameter write-ish tool with no annotations and no output schema, the description supplies the return value, the failure mode (422), the privacy contract, the sibling pre-check, and the routing rules. Nothing an agent needs in order to call this correctly or avoid calling it wrongly 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, but the description adds real value the schema does not: the meaning of the three importance levels, the 200-character limit restated, a concrete worked example of an acceptable report vs. an unacceptable one, and the enumeration of forbidden identifier types (names, companies, @handles, draft_/chat_/prof_ prefixes). Only the frequency enum gets no extra gloss beyond what the schema already says.
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 ('send the Iridium team an anonymous note about something that broke') and immediately distinguishes it from the two things it could be confused with: a support ticket and a LinkedIn-side action. An agent can tell from the first paragraph exactly what this tool does and does not accomplish.
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 USE THIS / DO NOT USE blocks with concrete triggering conditions ('tool failed, returned something wrong, or made a workflow the user cares about impossible to finish') and named exclusions (cap reached, LinkedIn disconnected, draft skipped — tell them instead). It also names the sibling list_solved_issues as a mandatory pre-check and gives the decision rule for what to do with its result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_sendAInspect
Reschedule Send
Move a pending send to a different time. It has already been approved, so it will send.
Args: handle: draft_ handle from list_scheduled or approve_draft send_at: "now" to send immediately, else ISO-8601 e.g. "2026-06-11T09:00:00+00:00"
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| send_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and usefully discloses the key side effect that the send will actually go out because it has already been approved, and that send_at="now" sends immediately. It still omits permission requirements and error behavior, so it is not fully transparent.
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?
It is short and front-loaded: the core action and side effect appear before argument details, with no unnecessary filler beyond the response label.
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-parameter mutation, it covers purpose, both parameters, the key side effect, and success response. It lacks error cases and detailed return information, but no 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 description coverage is 0%, so the description must compensate; it defines both required parameters, including where the handle comes from and that send_at accepts "now" or ISO-8601 with an example.
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 action and resource: rescheduling a pending send to a different time. This clearly differentiates it from siblings like list_scheduled, cancel_scheduled, and approve_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?
It implies usage for an already approved pending send and points to list_scheduled or approve_draft as handle sources, but it does not explicitly say when to use cancel_scheduled or the schedule_* tools instead, nor when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
respond_connection_requestAInspect
Respond Connection Request
Respond to ONE received connection request: accept it or decline it. Do not run this without first listing the connection requests to the user (list_connection_requests). Use only after the user has decided specifically what to do, and has named who clearly: a person ("accept Brenda") or a clearly defined group ("decline all the recruiters", "accept everyone from Gitforce"). Never respond on your own initiative, and never just because a request is labelled accept or decline.
For a group, work it out yourself from the list (name, headline, note, message), then call this once per person, one at a time, until you have covered them all. If any request doesn't clearly fit what the user described, skip that one, finish the rest, then ask the user about the skipped ones. If the user asks about something specific, call list_connection_requests once first, then confirm with them which people and which action, so both you and the user know the right operation was requested.
Takes one handle (from list_connection_requests) and action: accept or decline.
Synonyms the user may use: accept / approve / add / connect with; decline / reject /
ignore / dismiss / turn down; applied to connection requests, invites or invitations.
"Ignore" means decline (there is no separate ignore action).
Not instant: each request is queued and answered in the background, spaced out and under a daily limit, to protect the LinkedIn account. After the last one, tell the user once that they'll get an email when it's done. It cannot be undone.
Do NOT use to send or withdraw your own connection requests, or to reply to messages.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that actions are queued and processed in the background, spaced out under a daily limit, that the user gets one email on completion, and that the operation cannot be undone. It also flags a semantic trap ('ignore' means decline, there is no separate ignore action).
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 instruction is front-loaded in the first two sentences and every block carries real information (prerequisites, group procedure, queuing/irreversibility, exclusions). It is somewhat long and repeats the 'call list_connection_requests first' guidance in two separate paragraphs, which costs 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?
For a two-param, no-annotation, no-output-schema mutation tool, the definition covers everything an agent needs: prerequisites, decision authority, per-person iteration for groups, the ambiguous-case fallback, async completion feedback, irreversibility, and the sibling operations it is not. Only the 200-only response shape 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 0%, so the description must compensate, and it does for the key ambiguity: it tells the agent the `handle` comes from list_connection_requests, and that `action` is accept or decline, mapping user synonyms (approve/add/connect, reject/ignore/dismiss) onto the two enum values. It stops short of describing handle format or validation.
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 (respond: accept or decline) and a specific resource (one received connection request), and immediately scopes it to ONE request, which distinguishes it from list_connection_requests and from withdraw_connection_request named at the end. The agent can tell exactly what operation this performs without reading 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?
Gives explicit preconditions (must call list_connection_requests first, must have a user decision naming who), explicit exclusions (never act on own initiative, not for sending/withdrawing own requests or replying to messages), and a procedure for the ambiguous group case (skip unclear ones, finish the rest, then ask). Alternatives are named outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rewrite_comment_draftAInspect
Rewrite Comment Draft
Rewrite a comment draft with an instruction. Does not post.
The rewrite runs in the background, so call list_comment_drafts afterwards to read the new text.
Args: handle: cdft_ handle from list_comment_drafts. instruction: what to change, for example "shorter", "ask a question at the end", "drop the praise". Omit for a general retry.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the operation is asynchronous and runs in the background, and that it does not publish. It does not say whether the rewrite overwrites the existing draft text in place (i.e. whether the handle stays valid and the old text is lost), which is the main remaining behavioral uncertainty.
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 content is front-loaded and the async warning is correctly placed before the Args block. The trailing '### Responses: **200**' HTTP boilerplate adds no information for an agent and slightly dilutes the 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?
No annotations and no output schema, so the description must do the work, and it does: async behavior, follow-up read step, and both parameters are covered. The gap is what the eventual read-back looks like and whether the draft handle remains the same after rewriting.
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 0%, yet the description documents both parameters: handle is typed as a 'cdft_ handle from list_comment_drafts' (source and format), and instruction is explained with concrete examples plus the semantics of omitting it. This fully compensates for the empty 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 ('Rewrite a comment draft') and adds a key boundary: 'Does not post.' This distinguishes it from approve_* and run_commenting_pipeline. It does not, however, differentiate itself from the close sibling edit_comment_draft, which an agent could easily confuse with rewriting.
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 follow-up procedure ('call list_comment_drafts afterwards to read the new text') and a default rule for the optional parameter ('Omit for a general retry'). It lacks an explicit when-not rule, e.g. when to choose edit_comment_draft instead of a rewrite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rewrite_content_draftAInspect
Rewrite Content Draft
Rewrite a post draft with an instruction. Does not publish.
The rewrite runs in the background, so call list_content_drafts afterwards to read the new text.
Args: handle: ctnt_ handle from list_content_drafts. instruction: what to change, for example "punchier hook", "cut it in half", "end on a question".
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| instruction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully discloses that the rewrite is asynchronous, does not publish, and requires a follow-up list_content_drafts call, but it does not describe permissions, error behavior, or what the immediate response contains.
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 behavior and follow-up step are front-loaded and easy to scan. There is minor waste from repeating the title and including boilerplate HTTP 200 response text, but the useful content is not buried.
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 no output schema and no annotations, the description provides enough context to call the tool correctly: what it does, how to obtain the handle, examples for the instruction, and how to retrieve the resulting text. It leaves some operational details undocumented, but the async workflow is covered.
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 0%, so the description has to compensate. It does so for both parameters by explaining that handle is a ctnt_ handle from list_content_drafts and giving examples of what instruction means, although it does not clarify that instruction is optional 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 verb and resource: "Rewrite a post draft with an instruction." The ctnt_ handle reference links it to content drafts and helps distinguish it from reply/comment draft tools, though it does not explicitly contrast it with the generic rewrite_draft sibling.
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: this rewrites rather than publishes, and the rewrite runs in the background so the agent should call list_content_drafts afterward to read the result. It does not explicitly say when to choose rewrite_draft versus rewrite_content_draft, so it stops short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rewrite_draftAInspect
Rewrite Draft
Rewrite a connection-note draft with an instruction. Does not send.
The rewrite runs in the background, so the new text is not in the response. Call get_draft_detail or list_drafts afterwards to read the result.
Args: handle: draft_ handle from list_drafts. instruction: what to change, for example "shorter", "lead with the mutual connection", "drop the compliment".
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| instruction | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does well: it discloses that the operation is non-sending, that it executes in the background, and that the new text will NOT be in the response — the single most important fact for correct orchestration. It omits permission requirements, whether repeated calls compound changes, and failure behavior, 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 purpose, then the critical async caveat, then per-argument notes — good ordering with no wasted prose in the body. The trailing "### Responses: **200**: Successful Response ... Content-Type: application/json" block is HTTP boilerplate that adds nothing for an agent and slightly dilutes the 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 two-parameter, no-output-schema, no-annotation tool, the definition covers the essentials: what it mutates, that it does not send, and exactly how to retrieve the result. Remaining gaps are secondary — whether the rewrite overwrites the existing draft in place, and whether re-invoking stacks changes.
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 0%, so the description must compensate, and it does: it identifies the 'draft_' handle prefix and its provenance (list_drafts), and characterizes the instruction semantically with three concrete examples of the expected free-form style. That is meaningfully more than the bare string types 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 — "Rewrite a connection-note draft with an instruction" — and immediately bounds the outcome with "Does not send." The phrase "connection-note draft" distinguishes it from the sibling rewrite_reply_draft, rewrite_comment_draft, and rewrite_content_draft without the agent needing to open 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?
It gives clear operational context: the rewrite is asynchronous, so the caller must follow up with get_draft_detail or list_drafts, and the handle is sourced from list_drafts. It does not explicitly say when to prefer this over edit_comment_draft-style manual editing or when to pick the sibling rewrite_* tools, but the resource scoping makes the choice largely self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rewrite_reply_draftBInspect
Rewrite Reply Draft
Rewrite a reply draft with an instruction, for example 'shorter' or 'propose Tuesday'. Does not send.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| instruction | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose one important trait: it does not send, so no external side effect occurs. It does not say whether the rewrite replaces the existing draft text in place or creates a new version, whether the original is recoverable, or whether approval is still required afterwards.
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 sentence is tight and front-loaded, and the instruction example earns its place. The trailing '### Responses: **200**: Successful Response (Success Response) Content-Type: application/json' block is boilerplate that tells an agent nothing actionable and dilutes the 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?
There is no output schema and no annotations, and one of the two required parameters is undefined, yet the description never says what comes back (rewritten text? a draft object? an ID) or what a handle is. For a two-required-parameter mutation tool with zero structured support, this leaves too much to guesswork.
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 0%, so the description must compensate. The instruction parameter is genuinely illuminated by the 'shorter' / 'propose Tuesday' examples, which show it is a free-text directive rather than a keyword. The 'handle' parameter gets no explanation at all, leaving it unclear whether it identifies a draft, a thread, or a person.
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: 'Rewrite a reply draft with an instruction', and gives concrete instruction examples ('shorter', 'propose Tuesday'). The resource name itself ('reply draft') separates it from rewrite_draft, rewrite_comment_draft and rewrite_content_draft in the sibling list, though the description never makes that distinction 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?
'Does not send' implies this is a safe pre-send editing step, which hints at where it sits relative to draft_reply and approve_reply_draft. However, it never states when to rewrite versus re-draft or edit, nor any precondition such as the draft needing to exist 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.
run_commenting_pipelineAInspect
Run Commenting Pipeline
Generate up to 3 LinkedIn comment drafts on relevant posts, found by searching all of LinkedIn for the user's saved comment_topics.
USE THIS when the user wants to comment by TOPIC, or names no target in particular: "find me some posts to comment on" "comment on posts about RAG" "who's worth engaging with this week?"
DO NOT USE when the user names specific companies ("comment on posts from people at Stripe"). Use run_company_commenting_pipeline instead.
After calling this tool, ALWAYS display every draft to the user in full:
Post by [author_name]: [post_text, the complete text, never truncated]
Drafted comment: [comment_text, displayed in full]
Do NOT call approve_comment_draft or schedule anything unless the user explicitly asks.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the 3-draft cap, that search spans all of LinkedIn, that it draws on saved comment_topics, that the caller must display every draft in full, and that nothing is approved or scheduled automatically. It stops short of saying whether the drafts persist and become visible to list_comment_drafts, or what happens when no relevant posts are found.
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, then a labeled use/do-not-use block, then post-call output instructions — a clean hierarchy. The mandated display template is somewhat verbose and the appended HTTP response boilerplate adds little, but nearly every line changes agent 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?
There is no output schema, and the description compensates by naming the returned fields (author_name, post_text, comment_text) and prescribing exactly how to render them. For a zero-parameter, no-annotation tool, an agent has everything it needs to call it and act on the result.
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 tool takes zero parameters, which is the baseline 4 case; there is nothing for the description to disambiguate. Its implicit note that topics come from the user's saved comment_topics usefully explains where the input actually comes from, given the empty 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 ('Generate up to 3 LinkedIn comment drafts on relevant posts') plus the mechanism ('searching all of LinkedIn for the user's saved comment_topics'). It explicitly distinguishes itself from run_company_commenting_pipeline and, by scope, from search_posts_by_topic.
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 an explicit USE THIS block with three realistic utterances, plus a DO NOT USE rule naming the situation (user names specific companies) and the correct alternative tool. Nothing about tool 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.
run_company_commenting_pipelineAInspect
Run Company Commenting Pipeline
Generate LinkedIn comment drafts on recent posts by people who work at specific companies.
USE THIS when the user names one or more companies: "comment on posts from people at Stripe" "I want to be visible to Anthropic and OpenAI engineers" "engage with anything Ramp employees posted this week"
DO NOT USE for topic- or keyword-based commenting ("find me AI posts to comment on", "comment on posts about RAG"). Use run_commenting_pipeline instead, which searches the whole of LinkedIn by the user's saved comment_topics.
How it differs: this tool searches by AUTHOR COMPANY and recency only, with no keyword filter, because ANDing a keyword against a single employer usually returns nothing. Topical relevance is then judged by the model over whatever those employees actually posted. As a result it may legitimately return zero drafts if nobody at those companies posted anything worth engaging with; that is a valid outcome, not an error, and you should say so plainly rather than retrying.
Takes up to 5 companies per call. Companies with no matching LinkedIn page come back in unresolved_companies, so tell the user which ones failed.
After calling this tool, ALWAYS display every draft to the user in full:
Post by [author_name] ([company]): [post_text, the complete text, never truncated]
Drafted comment: [comment_text, displayed in full]
Do NOT call approve_comment_draft or schedule anything unless the user explicitly asks.
Args: companies: Company names, e.g. ["Stripe", "Ramp"]. Max 5. n: How many drafts to generate (default 3, capped by the user's remaining daily cap). date_posted: "past_24h" | "past_week" | "past_month". Default "past_week".
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | ||
| companies | Yes | ||
| date_posted | No | past_week |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so well: it explains the no-keyword-filter design, that zero drafts is a valid outcome not an error, that unresolved_companies should be surfaced, that n is capped by the user's daily cap, and that the model judges topical relevance. It also specifies the required post-call behavior of displaying every draft in full.
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 then a clear USE/DO NOT USE structure. The long output-format template and follow-up instructions are useful but make it longer than a typical tool description; still, nearly every sentence serves a distinct behavioral or routing 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?
Complete for a multi-parameter pipeline tool with no annotations and no output schema. It covers routing, parameter semantics, failure modes, empty-result handling, caps, and required post-call display behavior, leaving little an agent would need 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?
Schema coverage is 0%, but the Args section documents all three parameters: companies with a max of 5, n with default 3 and daily-cap behavior, and date_posted with the allowed values and default. This adds essential meaning beyond the bare schema, which has no descriptions or 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?
States a specific verb and resource: generate LinkedIn comment drafts on recent posts by employees of named companies. It explicitly distinguishes from the sibling run_commenting_pipeline by explaining this tool searches by AUTHOR COMPANY and recency, not keywords.
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 trigger examples ('comment on posts from people at Stripe') and an explicit DO NOT USE case with examples, naming run_commenting_pipeline as the alternative for topic/keyword commenting. Also states not to approve or schedule unless asked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_content_pipelineAInspect
Run Content Pipeline
Draft LinkedIn posts for the user to publish, from their saved content topics and voice. Produces drafts only and publishes nothing.
Runs in the background and returns immediately. Call list_content_drafts to read the results. Requires content topics to be set, otherwise it returns an error saying so. Runs at most once a day, and returns status "skipped" with reason "already ran today" on a second call.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well. It discloses that the tool runs in the background and returns immediately, publishes nothing, requires content topics, reads results elsewhere, and returns a skipped status with reason on a same-day second 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 important constraints are front-loaded and easy to scan. There is minor waste in the repeated title line and the boilerplate Responses/Content-Type section, but the description is still compact and purposeful.
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-parameter asynchronous tool with no output schema and no annotations, the description supplies everything an agent needs: purpose, non-publishing behavior, asynchronous result retrieval, prerequisite, rate limit, and skipped-status 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 tool has zero parameters, so parameter semantics are effectively moot and the schema is empty. The baseline for a zero-parameter tool is 4.
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: drafting LinkedIn posts from saved content topics and voice. It also distinguishes the output from publishing ('Produces drafts only and publishes nothing') and routes result-reading to list_content_drafts, so the agent can identify the tool's 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?
It gives clear operating context: saved content topics are required, results are read via list_content_drafts, and the pipeline runs at most once per day. It does not explicitly enumerate when to choose this over run_outreach_pipeline or run_commenting_pipeline, but the content-specific framing makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_outreach_pipelineAInspect
Run Outreach Pipeline
Draft 3 connection notes against the user's saved targets and return them inline in about 5 seconds. Produces drafts only and sends nothing.
After calling this tool, ALWAYS display every draft to the user in full:
[Name], [Headline] at [Company] [note_text, displayed in full] Suggested send: [suggested_send_at]
Do NOT call approve_draft or schedule anything unless the user explicitly asks.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that output is drafts only and nothing is sent (safe/non-destructive), gives expected latency (~5 seconds), fixes the output cardinality at 3, and specifies inline return. It omits prerequisites such as whether LinkedIn credentials must be connected and what happens when no saved targets exist.
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 behavior is front-loaded in a single strong first sentence, and the display template and do-not-chase constraints are actionable. The trailing '### Responses: **200**: Successful Response / Content-Type: application/json' block is raw OpenAPI boilerplate that adds no decision value.
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 no output schema and no annotations, the description compensates well by fully specifying the returned draft fields and the required presentation format, so an agent knows exactly what to show. The remaining gaps are prerequisites (connected LinkedIn account) and failure/empty-target behavior, which matter for a pipeline 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?
Zero-parameter tool, so the baseline is 4; there is nothing for the description to disambiguate. The only missed opportunity is noting that targets are configured elsewhere rather than passed as arguments.
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+cardinality: 'Draft 3 connection notes against the user's saved targets and return them inline in about 5 seconds.' 'Connection notes' implicitly separates it from run_commenting_pipeline and run_content_pipeline, but no sibling is named explicitly, 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?
Provides a clear when-not for follow-up tools ('Do NOT call approve_draft or schedule anything unless the user explicitly asks'), which is useful routing guidance. However, it never says when to pick this tool over discover_prospects, find_prospects, or draft_reply, nor how 'saved targets' are populated, so selection guidance is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_chat_replyAInspect
Schedule Chat Reply
Send or schedule a message into an existing conversation. THIS SENDS.
It goes into a thread that already exists, so it creates no new connection and does not count against the daily connection limit. Call it only when the user has approved this specific message.
Args: chat_handle: chat_ handle from list_chats or search_chats. text: the exact message to send. send_at: "now" to send immediately, or ISO-8601 with an offset. Omit for immediate.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| send_at | No | ||
| chat_handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does the important part: it flags the operation as a real send, discloses the connection-limit side effect, and imposes an approval precondition. It omits other behavioral facts an agent would want — idempotency, what happens if send_at is in the past, and whether the scheduled message can later be altered via reschedule_send or cancel_scheduled.
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 'THIS SENDS' warning before any argument detail, then a tight Args block. The trailing '### Responses: 200 Successful Response / Content-Type: application/json' is boilerplate that conveys nothing actionable 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?
Given no annotations and no output schema, the description covers purpose, side effects, preconditions, and every parameter. The remaining gap is return behavior: with siblings like cancel_scheduled and reschedule_send, the agent would benefit from knowing whether a handle or job id comes 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 0%, so the description must compensate and it does: chat_handle is documented with its source tools (list_chats or search_chats), text is pinned to 'the exact message to send', and send_at is given accepted forms ('now', ISO-8601 with offset, or omit for immediate). All three parameters are meaningfully specified.
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 or schedule) and resource (a message into an existing conversation), plus the emphatic 'THIS SENDS' marker so the agent knows the operation's effect. The 'existing thread' framing implicitly separates it from the new-connection DM siblings 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?
Gives a clear selection rule ('only when the user has approved this specific message') and a useful non-obvious fact — it creates no new connection and does not count against the daily connection limit. It does not, however, name the sibling alternatives (schedule_manual_dm, schedule_dm_to_person, draft_reply) that an agent should consider first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_dm_to_personAInspect
Schedule Dm To Person
Send or schedule a direct message to a person you have already found. THIS SENDS.
ONE PERSON, THREE TOOLS - use them in this order:
find_person WHO is this? A name (plus where they worked) returns a confirmed handle and proof. 1 search plus up to 2 profile reads.
get_linkedin_profile TELL ME MORE. A handle returns the full profile and posts. Call it only when find_person's headline and proof are not enough.
schedule_dm_to_person MESSAGE THEM. Pass the profile_handle from step 1. This tool takes a profile_handle, never a name: a name guesses between people who share it. If find_person's verdict is not
confirmed, ask the user which person they mean first. Already in a conversation with them (see search_chats)? Use the chat_ handle with schedule_manual_dm instead; no lookup is needed.
If you already have a thread with this person the message goes into it. Otherwise it is a direct message to a connection, or a connection request with the text as its note. Several messages scheduled at once are spaced out so LinkedIn never sees a burst; the reply says so when a message is moved.
Args: profile_handle: prof_ handle from find_person or get_linkedin_profile (required). text: the exact message to send. send_at: "now" to send immediately, or ISO-8601 with an offset. name: optional; shown in the queue. Read from the profile when omitted. message_type: optional override: connection_request, direct_message or inmail.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| text | Yes | ||
| send_at | No | ||
| message_type | No | ||
| profile_handle | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does well: it discloses that the message routes into an existing thread, else becomes a DM, else a connection-request note, and that batched messages are spaced out to avoid a burst with the reply reporting moves. It stops short of covering auth/permission requirements, reversibility, or how to undo a scheduled send (cancel_scheduled exists but is not mentioned).
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 workflow before the argument list, and every section is scannable. It runs long and repeats the send semantics in both the 'THIS SENDS' line and the routing paragraph, but that repetition is defensible for a high-stakes mutation.
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 5-param mutation with no annotations and no output schema, the definition covers routing, prerequisites, batching behavior, and all argument semantics. What it lacks is any statement of what the 200 response contains beyond 'the reply says so when a message is moved', and no mention of failure modes or permissions.
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 0%, so the description must compensate, and it does: profile_handle is defined as the prof_ handle from find_person/get_linkedin_profile (never a name), text as the exact message, send_at as "now" or ISO-8601 with offset, name as an optional queue label read from the profile when omitted, and message_type with its three concrete 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+resource ('Send or schedule a direct message to a person') and immediately distinguishes itself from the lookup tools that precede it (find_person, get_linkedin_profile) and from the chat-based sibling schedule_manual_dm. The 'THIS SENDS' line makes the state-changing nature unmistakable.
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 ordered workflow (find_person → get_linkedin_profile → schedule_dm_to_person) with conditions for each step, plus a clear exclusion: if already in a thread, use schedule_manual_dm with the chat_ handle instead. It also states a precondition (verdict must be `confirmed`, otherwise ask the user).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_manual_dmBInspect
Schedule Manual Dm
Schedule a direct message to someone you're already connected with. Use list_chats to find the chat_handle for a conversation.
Args: chat_handle: chat_ handle from list_chats or list_replies text: Message text to send send_at: "now" to send immediately, else ISO-8601 e.g. "2026-06-11T09:00:00+00:00" message_type: "direct_message" (default) or "inmail"
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| send_at | No | ||
| chat_handle | Yes | ||
| message_type | No | direct_message |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden; it discloses the send_at="now" vs ISO-8601 semantics and the direct_message/inmail choice. It omits what happens on failed scheduling, whether scheduled messages can be cancelled/edited (see cancel_scheduled, reschedule_send), auth requirements, and any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The Args block is efficient and front-loads the useful constraint, but the definition wastes space repeating the title ("Schedule Manual Dm") and appending boilerplate HTTP response text ("### Responses: **200**... Content-Type: application/json") that adds nothing for tool selection.
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 no output schema and no annotations, more is expected; the description covers inputs and the scheduling concept but says nothing about the return value (job id? message id?) or how the scheduled item relates to cancel_scheduled/list_scheduled. Adequate but with clear 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 0%, so the description must compensate, and it does: all four parameters are explained, including accepted values for send_at and message_type. It falls short of a 5 only in not stating format constraints such as timezone handling or text length limits.
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 a meaningful constraint ("a direct message to someone you're already connected with"). However, it never distinguishes itself from close siblings like schedule_dm_to_person or schedule_chat_reply, which an agent must 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?
Gives one concrete prerequisite step ("Use list_chats to find the chat_handle") and an implicit connection requirement. It offers no guidance on when to pick this over schedule_dm_to_person, schedule_chat_reply, or reschedule_send.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_chatsAInspect
Search Chats
Search your LinkedIn inbox by message content and by structured filters, all local
(no LinkedIn quota). Free text matches participant names and message bodies (e.g.
"who mentioned CMU"). Operators can be passed in q or as discrete args:
is:unread/read · from: · company: · after:/before: ·
newer:d · older:d
Returns chat handles ready for get_thread / schedule_chat_reply.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| name | No | ||
| after | No | ||
| limit | No | ||
| before | No | ||
| company | No | ||
| from_name | No | ||
| is_unread | No | ||
| newer_days | No | ||
| older_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a genuinely useful behavioral trait: execution is local with no LinkedIn quota cost. It also states the return shape at a high level ('chat handles ready for get_thread / schedule_chat_reply'). It omits pagination/limit behavior and any auth or read-only framing, which keeps 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 purpose and cost profile, then the operator list, then the return value — a sensible order with little wasted prose. The trailing '### Responses: 200 ... Content-Type: application/json' boilerplate adds no informational value 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?
For a 10-parameter tool with no annotations and no output schema, the description covers the query grammar, the local-execution property, and what comes back, which is most of what an agent needs. Missing are result-shape detail beyond 'chat handles', how limit interacts with paging, and any notion of result ordering.
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 0%, so the description must compensate, and it largely does: it enumerates the operator vocabulary (is:unread/read, from:, company:, after:/before:, newer:/older:) and maps it onto the discrete args. `limit` is the one parameter with no explanation of its default of 50 or its effect on result volume, 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 verb and resource ('Search your LinkedIn inbox') plus the two search modes: free-text content matching and structured filters. The scope note ('all local, no LinkedIn quota') and the example query 'who mentioned CMU' make the semantics concrete. It does not explicitly name the nearest sibling (list_chats) to contrast with, 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?
Gives clear guidance on how to filter (free text vs. operators) and shows both invocation styles ('in `q` or as discrete args'), plus a worked example. It implicitly routes the agent to get_thread / schedule_chat_reply for follow-up, but never states when NOT to use it or names an alternative tool such as list_chats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_posts_by_topicAInspect
Search Posts By Topic
Search LinkedIn posts by topic and return each post with its author as a candidate. Reads only, drafts nothing, and opens no profiles: the post itself is the evidence and the author comes back inline, so the cost is the same whether it returns 1 post or 50.
USE THIS when the person is defined by what they posted: "who is posting about X", "engineering managers at Nvidia who posted about hiring this month", "people in my network talking about Y". One call answers the whole question — do not search people and then read each one's posts.
DO NOT USE for a people search with no topic (search_prospects / find_prospects), or when
the user wants messages written (discover_prospects). In particular, this tool answers
"who POSTED about hiring" — NOT "who HAS the #hiring badge on their profile", which is
find_prospects' hiring flag and costs a profile touch per person confirmed. The two
return different people.
Args:
keywords: POST TEXT — words the post body must contain, e.g. "hiring", "open roles",
"RAG evals". "#hiring" here matches the hashtag someone TYPED IN A POST; it is not
the profile badge and implies nothing about it. Free: one post search, no profile
opened. (The badge is find_prospects' hiring, and costs a touch per person.)
author_company: Company the author currently works at, by name, e.g. "Nvidia".
author_keywords: Text in the author's headline or title, e.g. "engineering manager".
date_posted: past_day | past_week | past_month (default past_month). Newest first.
posted_by: first_connections or people_you_follow to stay inside the user's network.
limit: Max posts to return (1-50, default 10). Reposts are dropped.
Returns {"posts": [...], "count": N, "has_more": bool}. Each post: text, date, post_url, reaction_count, comment_count, and author {name, headline, is_company, handle}. The handle is a prof_ handle (null for company pages) — pass it to get_linkedin_profile for the full profile, or straight to schedule_dm_to_person / enroll_prospect.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| keywords | Yes | ||
| posted_by | No | ||
| date_posted | No | past_month | |
| author_company | No | ||
| author_keywords | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it declares reads-only, no drafts, no profile opens, an explicit cost model ('the cost is the same whether it returns 1 post or 50'), ordering (newest first), and that reposts are dropped. It omits any statement about auth/permission prerequisites or rate limits, which keeps it off 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?
Well front-loaded and sectioned (scope → USE → DO NOT USE → Args → Returns), so an agent can scan it quickly. Minor waste: the title is restated verbatim at the top, and the '#hiring post vs profile badge' distinction is made twice, though the repetition is defensible given the stakes.
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 six-parameter tool with no annotations and no output schema, the description supplies everything needed: full parameter semantics, the return shape ({posts, count, has_more} with per-post fields), and a hand-off hint that prof_ handles feed get_linkedin_profile or schedule_dm_to_person. Nothing an agent needs to call or chain this tool 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?
Despite 0% schema description coverage, every one of the six parameters is explained with meaning beyond the schema: keywords is post-body text (and hashtag-in-post ≠ profile badge), author_company and author_keywords are author-side filters, date_posted enumerates values with default and sort order, posted_by defines the network scope, and limit gives range, default, and the repost-dropping 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 verb and resource ('Search LinkedIn posts by topic') plus the exact output contract: each post returned with its author as a candidate. The second paragraph makes the distinction from people-search siblings (search_prospects, find_prospects) unmistakable.
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 'USE THIS when' with three concrete query examples, plus a 'DO NOT USE' clause naming the alternatives (search_prospects / find_prospects for topic-less people search, discover_prospects for message writing). It even resolves the subtle case of posted-about-hiring vs profile #hiring badge, which is exactly where an agent would otherwise pick the wrong tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_prospectsAInspect
Search Prospects
The cheapest people search there is: ONE LinkedIn action, no profile opened, no badge checked. Reads only, drafts nothing.
It is not specific to any signal. It returns whoever matches the query and location —
that is all it knows. hiring_only / open_to_work_only do NOT filter and do NOT
confirm anything: they only REORDER the same results using hints in the headline and
title text, which is a guess, not the badge. Someone with the real #hiring badge and a
plain headline sorts last; someone who typed "hiring" in their headline and has no badge
sorts first.
USE THIS to browse cheaply, or to get a long list to narrow by hand.
DO NOT USE when the answer has to be TRUE about a badge — "people who are actually hiring", "who is really open to work". This tool cannot know: the badge lives only on the full profile. Use find_prospects, which opens profiles and tells you which candidates it confirmed.
DO NOT USE when the user wants messages written. discover_prospects searches and drafts a connection note for each person in one call.
Results are read live from LinkedIn at the time of the call.
Args:
hiring_only / open_to_work_only: the profile BADGE (is_hiring / is_open_to_work), not
post text. The badge is never in a people-search result — it lives only on the
full profile (SEARCH.md §7.1/§7.4) — so these do NOT filter; an earlier version
faked the filter out of headline text and returned a near-empty list for almost
every real query. Instead they SORT by how likely each result is to carry the
badge, from free signals already in the search result (headline phrasing, an empty
current work history). Nothing is ever dropped — see note in the response. This
tool opens no profiles, so it never confirms a badge: cost 0 touches, certainty 0.
To confirm, use find_prospects with max_touches (1 touch each).
posted_recently: neither badge nor post text — an ACTIVITY filter ("posted at all in
the past 30 days", regardless of what about). Free at search time, needs a Sales
Navigator seat; on any other plan the search runs without it and tier_note says
so. Default false.
open_to_work: the profile BADGE, confirmed for free at search time by LinkedIn's own
"Open to work" spotlight — applied before results come back, so 0 profile reads.
Needs a full Recruiter seat (Recruiter Lite has no such spotlight); on any other
plan the search runs without it and tier_note says so. Default false. Note this
is the same badge as open_to_work_only above; the difference is that this one is
CONFIRMED by LinkedIn and free, while that one is only a guess at the ordering.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| location | Yes | ||
| hiring_only | No | ||
| open_to_work | No | ||
| posted_recently | No | ||
| open_to_work_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: declares 'Reads only, drafts nothing', quantifies cost (ONE LinkedIn action, zero profile touches), discloses that results are read live at call time, and explains that hiring_only/open_to_work_only reorder rather than filter — including the prior buggy behavior. It also flags that posted_recently and open_to_work require Sales Navigator / full Recruiter seats and degrade gracefully with a `tier_note`.
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 — cost and read-only nature appear in the first two lines, and the USE/DO NOT USE blocks are easy to scan. But the 'the badge lives only on the full profile' point is restated at least four times across the header and Args section, inflating a definition that could be a third shorter 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?
No annotations and no output schema, yet the description covers safety, cost, tier gating, the sort-not-filter semantics, and even references response fields (`note`, `tier_note`). The remaining gap is on the mechanics of the required query/location strings and the `limit` cap, which an 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?
Schema coverage is 0% and there are 7 params, so the description has to compensate — and it explains four of them in real depth, including the crucial distinction between open_to_work (LinkedIn-confirmed spotlight) and open_to_work_only (headline-based guess). However, query, location, and limit are never described (no syntax, no format, no pagination guidance), leaving three params 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+resource ('search prospects') and immediately bounds its scope: matches on query and location only, no signal filtering, no profile opens. It explicitly distinguishes itself from find_prospects (profile-confirming) and discover_prospects (search + draft), so an agent can pick it 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?
Provides explicit 'USE THIS' and two 'DO NOT USE WHEN' clauses, each naming the alternative tool and the condition that selects it (badge truth → find_prospects; message drafting → discover_prospects). This is the textbook when/when-not/alternatives structure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_comment_draftBInspect
Skip Comment Draft
Discard a comment draft without posting it. Nothing reaches LinkedIn.
Args: handle: cdft_ handle from list_comment_drafts.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add the crucial reassurance that "Nothing reaches LinkedIn." However, it does not say whether the draft is deleted permanently, archived, or recoverable, nor whether any permission/connection is required — meaningful gaps 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 core sentence is front-loaded and efficient, but the block is padded with a redundant title restatement, an "Args:" docstring header, and an opaque "### Responses: **200**: Successful Response (Success Response)" dump that conveys nothing actionable.
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 one-parameter tool with no output schema, the description covers purpose, the handle's origin/format, and the no-side-effect guarantee. It still leaves the outcome ambiguous — what the draft becomes after skipping and what the response contains beyond a bare 200.
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 0% and the schema offers only a bare string, so the description must compensate — and it does, naming the parameter explicitly and specifying the `cdft_` handle format sourced from list_comment_drafts. That is real added 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?
States a specific verb+resource ("Discard a comment draft") and the key outcome ("without posting it"). The word "comment" scopes it against the many sibling variants (skip_reply_draft, skip_content_draft, skip_draft), though it never explicitly names which sibling to prefer.
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?
"Discard a comment draft without posting it" implies the use case (rejecting a draft instead of approving it), but there is no explicit when-to-use/when-not guidance and no routing between this and the generic skip_draft sibling. The agent must infer the choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_content_draftAInspect
Skip Content Draft
Discard a post draft without publishing it. Nothing reaches LinkedIn.
Args: handle: ctnt_ handle from list_content_drafts.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does deliver the single most important behavioral fact: nothing is published to LinkedIn, so this is a safe no-side-effect action. It omits what happens to the draft itself (deleted vs. flagged as skipped) and whether the skip is 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?
The core is two efficient sentences, front-loaded with the action. However, the repeated title line and the auto-generated '### Responses: **200**: Successful Response (Success Response)' block are pure generator noise that adds nothing an agent can act on.
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 single-parameter, no-output-schema tool, the definition covers the essentials: the action, the safety guarantee, and where to source the handle. The outstanding gap is the post-call state of the draft, but that is a minor omission at 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 0%, so the description must compensate, and it does: 'handle: ctnt_ handle from list_content_drafts' gives both the format prefix and the discovery path for obtaining the value. Not a 5 because it doesn't say whether the handle is required or flag malformed input.
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: discard a post draft without publishing it, plus the reassurance that nothing reaches LinkedIn. This implicitly distinguishes it from the approve_content_draft / rewrite_content_draft siblings, but it never names them or the generic skip_draft alternative.
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 'without publishing it' implies the use case (rejecting a draft rather than approving it), but there is no explicit when-to-use statement, no prerequisites, and no pointer to the closely related skip_draft or skip_comment_draft siblings that an agent must disambiguate against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_draftAInspect
Skip Draft
Discard a connection-note draft without sending it. Nothing goes to LinkedIn.
Args: handle: draft_ handle from list_drafts.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It discloses the key effect (draft discarded, nothing sent to LinkedIn) and mentions a 200 success response, but omits irreversibility, permissions, and whether the draft can be recovered.
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 action is front-loaded and the body is short. The repeated title and generic response/content-type boilerplate add little value, but do not obscure the core 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?
For a one-parameter tool, the core invocation and no-send side effect are covered. Without annotations or an output schema, however, auth requirements, irreversibility, and detailed return behavior remain undocumented.
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 0%, but the description compensates for the single parameter by explaining its source and prefix: 'draft_ handle from list_drafts.' This adds useful meaning beyond the bare 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 uses a specific verb ('discard') and resource ('connection-note draft') and explicitly says it is not sent. This clearly separates it from approve_draft and from skip_comment_draft, skip_content_draft, and skip_reply_draft 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 a clear usage context: discard an unsent draft and source the handle from list_drafts. However, it does not explicitly name alternatives such as approve_draft or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skip_reply_draftCInspect
Skip Reply Draft
Discard a reply draft without sending.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it never states whether the discard is permanent or reversible, whether a discarded draft can be recovered, or whether any permission/state precondition applies. The one useful addition beyond the name is "without sending," which rules out an accidental send but leaves the mutation semantics opaque.
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 instruction is one efficient sentence, but the definition is padded with a redundant title restatement and HTTP response boilerplate ("**200**: Successful Response", Content-Type) that carries no meaning for an MCP caller. Front-loading is fine; the waste is in the appended transport noise.
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, single-parameter tool with no annotations and no output schema, the description should at minimum explain the handle and the consequences of discarding. Neither is covered, and nothing indicates what a successful call returns or whether the draft is truly removed.
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 0%, so the single required parameter "handle" is completely undocumented in both the schema and the description. The description never says the handle identifies the reply draft (vs. a thread, user, or message), nor what form it takes, leaving the agent 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?
The sentence "Discard a reply draft without sending" gives a specific verb (discard/skip) and resource (reply draft), and "without sending" clarifies that no message goes out. It falls short of 5 because it doesn't distinguish this from the several near-identical siblings (skip_draft, skip_comment_draft, skip_content_draft), leaving the agent to infer scope from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus the other skip_* siblings or the approve_/rewrite_ variants. The only usable signal — that this discards rather than sends — is embedded in the purpose sentence, not framed as guidance, so the agent gets no explicit selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarize_threadAInspect
Summarize Thread
Structured summary of one conversation so you don't re-read it: participants, company, the core ask, current state, and the suggested next step. Cached until a new message arrives (pass force=true to recompute).
Args: chat_handle: chat_ handle from list_chats / search_chats force: recompute even if a fresh cached summary exists
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| chat_handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does disclose a genuinely useful behavioral trait — results are cached until a new message arrives, and force=true overrides the cache — plus the auto-generated 200 response line. It does not state that the operation is read-only/safe, what happens with an invalid or foreign chat_handle, or the cost of a forced recompute, leaving meaningful gaps for a zero-annotation 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 summary contents are front-loaded and the two args are listed compactly; nearly every sentence carries information. Points off for the 'Summarize Thread' heading duplicating the tool name and for the trailing '**200**: Successful Response' boilerplate, which adds nothing.
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 only two parameters, no annotations and no output schema, the description supplies what the structured fields don't: the summary's field list stands in for a return-value spec, and both parameters are explained. Missing only edge-case behavior (invalid handle, empty thread), which is minor at 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 0%, so the description must compensate and largely does: chat_handle is tied to its source tools (list_chats / search_chats) and force is defined as 'recompute even if a fresh cached summary exists'. The string format of chat_handle itself is never described, but the provenance hint is the practically important part.
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 ('Summarize Thread') and then enumerates exactly what the summary contains: participants, company, core ask, current state, suggested next step. That is far more than a restated name. It differentiates from get_thread only implicitly ('so you don't re-read it') rather than naming the sibling, which keeps it off 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?
'so you don't re-read it' implies the use case (prefer this over reading raw messages) and the caching note tells the agent when a repeat call is cheap. However, no sibling is named and there is no explicit when-not guidance, so the agent must infer the alternative from nearby tools like get_thread.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_settingsAInspect
Update Settings
Change the user's profile, targeting and limits. Persists immediately, sends nothing.
Every field is optional and only the ones passed are changed; each field's own description says what it does. Pipelines read these settings, so this is how "only comment on AI posts" or "cap me at 5 a day" gets applied.
This is also how you clear a blocked pipeline. When a run fails for a missing setting, the error names the field: ask the user for it in plain language, send it here, then retry the run. Never invent a value the user did not give you.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| voice_dna | No | Writing rules applied to every draft, e.g. 'no buzzwords, direct, max 2 sentences'. | |
| current_role | No | The user's role and company, e.g. 'Founder at Acme'. | |
| target_cities | No | Cities to search in, e.g. ['San Francisco', 'New York']. | |
| comment_topics | No | Subjects searched when finding posts to comment on. | |
| content_topics | No | Subjects the user's own posts are drafted about. | |
| style_examples | No | Up to 3 approved note texts to imitate. | |
| credential_lead | No | One or two sentences on why the user is credible. Opens outreach messages. | |
| networking_goal | No | What the user wants from the people they reach, e.g. 'find design partners'. | |
| outreach_intent | No | Message strategy: 'sell', 'connection' or 'referral'. | |
| search_keywords | No | Keywords searched alongside the personas, e.g. ['AI platform']. | |
| target_personas | No | Job titles to search for, e.g. ['VP of Engineering', 'Founder']. | |
| network_post_pct | No | Percent of comments sourced from in-network posts; the rest come from keyword search. | |
| new_position_pct | No | Percent of the daily cap allowed for new-role announcement posts. | |
| onboarding_goals | No | Which pipelines are active. Any of ['commenting', 'content', 'outreach']. | |
| target_countries | No | Countries to search in, e.g. ['United States']. | |
| daily_comment_cap | No | Comments per day, clamped to 25. | |
| filter_cert_posts | No | Skip 'I just earned/completed/certified' posts. | |
| daily_outreach_cap | No | Connection requests per day, clamped to 25. | |
| comment_hiring_only | No | Only comment on posts tagged #hiring — opt-in, the inverse of filter_hiring_posts. | |
| data_retention_days | No | Days before scraped profiles and drafts are purged. | |
| filter_hiring_posts | No | Skip 'we're hiring / open role' posts. | |
| comment_author_countries | No | Only comment on posts by authors in these countries. Empty means no filter. | |
| filter_job_seeking_posts | No | Skip 'open to work / looking for my next role' posts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it says changes persist immediately, sends nothing, only passed fields are changed, and pipelines read these settings. It also warns not to invent values and explains the missing-setting recovery flow. It does not cover permissions, reversibility, or response shape in depth, so it is strong but not exhaustive.
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 then adds useful behavioral and workflow context. It is generally efficient for a 23-parameter tool, though the trailing response boilerplate and repeated settings framing add minor noise.
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 tool's complexity, 23 parameters, full schema coverage, no annotations, and no output schema, the description is largely complete. It explains partial updates, persistence, pipeline impact, and blocked-run recovery, but does not mention how to inspect current settings or what the successful response contains.
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 each field's meaning. The description adds useful parameter-level semantics by stating that every field is optional and only passed fields are changed, which clarifies partial-update behavior beyond the schema. It appropriately defers individual field meaning to the 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: changing the user's profile, targeting, and limits via update_settings. It is clear about what the tool changes, but it does not explicitly distinguish itself from sibling tools such as get_user_profile or the pipeline runners, so it falls short of a perfect sibling-aware score.
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 this to change profile, targeting, and limits, and specifically to unblock a pipeline when a run fails due to a missing setting. It does not state when not to use the tool or name alternative tools, so it is strong but not fully explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
withdraw_connection_requestAInspect
Withdraw Connection Request
Withdraw a connection request that HAS ALREADY BEEN SENT and is still pending, because the person hasn't accepted. Use only when the user explicitly asks to withdraw / retract / take back / unsend an invite that went out. For requests still waiting in the queue use cancel_scheduled. Find the request with list_sent_connection_requests first, and confirm the person with the user. Tell them: LinkedIn blocks re-inviting the same person for up to three weeks after a withdrawal. One person at a time. Limited per day. It cannot be undone.
Args: handle: draft_ handle from list_sent_connection_requests.
Responses:
200: Successful Response (Success Response) Content-Type: application/json
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does: it warns that LinkedIn blocks re-inviting the same person for up to three weeks, that the action cannot be undone, that it is limited per day, and that it handles one person at a time. These are exactly the side effects and rate constraints an agent needs before committing.
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 precondition, then alternatives, then warnings. It runs a bit long and the trailing responses block mostly restates boilerplate, but nearly every sentence carries usable 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?
For a one-parameter mutation tool with no annotations and no output schema, the description covers trigger, exclusion, prerequisite lookup, confirmation requirement, irreversible side effect, and rate/quota limits. An agent has everything needed to call it safely and 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 0% and the schema only declares a bare string, so the description has to compensate — and it does by identifying the value as a draft_ handle sourced from list_sent_connection_requests. It doesn't describe the handle's format beyond the draft_ prefix, but the provenance guidance is the operationally important part.
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 (withdraw) and resource (connection request) and scopes it to requests already sent and still pending. It explicitly contrasts with cancel_scheduled, which handles queued requests, so the agent can discriminate it from siblings 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?
Gives an explicit trigger condition (user asks to withdraw / retract / take back / unsend), an explicit exclusion (use cancel_scheduled for queued requests), and prerequisites (look up via list_sent_connection_requests, confirm the person with the user). 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.
Related MCP Connectors
LinkedIn outreach from Claude: invites under safe caps, follow-ups, replies and inbox triage.
- mcpOAuthcom.curviate
LinkedIn actions for AI agents: search, messaging, posts and invites, as hosted MCP tools.
LinkedIn outreach in Claude or ChatGPT: campaign stats, replies, leads, drafts. Never sends.
The safest LinkedIn MCP: your Agents read DMs, search your network and draft messages you send.
Related MCP Servers
- AlicenseBqualityBmaintenanceConnects AI assistants like Claude to LinkedIn through your own logged-in browser session, enabling profile and company lookups, messaging, inbox management, job searches, and related actions. All browser interactions run locally on your machine.47Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables Claude AI to interact with LinkedIn through browser automation, including profile reading, people and job search, company research, post publishing, and profile editing.MIT
- AlicenseAqualityBmaintenanceAI agent for LinkedIn outreach: finds the right people, writes in your voice, follows up, replies. Six campaign goals: sell a product or service, find a job, hire people, find partners or investors, find a vendor, research interviews. Campaigns stay drafts until you launch them.221,936 PyPI12MIT
- AlicenseAqualityDmaintenanceAn MCP server that lets AI assistants like Claude read LinkedIn data through your own logged-in browser session. Access profiles and companies, search for jobs, or get job details.19Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.