Skip to main content
Glama

Outreach Desk

Score Inbound Pitch

score_message

Use this, not intake_message (form and files only), for any recruiter pitch pasted in chat. When the user states their criteria (role, skills, salary floor, remote policy), always send them as criteria in this same call, even before set_criteria; they win over saved criteria and are not saved, so call set_criteria too if the user wants them kept. With no criteria it uses the saved desk. Returns an evaluation_id, a 0 to 100 composite and four sub-scores (relevance, specificity, cadence, spam where 100 is clean), flags, key reasons and an action: interested, request_info or decline. Saves a cleaned summary to the sender scoreboard; raw text is never stored. Send the whole pitch as message, and sender_domain as a bare host such as stripe.com or not at all. A client that sends no user id has no desk: send criteria; nothing is stored and evaluation_id is empty. Errors: no_desk means call set_criteria, then score again; no_user_id means send criteria. Never present intake_message's sample-profile score as the user's. draft_response takes the evaluation_id.

Input Schema

NameRequiredDescriptionDefault
senderNoOptional sender email address, profile URL or domain, such as "jane@stripe.com". Used only when sender_domain is not given.
messageYesThe full pitch text the user pasted, such as "Hi, we are hiring a Staff Engineer at Stripe, $220k base, remote."
criteriaNoThe criteria to score against, in the shape set_criteria takes. Send it whenever the user states their criteria; it wins over the desk's saved criteria. All four fields are required, so ask the user for one they did not state rather than guess it. Required when the client sends no user id (no ChatGPT sign-in and no OAuth connection): the pitch is then scored and nothing is stored.
cadence_daysNoOptional days since the previous message from this sender, 0 to 365, such as 2. Used only for the cadence sub-score. Defaults to 7.
is_follow_upNoOptional: true when this message follows up earlier outreach. Used only for the cadence sub-score. Defaults to false.
sender_domainNoOptional sender domain as a bare host name, such as "stripe.com" (no @, no https://). It wins over sender. With neither, the domain is read from the message, else unspecified-sender.com.
previous_declinedNoOptional: true when the user already declined this sender. Used only for the cadence sub-score. Defaults to false.

Output Schema

NameRequiredDescriptionDefault
as_ofYesDay of the call, as YYYY-MM-DD in UTC.
flagsYesWarning flags. Values: missing_salary, dealbreaker_clash, token_failure (unfilled template token such as [Current Company]), aggressive_drip, repeat_after_decline, slop, artificial_urgency, free_webmail. Empty when the pitch is clean.
sourceYesWhere the data comes from: the user's own private desk.
summaryYesShort cleaned summary of the pitch with contact details removed; this is what is stored.
breakdownYesThe four sub-scores, each an integer from 0 to 100 where higher is better.
key_reasonsYesPlain reasons behind the scores.
evaluation_idYesId of this evaluation; pass it to draft_response. Kept for 30 days. Empty when nothing was stored because the client sends no user id.
sender_domainYesSender domain the pitch is counted under on the scoreboard.
composite_scoreYesOverall score from 0 to 100; 85 or more is a strong pitch.
recommended_actionYesSuggested reply: interested, request_info or decline.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • changedInput schema / properties / criteria / description
      Previous value: -"Optional criteria to score against instead of the desk's saved criteria, in the shape set_criteria takes. Needed when the client sends no user id (no ChatGPT sign-in and no OAuth connection): the pitch is then scored and nothing is stored."New value: +"The criteria to score against, in the shape set_criteria takes. Send it whenever the user states their criteria; it wins over the desk's saved criteria. All four fields are required, so ask the user for one they did not state rather than guess it. Required when the client sends no user id (no ChatGPT sign-in and no OAuth connection): the pitch is then scored and nothing is stored."
    • addedInput schema / properties / criteria / properties / dealbreakers / items / maxLength
      Added value: +200
    • addedInput schema / properties / criteria / properties / remote_policy / maxLength
      Added value: +200
    • addedInput schema / properties / criteria / properties / skills / items / maxLength
      Added value: +80
    • addedInput schema / properties / criteria / properties / target_role / maxLength
      Added value: +200
    • addedInput schema / properties / message / maxLength
      Added value: +20000
    • addedInput schema / properties / sender / maxLength
      Added value: +320
    • addedInput schema / properties / sender_domain / maxLength
      Added value: +253
  2. Changed2 schema fields changed
    • changedInput schema / properties / criteria / description
      Previous value: -"Optional criteria to score against instead of the desk's saved criteria, in the shape set_criteria takes. Needed when the client sends no signed-in ChatGPT user: the pitch is then scored and nothing is stored."New value: +"Optional criteria to score against instead of the desk's saved criteria, in the shape set_criteria takes. Needed when the client sends no user id (no ChatGPT sign-in and no OAuth connection): the pitch is then scored and nothing is stored."
    • changedOutput schema / properties / evaluation_id / description
      Previous value: -"Id of this evaluation; pass it to draft_response. Kept for 30 days. Empty when nothing was stored because the client sends no signed-in ChatGPT user."New value: +"Id of this evaluation; pass it to draft_response. Kept for 30 days. Empty when nothing was stored because the client sends no user id."
  3. Changed1 schema field changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "message": "Dear Candidate, you would be an awesome rockstar ninja for our client onsite in Dallas.",
      +    "sender_domain": "faststaffing.biz"
      +  }
      +]
  4. Changed2 schema fields changed
    • addedInput schema / properties / criteria
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional criteria to score against instead of the desk's saved criteria, in the shape set_criteria takes. Needed when the client sends no signed-in ChatGPT user: the pitch is then scored and nothing is stored.",
      +  "properties": {
      +    "dealbreakers": {
      +      "description": "Optional, up to 20: constraints that rule out a pitch, such as [\"Onsite required\", \"Legacy Java\"]. Omit it or send [] for none.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    "remote_policy": {
      +      "description": "Wanted work arrangement, such as \"100% remote\", \"hybrid 1 day\" or \"any\".",
      +      "type": "string"
      +    },
      +    "salary_floor": {
      +      "description": "Minimum yearly base salary in whole US dollars, 0 to 10000000, such as 210000. Use 0 for no floor.",
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "skills": {
      +      "description": "Core skills, 1 to 30, such as [\"TypeScript\", \"Go\"].",
      +      "items": {
      +        "type": "string"
      +      },
      +      "maxItems": 30,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "target_role": {
      +      "description": "Target job title, such as \"Staff Distributed Systems Engineer\".",
      +      "minLength": 1,
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "target_role",
      +    "skills",
      +    "salary_floor",
      +    "remote_policy"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / evaluation_id / description
      Previous value: -"Id of this evaluation; pass it to draft_response. Kept for 30 days."New value: +"Id of this evaluation; pass it to draft_response. Kept for 30 days. Empty when nothing was stored because the client sends no signed-in ChatGPT user."
  5. Changed33 schema fields changed
    • changedInput schema / properties / cadence_days / description
      Previous value: -"Days elapsed since the previous message from this sender (defaults to 7)."New value: +"Optional days since the previous message from this sender, 0 to 365, such as 2. Used only for the cadence sub-score. Defaults to 7."
    • addedInput schema / properties / cadence_days / maximum
      Added value: +365
    • changedInput schema / properties / is_follow_up / description
      Previous value: -"Whether this message is a follow-up to earlier outreach."New value: +"Optional: true when this message follows up earlier outreach. Used only for the cadence sub-score. Defaults to false."
    • changedInput schema / properties / message / description
      Previous value: -"The inbound outreach or recruiter pitch text to evaluate."New value: +"The full pitch text the user pasted, such as \"Hi, we are hiring a Staff Engineer at Stripe, $220k base, remote.\""
    • addedInput schema / properties / message / minLength
      Added value: +1
    • changedInput schema / properties / previous_declined / description
      Previous value: -"Whether the candidate previously declined outreach from this sender."New value: +"Optional: true when the user already declined this sender. Used only for the cadence sub-score. Defaults to false."
    • changedInput schema / properties / sender / description
      Previous value: -"Optional recruiter sender info (email address, URL or domain) to associate with scoreboard."New value: +"Optional sender email address, profile URL or domain, such as \"jane@stripe.com\". Used only when sender_domain is not given."
    • changedInput schema / properties / sender_domain / description
      Previous value: -"Optional explicit sender domain (e.g. 'stripe.com')."New value: +"Optional sender domain as a bare host name, such as \"stripe.com\" (no @, no https://). It wins over sender. With neither, the domain is read from the message, else unspecified-sender.com."
    • addedInput schema / properties / sender_domain / pattern
      Added value: +"^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?(\\.[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?)+$"
    • addedOutput schema / properties / as_of / description
      Added value: +"Day of the call, as YYYY-MM-DD in UTC."
    • addedOutput schema / properties / breakdown / description
      Added value: +"The four sub-scores, each an integer from 0 to 100 where higher is better."
    • addedOutput schema / properties / breakdown / properties / cadence / description
      Added value: +"How well spaced the outreach is; low for rapid follow-ups or contact after a decline."
    • addedOutput schema / properties / breakdown / properties / cadence / maximum
      Added value: +100
    • addedOutput schema / properties / breakdown / properties / cadence / minimum
      Added value: +0
    • addedOutput schema / properties / breakdown / properties / relevance / description
      Added value: +"Fit with the target role, skills, salary floor and remote policy."
    • addedOutput schema / properties / breakdown / properties / relevance / maximum
      Added value: +100
    • addedOutput schema / properties / breakdown / properties / relevance / minimum
      Added value: +0
    • addedOutput schema / properties / breakdown / properties / spam / description
      Added value: +"Spam safety: 100 is clean, low means template tokens, buzzwords or urgency."
    • addedOutput schema / properties / breakdown / properties / spam / maximum
      Added value: +100
    • addedOutput schema / properties / breakdown / properties / spam / minimum
      Added value: +0
    • addedOutput schema / properties / breakdown / properties / specificity / description
      Added value: +"How concrete the pitch is: named company, role details and stated salary."
    • addedOutput schema / properties / breakdown / properties / specificity / maximum
      Added value: +100
    • addedOutput schema / properties / breakdown / properties / specificity / minimum
      Added value: +0
    • addedOutput schema / properties / composite_score / description
      Added value: +"Overall score from 0 to 100; 85 or more is a strong pitch."
    • addedOutput schema / properties / composite_score / maximum
      Added value: +100
    • addedOutput schema / properties / composite_score / minimum
      Added value: +0
    • addedOutput schema / properties / evaluation_id / description
      Added value: +"Id of this evaluation; pass it to draft_response. Kept for 30 days."
    • addedOutput schema / properties / flags / description
      Added value: +"Warning flags. Values: missing_salary, dealbreaker_clash, token_failure (unfilled template token such as [Current Company]), aggressive_drip, repeat_after_decline, slop, artificial_urgency, free_webmail. Empty when the pitch is clean."
    • addedOutput schema / properties / key_reasons / description
      Added value: +"Plain reasons behind the scores."
    • addedOutput schema / properties / recommended_action / description
      Added value: +"Suggested reply: interested, request_info or decline."
    • addedOutput schema / properties / sender_domain / description
      Added value: +"Sender domain the pitch is counted under on the scoreboard."
    • addedOutput schema / properties / source / description
      Added value: +"Where the data comes from: the user's own private desk."
    • addedOutput schema / properties / summary / description
      Added value: +"Short cleaned summary of the pitch with contact details removed; this is what is stored."
  6. Changed2 schema fields changed
    • removedInput schema / properties / desk_key
      Removed value: -{
      -  "description": "The secret desk_key returned when the desk was created. It is the only credential for this desk and cannot be recovered.",
      -  "pattern": "^od_[0-9a-f]{32}$",
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "desk_key",
      -  "message"
      -]New value: +[
      +  "message"
      +]
  7. Changed1 schema field changed
    • removedOutput schema / properties / note_from_openkrill
      Removed value: -{
      -  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      -  "type": "string"
      -}
  8. Changed1 schema field changed
    • addedOutput schema / properties / note_from_openkrill
      Added value: +{
      +  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      +  "type": "string"
      +}
  9. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the generic safety profile, but the description discloses real behavior: criteria override saved desk criteria and are not persisted, a cleaned summary is written to the sender scoreboard while raw text is never stored, and criteria becomes mandatory for clients with no user id. This is well beyond what annotations provide.

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

Conciseness4/5

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

Front-loaded with the routing decision and packed with useful detail, but the criteria persistence rule is stated twice ('they win over saved criteria and are not saved' then 'nothing is stored') and the error sentences re-state no_user_id. Slight redundancy in an otherwise dense block.

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

Completeness5/5

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

An output schema exists, yet the description still summarizes the return shape (evaluation_id, composite, four sub-scores, flags, reasons, action), and it covers auth-less clients, defaults, and error codes. Nothing needed to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds routing semantics the schema cannot: send the whole pitch as message, sender_domain as a bare host or not at all, and that criteria 'wins over' saved criteria. It adds genuine value above the structured fields.

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

Purpose5/5

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

The opening sentence names the specific action (score a pasted recruiter pitch) and immediately distinguishes it from the sibling intake_message ('form and files only'). An agent can route between the two 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.

Usage Guidelines5/5

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

Explicit when-to-use (any pitch pasted in chat), when-not (intake_message's form/file path), and the follow-on alternatives: set_criteria to persist criteria, draft_response taking the evaluation_id. Error recovery paths (no_desk, no_user_id) are spelled out too.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.