Skip to main content
Glama

Add or update a contact

postfjord_add_contact
Idempotent

Adds a person to the contacts, or updates the contact with that address. Only for someone who asked to hear from the workspace, never an address found elsewhere. askToConfirm true sends them an email to confirm they want the emails (double opt-in): only confirmed people get emails or automations. That email goes out at once, so confirm with the person you are helping before you set askToConfirm true. While the workspace is paused no email goes out, and the answer says so. An address that unsubscribed or bounced is not added. Tag them afterwards with postfjord_tag_contact. Needs email switched on and the Publish scope. On a retry after a timeout or error, send the same idempotency_key: the first answer comes back and nothing is made or sent twice.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "email": "<email>"
    },
    "name": "postfjord_add_contact"
  }
}

Input Schema

NameRequiredDescriptionDefault
emailYesThe person's email address, as they gave it to the workspace.
lastNameNoLast name.
firstNameNoFirst name, used to greet them in emails.
askToConfirmNoSend the confirmation email now. Default false.
idempotency_keyNoYour own id for this one action, for example post-20261006-launch. Make a new one for each new thing; send the same one again only when you retry. Left out, the exact same call within 10 minutes counts as a retry.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / email / description
      Added value: +"The person's email address, as they gave it to the workspace."
    • addedInput schema / properties / email / pattern
      Added value: +"^[^\\s@]+@[^\\s@]+$"
    • addedInput schema / properties / firstName / description
      Added value: +"First name, used to greet them in emails."
    • addedInput schema / properties / lastName / description
      Added value: +"Last name."
  2. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the annotations (which only declare mutation, openness and idempotency), it discloses the double opt-in consequence (only confirmed people get emails or automations), that the confirmation email goes out immediately, that nothing is sent while the workspace is paused and the response reports it, and that unsubscribed or bounced addresses are rejected. It also explains the idempotency retry contract. No contradiction with readOnlyHint=false or idempotentHint=true. It does not say what the returned record looks like, but there is no output schema to lean on either.

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

Conciseness4/5

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

The core action and the consent constraint are front-loaded, and each following sentence adds a distinct operational fact (opt-in behavior, pause behavior, rejection rules, permission, retry). It is dense and a little long, but no sentence is redundant filler.

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?

For a mutating contact-write with no output schema, it covers side effects, suppression rules, prerequisites, failure/retry behavior and even the shape of the answer ('the answer says so'). An agent has enough to call it safely without further lookup.

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, and the description genuinely earns more: it explains that askToConfirm sends a real-time email and therefore needs human confirmation first, and it clarifies the idempotency_key retry discipline ('send the same idempotency_key: the first answer comes back'). It adds no guidance on email/firstName/lastName formatting, which the schema already covers.

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 states a specific verb and resource ('Adds a person to the contacts, or updates the contact with that address') and immediately draws the counterpart boundary against list_contacts and tag_contact. The 'Only for someone who asked to hear from the workspace' clause distinguishes it from any address-import behavior an agent might otherwise assume.

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?

It states when to use it (a person who asked to hear from the workspace), when not to (never an address found elsewhere), the prerequisite (email switched on plus the Publish scope), and the follow-up alternative ('Tag them afterwards with postfjord_tag_contact'). It also tells the agent to confirm with the human before setting askToConfirm true, which is an explicit gate rather than a vague hint.

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.

Resources