0.0 / 30
What changed in the harness
Selection accuracy 100→100, token cost up 19%, unconfirmed writes 0%→0%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
20.4 / 30
03Economics
19.4 / 20
04Discoverability
9.8 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
28 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
authenticate_linkedin |
no_return_description |
Authenticate with LinkedIn OAuth using a standard LinkedIn Developer Application. Returns the authentication status and the resulting access token information, or an error if authentication fails. |
revoke_linkedin_auth |
no_return_description |
Revoke the current LinkedIn OAuth authentication and clear all stored tokens. Returns a confirmation that authentication has been revoked and stored credentials removed. |
get_my_profile |
name_restates_behavior no_return_description |
Retrieve the authenticated user's own LinkedIn profile via OpenID Connect, using standard OAuth scopes. Returns the user's profile details such as name, headline, and other profile fields. |
get_company_info |
no_return_description |
Get basic public information about the company identified by the required companyId parameter, such as its name and logo. Returns basic company details. Note: access is limited and may require a Marketing Solutions partnership in the future. |
get_company_profile |
name_restates_behavior no_return_description |
Retrieve detailed profile information for the company identified by the required companyId parameter. Returns the company's detailed profile data. Note: access is limited and may require a Marketing Solutions partnership in the future. |
update_partnerships |
no_return_description |
Update LinkedIn API partnership access settings after you are approved for special access by toggling the communityManagement, talentSolutions, salesSolutions, and marketingSolutions boolean flags. Returns a confirmation of the updated partnership settings. |
create_post |
name_restates_behavior no_return_description |
Publish a text post to LinkedIn using the required content text, with optional visibility of PUBLIC or CONNECTIONS (default PUBLIC). Returns the created post's details including its ID. |
get_my_posts |
no_return_description |
Retrieve your published LinkedIn posts along with their engagement metrics, limited to the number specified by count (default 20). Returns a list of posts and their metrics. |
get_feed |
no_return_description |
Retrieve posts from your LinkedIn feed, limited to the number specified by count (default 20). Returns the feed posts from your network. |
like_post |
name_restates_behavior no_return_description |
Like the LinkedIn post identified by the required postId parameter to signal appreciation. Returns a confirmation that the like was recorded. |
comment_on_post |
no_return_description |
Add a comment with the given text to the LinkedIn post identified by the required postId parameter. Returns the created comment's details including its ID. |
share_post |
name_restates_behavior no_return_description |
Repost the LinkedIn post identified by the required postId parameter, optionally adding your own commentary visible to your network. Returns a confirmation and details of the shared post. |
search_jobs |
name_restates_behavior params_unexplained no_return_description |
Search LinkedIn job postings using optional filters: keywords (search terms or phrases), location (geographic area), company (employer name), experienceLevel (seniority level), jobType (full-time, part-time, etc.), datePosted (posting recency), salary (compensation range), industryId (LinkedIn industry identifier), and functionId (LinkedIn job function identifier). Returns a list of matching job postings with their details. |
get_job |
no_return_description |
Retrieve comprehensive details about the LinkedIn job posting identified by the required jobId parameter, including its description, company, and application information. Returns the full job details. |
save_job |
no_return_description |
Bookmark the LinkedIn job identified by the required jobId parameter for later review or application. Returns a confirmation that the job was saved. |
get_saved_jobs |
no_return_description |
Retrieve all of your saved and bookmarked LinkedIn job listings. Returns a list of the saved jobs. |
get_job_applications |
no_return_description |
Retrieve the status and details of all your LinkedIn job applications. Returns a list of applications with their current status. |
search_people |
params_unexplained no_return_description |
Search LinkedIn professionals using optional filters: keywords (general search terms), firstName (the person's first name), lastName (the person's last name), companyName (current employer), title (job title), location (geographic area), industry (professional industry), and school (university or school attended). Returns a list of matching professional profiles. |
get_profile |
no_return_description |
Access detailed LinkedIn profile information for any user identified by the required profileId parameter. Returns the profile's details such as name, headline, experience, and education. |
get_connections |
no_return_description |
Retrieve your complete LinkedIn connections list. Returns a list of your connection profiles. |
send_connection_request |
name_restates_behavior no_return_description |
Send a connection request to the user identified by the required profileId parameter, optionally including a personalized message to improve acceptance. Returns a confirmation that the request was sent. |
get_connection_requests |
no_return_description |
View all pending incoming connection requests, providing their request IDs so you can accept them. Returns a list of pending connection requests. |
accept_connection_request |
name_restates_behavior no_return_description |
Accept the pending connection request identified by the required requestId parameter, adding that user to your network. Returns a confirmation that the request was accepted. |
get_conversations |
no_return_description |
Access your LinkedIn conversation threads and chat history, providing conversation identifiers for retrieving messages. Returns a list of conversations. |
get_messages |
params_unexplained no_return_description |
Retrieve the messages from the conversation thread identified by the required conversationId parameter (the conversation identifier, obtainable from get_conversations). Returns a list of messages with their senders and content. |
send_message |
name_restates_behavior no_return_description |
Send a direct message to the connection identified by the required recipientId parameter, with the required subject and body. Returns a confirmation that the message was sent. |
get_profile_analytics |
no_return_description |
Access comprehensive performance and engagement metrics for your own LinkedIn profile. Returns the profile's analytics data. |
get_post_analytics |
name_restates_behavior no_return_description |
Retrieve detailed analytics and engagement data for the LinkedIn post identified by the required postId parameter. Returns the post's analytics and engagement metrics. |
Selection evidence
Confusable tool pairs.
10 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
get_company_info |
get_company_profile |
high | Both tools take a companyId and describe the same company information, differing only in 'basic' vs 'detailed', so a task like 'get company info' or 'look up information on company X' can genuinely match either. |
get_my_profile |
get_profile |
medium | Near-identical profile names; a task like 'get the profile information' without specifying 'my' vs another user is ambiguous, risking get_my_profile (no params) when a specific profileId was intended. |
get_profile_analytics |
get_post_analytics |
medium | Both offer analytics with engagement metrics, so a task like 'get my analytics' or 'get engagement metrics' is ambiguous between profile performance and post-level data. |
get_saved_jobs |
get_job_applications |
medium | Both return the user's own jobs, so 'show me my jobs' or 'get details of the jobs I have' is genuinely ambiguous between saved/bookmarked listings and application statuses. |
get_connection_requests |
accept_connection_request |
medium | Both concern 'incoming connection requests' (one to view/manage, one to accept), so a task like 'handle my pending connection requests' or 'deal with an incoming connection request' could plausibly select the wrong one. |
get_connections |
get_connection_requests |
low | Names share 'connection(s)', so shorthand like 'get my connection requests' risks matching the full connections-list tool, though the descriptions do separate 'list' from 'incoming requests'. |
get_my_profile |
get_profile_analytics |
low | Both involve 'my profile'; a task like 'get my profile stats/data' is ambiguous between profile information and performance/engagement metrics. |
send_connection_request |
send_message |
low | send_connection_request accepts an optional message and both send to connections, so 'send a message to a connection' is ambiguous between a DM and a connection request despite different descriptions. |
get_company_profile |
get_profile |
low | get_profile claims 'detailed profile information for any user', so a task like 'get the detailed profile for Acme' risks selecting the generic profile tool over the company-specific tool, though 'company' usually disambiguates. |
get_job |
get_job_applications |
low | A task like 'get my job details/info' is ambiguous between a single job posting and the user's application tracking, though the term 'application' usually disambiguates. |
Compare the field