Skip to main content
Glama

Server Details

Publish and schedule Pinterest pins from any MCP client. Token refresh and retries handled.

Ownership verified
Status
Healthy
Uptime
78.6% over 22 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.5/5.0

Scored across 34 tools

Disambiguation5/5

Each tool targets a distinct resource and action; descriptions explicitly cross-reference and clarify boundaries (e.g., create_pin vs create_schedule vs create_pins_batch, get_pin vs get_pin_analytics vs get_account_analytics). No meaningful overlap exists.

Naming Consistency5/5

Consistent snake_case verb_noun pattern across all tools (create_pin, list_schedules, update_webhook). Only server_info deviates slightly by omitting a verb, but it is a clear special case.

Tool Count3/5

34 tools is heavy for an MCP server; while each resource (boards, pins, schedules, webhooks, assets) has a logical CRUD set, the total exceeds typical scoping and could burden an agent with selection overhead.

Completeness4/5

CRUD and lifecycle operations are covered for boards, pins, schedules, webhooks, and assets; accounts, analytics, billing, rate limits, and audit logs are present. Minor gaps like no list_assets or get_asset but not blocking.

Available Tools

34 tools
cancel_scheduleCancel scheduled pin
DestructiveIdempotent
Inspect

Cancel a pending scheduled pin so it never publishes.

    Use when the pin should not go out at all. To remove a finished
    schedule from the list use delete_schedule; to re-arm a failed one use
    retry_schedule.

    Returns the schedule with status "canceled". Fails with not_found for
    an unknown id and bad_request when the schedule already ran (done,
    failed) or was canceled.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
schedule_idYesUUID of the schedule, from list_schedules or create_schedule.
check_board_accessCheck board accessA
Read-onlyIdempotent
Inspect

Check whether an account can publish to a board right now, and why not.

    Use before publishing to a board not used recently, or after a publish
    failed with any board_* code, instead of retrying blind. For a
    full preflight of a specific pin use create_pin with dry_run=true.

    Returns publishable (bool), status (ok | failed | skipped when Pinterest
    was unreachable), code (board_not_found, board_not_owned, board_deleted,
    board_access_denied, scope_missing, token_expired), message, remediation,
    board, account_health, source (cache | pinterest). Never raises for a
    bad board; an unknown account fails with not_found.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
freshNotrue bypasses the cached verdict and asks Pinterest again.
board_idYesPinterest board ID (numeric string), from list_boards.
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark it readOnly, idempotent, and non-destructive; the description adds substantial behavioral detail: it returns a structured verdict, may be served from cache, skips when Pinterest is unreachable, never raises for a bad board, and fails with not_found only for unknown accounts. This goes well beyond annotation-only disclosure.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, followed by clear usage guidance and a compact but valuable enumeration of return fields. Every sentence adds information, and the structure makes it easy for an agent to quickly identify what the tool does and when to use it.

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 read-only check tool with no output schema, the description covers purpose, when to use it, the alternative, return values, failure modes, cache behavior, and edge-case behavior. No critical information is missing for correct selection and invocation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents account_id, board_id, and fresh. The description adds context about the cache source and unknown-account failure, but does not significantly expand the meaning of the parameters themselves. Baseline 3 is appropriate.

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 description states a specific verb and resource: 'Check whether an account can publish to a board right now, and why not.' This clearly distinguishes it from sibling tools by framing it as a pre-publish access check rather than a publishing or board-management action.

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?

The description gives explicit usage conditions: use before publishing to a board not used recently, or after a publish fails with a board_* code. It also names the alternative (create_pin with dry_run=true) for a full pin-level preflight, making the decision boundary clear.

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

create_boardCreate boardAInspect

Create a new board on a connected Pinterest account.

    Use when no existing board from list_boards fits; check list_boards
    first, since Pinterest rejects duplicate names. Not needed for a
    one-off pin: publish to an existing board.

    Returns the board with id (use as board_id), name, description,
    privacy. Fails with forbidden (sandbox_board_limit) when a sandbox
    project hits its board cap, and token_expired / scope_missing when the
    Pinterest connection needs a reconnect (scope_missing with
    missing_scopes ["boards:write_secret"] for SECRET on an account connected
    before secret boards were supported).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesBoard name, unique within the account, <= 180 characters.
privacyNo"PUBLIC" (default) or "SECRET". SECRET needs the account to be connected with Pinterest's boards:write_secret permission; older connections fail with scope_missing until reconnected.
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.
descriptionNoBoard description.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond annotations by disclosing the return shape (board with id, name, description, privacy), and enumerating specific failure modes: forbidden (sandbox_board_limit), token_expired, and scope_missing with missing_scopes ["boards:write_secret"]. This gives the agent actionable context for handling errors, which the annotations (readOnlyHint=false, idempotentHint=false) do not provide.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then organized into usage guidance and failure modes. Every sentence is informative: the duplicate-name warning, the one-off pin alternative, the return format, and the sandbox/auth errors all earn their place. No filler or repetition.

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?

Given there is no output schema, the description's return-format disclosure is essential and fully covers what an agent needs. It also addresses the two main external failure categories (sandbox caps and auth/scope issues), making the tool self-sufficient for correct invocation and error handling. Sibling context is handled via the explicit list_boards reference.

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

Parameters3/5

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

Schema description coverage is 100%, so each parameter already has a clear meaning in the schema. The description adds no new parameter-level semantics; its mention of SECRET permissions and missing_scopes echoes the privacy parameter schema rather than extending it. Per the calibration rule, a baseline of 3 is appropriate.

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 description opens with a specific verb-resource pair: 'Create a new board on a connected Pinterest account.' It clearly distinguishes this from siblings like update_board and delete_board by specifying 'new board', and the follow-up line about returning the board with id further anchors what the tool does.

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?

The description explicitly states when to use the tool: 'Use when no existing board from list_boards fits; check list_boards first, since Pinterest rejects duplicate names.' It also gives a when-not-to-use: 'Not needed for a one-off pin: publish to an existing board.' This names the alternative tool (list_boards) and the condition that selects it.

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

create_pinPublish pinAInspect

Publish a pin to Pinterest now, or preflight it with dry_run=true.

    Use for a pin that should go out immediately; for a future time use
    create_schedule, for many pins use create_pins_batch. Provide either
    image_url or asset_id (from upload_asset), not both. Run dry_run first
    and reuse resolved.idempotency_key on the real call.

    Returns the pin with id and status "queued" (poll get_pin), or with
    dry_run the validation result (valid, checks, resolved, headroom).
    Fails fast with board_not_found / board_not_owned / board_access_denied
    for an unpublishable board, quota_exceeded when the monthly quota is
    spent, and validation_error for bad fields.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesPin title, at most 100 characters.
dry_runNotrue runs every API check (account, board, media, quota, rate headroom) and returns the resolved payload without publishing anything.
alt_textNoAccessibility text for the image, <= 500 characters.
asset_idNoUUID of an uploaded PinBridge asset, from upload_asset.
board_idYesPinterest board ID (numeric string), from list_boards.
link_urlNoDestination URL opened when the pin is clicked.
image_urlNoPublic URL of the image or video; Pinterest must be able to fetch it.
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.
descriptionNoPin description, at most 800 characters.
related_termsNoKeywords that improve discoverability.
dominant_colorNoHex color of the image, e.g. "#FF5733".
cover_image_urlNoPublic cover image URL; video pins only.
idempotency_keyNoUnique key so a retry never duplicates the pin. Generated when omitted, in which case a repeat call publishes again; reuse the key on retries.
cover_image_asset_idNoUploaded image asset UUID used as the video cover.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the description carries the burden of explaining side effects. It details return behavior ('Returns the pin with id and status "queued"'), error handling ('Fails fast with board_not_found / board_not_owned / board_access_denied...'), and idempotency semantics. It adds substantial behavioral context beyond the annotations, with no contradictions.

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

Conciseness5/5

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

The description is well-organized in three short paragraphs: purpose and alternatives, usage guidance, and return/error behavior. It front-loads the core purpose and avoids redundancy, with every sentence contributing actionable information.

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?

Despite 14 parameters and no output schema, the description covers the critical operational details: immediate vs. preflight, the mutual exclusion of media sources, idempotency handling, expected response shape, and error conditions. The schema covers parameter definitions, and the description fills the behavioral gaps, making it complete for an agent to call correctly.

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% with each parameter documented, so baseline is 3. The description adds meaningful guidance: 'Provide either image_url or asset_id (from upload_asset), not both' and explains the idempotency_key reuse workflow, which is not fully captured in the schema. This raises the score to 4.

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 description clearly states 'Publish a pin to Pinterest now, or preflight it with dry_run=true', specifying the verb, resource, and immediate vs. preflight modes. It explicitly distinguishes from sibling tools by noting 'for a future time use create_schedule, for many pins use create_pins_batch', so an agent can immediately differentiate it from related operations.

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?

The description provides explicit when-to-use guidance: 'Use for a pin that should go out immediately; for a future time use create_schedule, for many pins use create_pins_batch.' It also instructs to run dry_run first and reuse the resolved.idempotency_key on the real call, giving clear operational steps and alternatives.

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

create_pins_batchPublish pins in bulkAInspect

Publish several pins in one call with a per-entry outcome.

    Use for bulk publishing (up to 100 pins) when the workspace has the
    bulk_imports feature; otherwise call create_pin per pin. Check
    get_billing_status for quota first: the batch needs quota for every
    entry. Supply an idempotency_key per entry if you may resend.

    Returns created_count, existing_count, failed_count, results (one
    {index, idempotency_key, status, pin, error} per entry) and headroom.
    Fails as a whole with payment_required without bulk_imports and
    quota_exceeded when quota is short; per-entry board or validation
    failures land in results instead.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pinsYesUp to 100 pins, each with the same fields as create_pin.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations are minimal (only readOnlyHint, openWorldHint, idempotentHint, destructiveHint), so the description carries the full burden. It discloses failure modes (payment_required, quota_exceeded), per-entry error containment in results, and the idempotency behavior nuance (generated when omitted makes batch NOT safe to resend). This goes well beyond annotations and gives the agent accurate expectations.

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

Conciseness5/5

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

The description is compact yet richly informative: front-loaded purpose, then usage conditions, then output and failure summary. Every sentence earns its place, with no fluff or redundancy. Formatting with line breaks improves scanability.

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?

The description covers return fields (created_count, existing_count, failed_count, results, headroom), failure modes, prerequisite quota check, and idempotency guidance. No output schema exists, so this self-contained description is complete for an agent to call correctly. It addresses all critical aspects for a batch write operation.

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

Parameters3/5

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

Schema description coverage is 100% and the schema itself explains each field thoroughly, including the idempotency_key caveat. The description adds only a usage-style hint about supplying a key when resending, which is already implied by the schema. No new parameter semantics are added beyond what the schema provides, so a baseline 3 is appropriate.

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 description clearly states the verb and resource: 'Publish several pins in one call' with per-entry outcomes. It explicitly distinguishes from create_pin by instructing 'otherwise call create_pin per pin', making it unmistakable which tool to select for bulk operations.

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?

Provides explicit when-to-use conditions: 'Use for bulk publishing (up to 100 pins) when the workspace has the bulk_imports feature; otherwise call create_pin per pin.' It also adds a prerequisite: 'Check get_billing_status for quota first' and advises on idempotency_key usage. This leaves no ambiguity about alternatives or prerequisites.

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

create_scheduleSchedule pinAInspect

Schedule a pin to publish at a future time.

    Use when the pin should go out later or when spreading many pins out
    after rate_limited; for an immediate publish use create_pin. Provide
    either image_url or asset_id, not both. The board is preflighted now,
    not at run time. A repeat call creates a second schedule, so check
    list_schedules before resending after a timeout.

    Returns the schedule with id and status "scheduled" (track it with
    get_schedule), or with dry_run the validation result. Fails with
    validation_error for a past or timezone-less run_at, board_* codes
    for an unpublishable board, and quota_exceeded when quota is spent.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesPin title, at most 100 characters.
run_atYesPublish time as ISO 8601 with timezone, in the future, e.g. "2026-04-01T10:00:00Z".
dry_runNotrue runs every API check (account, board, media, quota, rate headroom) and returns the resolved payload without publishing anything.
asset_idNoUUID of an uploaded PinBridge asset, from upload_asset.
board_idYesPinterest board ID (numeric string), from list_boards.
link_urlNoDestination URL opened when the pin is clicked.
image_urlNoPublic URL of the image or video; Pinterest must be able to fetch it.
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.
descriptionNoPin description, at most 800 characters.
cover_image_urlNoPublic cover image URL; video pins only.
cover_image_asset_idNoUploaded image asset UUID used as the video cover.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond annotations by disclosing non-idempotency ('A repeat call creates a second schedule'), preflight timing ('The board is preflighted now, not at run time'), dry_run behavior, and a categorized list of error codes (validation_error, board_*, quota_exceeded). This gives the agent a clear mental model of side effects and failure modes.

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

Conciseness5/5

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

Each sentence carries distinct information—purpose, usage, parameter constraint, behavior, idempotency, return value, and error modes. There is no fluff or repetition; the description is dense but well-organized and front-loaded with the core purpose.

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 complex 11-parameter tool with no output schema, the description covers the return format (schedule with id and status, or dry_run validation result), all relevant error categories, the preflight nuance, and the image/asset exclusivity. The agent can confidently invoke this tool without additional context.

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. The description adds a critical constraint not present in the schema: 'Provide either image_url or asset_id, not both.' It also reinforces that run_at must be in the future and timezone-aware, which is already in the schema but repeated concisely. The added exclusivity rule earns a 4.

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 description states a specific verb and resource ('Schedule a pin to publish at a future time') and explicitly differentiates from the sibling create_pin ('for an immediate publish use create_pin'). The agent knows exactly what this tool does and when it applies.

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?

Provides explicit when-to-use guidance ('Use when the pin should go out later or when spreading many pins out after rate_limited') and names the alternative (create_pin). It also advises checking list_schedules before retrying after a timeout, addressing a common failure pattern.

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

create_webhookCreate webhookAInspect

Register an endpoint PinBridge calls when a pin publishes or fails.

    Use instead of polling get_pin when the caller can receive HTTP
    callbacks. Check list_webhooks first to avoid registering the same URL
    twice; use update_webhook to change events or pause an existing one.
    Default events are pin.published and pin.failed.

    Returns id, url, events, is_enabled, created_at. Fails with
    validation_error when the URL is not a valid http(s) URL or the secret
    is shorter than 16 characters.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic endpoint that receives POSTed events.
eventsNoEvent names to deliver; any of "pin.published", "pin.failed".
secretYesShared secret of at least 16 characters used to sign deliveries (HMAC-SHA256 in X-PinBridge-Signature).
is_enabledNofalse registers the endpoint without sending deliveries yet.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (mutation, non-idempotent, non-destructive), the description discloses the default events, the returned fields, validation_error failure for bad URLs or short secrets, and implies duplicate registration is not deduplicated by advising a list_webhooks check. No contradiction with annotations.

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

Conciseness5/5

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

Three compact sentences front-load the core purpose and immediately give routing guidance, defaults, return values, and failure modes. Every sentence earns its place with no filler or repeated schema content.

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?

Despite having no output schema, the description enumerates the returned fields (id, url, events, is_enabled, created_at) and the main validation failures. Combined with full schema coverage and sibling routing, an agent has everything needed to invoke and interpret the result.

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?

The input schema already documents all four parameters (100% coverage), so the baseline is 3. The description adds value by spelling out that URL must be valid http(s), that defaults are pin.published and pin.failed, and the secret length rule tied to validation_error, though it partially duplicates schema constraints.

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 description opens with a concrete verb and resource ('Register an endpoint PinBridge calls when a pin publishes or fails'), and the sibling comparisons ('Check list_webhooks', 'use update_webhook') make it distinct from other webhook tools. No ambiguity about what this tool does.

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 explicitly says to use this instead of polling get_pin when callbacks are possible, tells the caller to check list_webhooks first to avoid duplicate URLs, and routes changes/pausing to update_webhook. This is explicit when-to-use and when-not-to-use guidance with named alternatives.

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

delete_assetDelete uploaded assetA
DestructiveIdempotent
Inspect

Delete an uploaded image or video from PinBridge storage. Irreversible; confirm first.

    Use to clean up media from upload_asset that is no longer needed; its
    public_url stops working. Published pins keep their image on Pinterest.
    With confirm=true, a pin or scheduled pin that has not published yet
    and uses the asset fails to publish, so tell the user which ones first.

    Returns asset_id, deleted, requires_confirmation, referenced_pin_count
    (pins plus scheduled pins that have not run yet) and freed_bytes. With
    confirm=false and the asset still in use, nothing is deleted: deleted
    is false and requires_confirmation true.
    Fails with not_found for an unknown id and insufficient_scope without
    the destructive scope.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNofalse (default) deletes nothing while pins or pending scheduled pins use the asset and reports how many; true deletes it anyway and detaches it.
asset_idYesUUID of the uploaded asset, from upload_asset.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructive/idempotent/readOnly status, but the description adds substantial context beyond them: irreversibility, that public_url stops working, that unpublished pins fail to publish, and two named failure modes (not_found, insufficient_scope) tied to a required scope. This is exactly the behavioral disclosure a destructive tool needs.

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 purpose and the irreversible warning, then usage and return/failure details in scannable paragraphs. Dense but every sentence carries decision-relevant information; slightly verbose for a two-parameter tool.

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?

No output schema exists, yet the description enumerates the return fields (asset_id, deleted, requires_confirmation, referenced_pin_count, freed_bytes) and the confirm=false no-op state. Combined with failure modes, an agent has everything needed to call and interpret this destructive tool correctly.

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 goes further by explaining the confirm=false vs confirm=true semantics in terms of consequences (nothing deleted vs deletes anyway and detaches) and the referenced_pin_count meaning. The added meaning is real but largely overlaps the schema's own confirm description.

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?

States a specific verb and resource ('Delete an uploaded image or video from PinBridge storage') with clear scope, distinguishing it from sibling delete_pin/delete_board/delete_schedule by naming the asset origin (upload_asset). An agent can identify 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.

Usage Guidelines5/5

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

Gives explicit when-to-use ('clean up media from upload_asset that is no longer needed'), the alternative edge case (published pins keep their image on Pinterest), and a precondition ('tell the user which ones first') before destructive confirmation. Routing and sequencing guidance is fully spelled out.

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

delete_boardDelete boardA
DestructiveIdempotent
Inspect

Delete a board on Pinterest together with every pin on it. Irreversible; confirm first.

    Use only when the whole board should go; to remove one pin use
    delete_pin. PinBridge keeps its records of the board's published pins
    and flags them removed_from_pinterest_at.

    Returns {"deleted": true, "board_id": "<id>"}. Fails with
    board_not_found for an unknown board, forbidden when sandbox board
    writes are blocked, insufficient_scope without the destructive scope,
    and token_expired / scope_missing when the Pinterest connection needs a
    reconnect.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYesPinterest board ID (numeric string), from list_boards.
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses irreversibility and the need to confirm first, the side effect on PinBridge's records, exact success return shape, and all relevant failure modes including scope and token issues. This is substantial behavioral context that annotations alone do not provide.

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

Conciseness5/5

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

Front-loaded with the action, scope, and irreversibility; then usage guidance, side effects, and error cases are clearly separated. Every sentence adds operational value, and the structure makes it easy to scan.

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?

Despite lacking an output schema, the description provides the return format and error names. It also covers the destructive side effect and the account-scope context. An agent has everything needed to select and invoke this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and both parameters are already documented with provenance (from list_boards / list_pinterest_accounts). The description adds no new parameter-level detail, so the baseline score of 3 applies.

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?

States a specific verb and resource ('Delete a board on Pinterest'), clarifies the scope ('together with every pin on it'), and explicitly names the sibling it is not ('to remove one pin use delete_pin'). An agent can distinguish this from delete_pin and similar 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.

Usage Guidelines5/5

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

Gives an explicit when-to-use condition ('Use only when the whole board should go') and the alternative for the other case ('to remove one pin use delete_pin'). This is direct, unambiguous routing guidance.

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

delete_pinDelete pinA
DestructiveIdempotent
Inspect

Delete one pin, from Pinterest too by default. Irreversible; confirm first.

    Use for a pin that should not exist, or to replace a published pin that
    needs a correction (published pins cannot be edited). Before a pin
    publishes, fix it with update_pin instead. Never use delete_board to
    remove one pin.

    Returns id, deleted, removed_from_pinterest, pinterest_pin_id and
    reason when nothing was removed upstream (not_published,
    simulated_sandbox, record_only, api_version_too_old). Fails with
    not_found for an unknown id and insufficient_scope without the
    destructive scope.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pin_idYesUUID of the pin, from list_pins or create_pin.
delete_from_pinterestNotrue (default) also removes the published pin from Pinterest; false keeps it live there and only deletes the PinBridge record.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds crucial context: it is irreversible, requires confirmation, and details the return values and failure modes (not_found, insufficient_scope, and reasons when nothing was removed upstream). This goes well beyond the annotation metadata and fully discloses the operation's side effects and error behavior.

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

Conciseness5/5

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

The description is organized into a brief lead sentence followed by usage guidance and return/error details. Every sentence adds value, and the most important information (irreversibility, primary action) is front-loaded. It is concise given the behavioral complexity it must convey.

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?

With no output schema, the description fully explains the return payload and error conditions. It covers usage, exclusions, and scope requirements, leaving no critical gap an agent would need to guess. The description is complete for a destructive operation with subtle edge cases.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both pin_id and delete_from_pinterest with their meanings and defaults. The description does not add additional parameter semantics beyond what the schema provides, so a baseline 3 is appropriate since the schema carries the burden.

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?

States a specific verb (delete) and resource (pin), and immediately clarifies the default behavior of also removing from Pinterest. It explicitly differentiates from delete_board and update_pin by naming when each alternative is appropriate, so an agent can disambiguate without inspecting sibling schemas.

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?

Gives explicit conditions for use (pin should not exist, or replace a published pin that cannot be edited) and explicit exclusions (before publishing, use update_pin; never use delete_board for a single pin). This fully covers when and when-not, including naming the correct alternative.

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

delete_scheduleDelete scheduled pinA
DestructiveIdempotent
Inspect

Delete a finished schedule record (status done, failed or canceled). Irreversible.

    Use to clean up history. A pending schedule cannot be deleted: use
    cancel_schedule first. Deleting does not touch the pin a done schedule
    already published.

    Returns {"deleted": true, "schedule_id": "<id>"}. Fails with not_found
    for an unknown id, bad_request while the schedule is still pending, and
    insufficient_scope without the destructive scope.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
schedule_idYesUUID of the schedule, from list_schedules or create_schedule.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the destructiveHint/idempotentHint annotations by disclosing irreversibility, the pending-status precondition, the side-effect boundary ('does not touch the pin'), and the exact error codes (not_found, bad_request, insufficient_scope). This is rich behavioral context an agent cannot get from annotations alone.

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

Conciseness5/5

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

Front-loads the core action and irreversibility warning, then usage routing, then return/error contract. Every sentence earns its place with no 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?

With no output schema, the description supplies the return shape ({"deleted": true, "schedule_id": ...}) and the failure modes, so 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.

Parameters3/5

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

Schema coverage is 100% including a description pointing at list_schedules/create_schedule as sources for the UUID, so the schema already carries parameter meaning. The description adds only indirect semantics via the not_found error on unknown ids, so baseline 3 applies.

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?

States a specific verb+resource ('Delete a finished schedule record') and immediately narrows scope to non-terminal-status records. It is clearly distinguishable from siblings like cancel_schedule and delete_pin, which it explicitly references or implicitly excludes.

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?

Explicitly says when to use it ('clean up history') and when not to ('A pending schedule cannot be deleted: use cancel_schedule first'), naming the alternative tool by name. 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.

delete_webhookDelete webhookA
DestructiveIdempotent
Inspect

Delete a webhook endpoint; deliveries stop immediately. Irreversible.

    Use when the endpoint is retired. To pause temporarily use
    update_webhook with is_enabled=false instead.

    Returns {"deleted": true, "webhook_id": "<id>"}. Fails with not_found
    for an unknown id and insufficient_scope without the destructive scope.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
webhook_idYesUUID of the webhook, from list_webhooks.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, but the description goes further with the immediate delivery cutoff, irreversibility, the exact success payload, and named failure modes not_found and insufficient_scope. That is meaningful context beyond the structured hints.

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

Conciseness4/5

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

Front-loaded with the destructive effect, then usage routing, then return/error contract — every sentence earns its place. Slightly denser than needed but no waste worth cutting.

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?

With no output schema, the description supplies the return shape and the two error conditions, and the mutation risk is fully covered. An agent has everything needed to call and interpret it.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter is documented in the schema ('UUID of the webhook, from list_webhooks'). The description adds no parameter-level detail, so the baseline 3 applies.

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?

States a specific verb and resource ('Delete a webhook endpoint') and immediately qualifies scope with 'deliveries stop immediately. Irreversible.' This clearly separates it from sibling update_webhook and the other delete_* tools.

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 ('Use when the endpoint is retired') plus an explicit alternative and its condition: 'To pause temporarily use update_webhook with is_enabled=false instead.' This is exactly the when/when-not/alternative guidance the dimension asks for.

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

get_account_analyticsGet account analyticsA
Read-onlyIdempotent
Inspect

Pinterest performance metrics for a whole connected account over a date range.

    Use for account-level reporting (all pins, not only ones published
    through PinBridge). For one pin use get_pin_analytics; for publish
    headroom use get_rate_meter.

    Returns account_id, start_date, end_date, provider_mode, totals,
    daily rows (empty with include_daily=false; pass that when the totals
    are enough), and source (stored or live) with data_as_of for stored
    reads. Fails with not_found for an unknown account and with
    token_expired / scope_missing when the Pinterest connection needs a
    reconnect.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
sourceNoWhere to read from. auto (default): PinBridge's nightly stored history when it covers the range, else Pinterest. stored: history only (up to 366 days). live: always ask Pinterest (up to 90 days, counts against the read limit).
metricsNoComma-separated Pinterest metric types, e.g. IMPRESSION,SAVE,PIN_CLICK,OUTBOUND_CLICK. Default: the organic engagement set.
end_dateNoInclusive end, YYYY-MM-DD. Default: today. Up to 366 days from stored history, 90 days when read live from Pinterest.
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.
start_dateNoInclusive start, YYYY-MM-DD. Default: 30 days ago.
include_dailyNofalse: return only the range totals, with an empty daily list. Use it when the totals are all you need, e.g. over 90 days. Default: true.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=true and idempotentHint=true, and the description consistently describes a read operation. It adds meaningful behavioral detail: return fields, the effect of include_daily, the stored/live source behavior with data_as_of, and failure modes like not_found, token_expired, and scope_missing. No contradiction with annotations.

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

Conciseness5/5

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

The description is compact and well-structured: it front-loads the purpose, gives routing guidance, summarizes return shape, and lists key error cases. Every sentence contributes useful information with no filler or redundancy.

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?

There is no output schema, so the description compensates by enumerating the returned fields and daily-row behavior. It also covers error conditions and clarifies the stored vs live source semantics. For a read-only analytics tool with rich parameter schema, this is complete enough for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already has detailed descriptions including defaults, formats, and behavior. The description adds only slight reinforcement around include_daily and source, but does not provide substantial meaning beyond the schema. Baseline 3 applies.

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?

States a specific verb and resource: 'Pinterest performance metrics for a whole connected account over a date range.' It clearly distinguishes itself from siblings by specifying account-level reporting over all pins and explicitly naming get_pin_analytics and get_rate_meter as different tools.

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?

Explicitly says when to use this tool ('Use for account-level reporting'), what it covers ('all pins, not only ones published through PinBridge'), and when to use alternatives ('For one pin use get_pin_analytics; for publish headroom use get_rate_meter'). This leaves no ambiguity about selection.

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

get_billing_statusGet billing statusA
Read-onlyIdempotent
Inspect

Return the workspace's plan, monthly publish quota, usage and feature flags.

    Use before a large create_pins_batch or after quota_exceeded to see how
    many publishes remain, and to check plan features before upload_asset
    (uploaded_media_assets) or create_pins_batch (bulk_imports). For
    Pinterest's per-account publish rate use get_rate_meter; for pin
    performance use get_account_analytics.

    Returns plan, billing_status, quota_calls_monthly, calls_used,
    quota_reset_at, quota_exhausted, credits_remaining, storage_used_bytes /
    storage_quota_bytes, pinterest_accounts_limit, uploaded_media_assets,
    bulk_imports. Never fails for a valid key.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds meaningful context beyond this, including the specific returned fields and the reliability claim that it 'Never fails for a valid key.' This goes 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?

The description is longer than average but well-structured: primary purpose first, then usage guidance, then alternatives, then return fields. The enumeration of return fields is justified because there is no output schema, and no sentence is wasted.

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 read-only, parameterless tool with rich annotations, the description is complete. It explains why and when to call it, what it returns in detail, how it relates to relevant siblings, and its failure behavior, leaving no significant gap for an agent deciding to invoke it.

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?

The tool has zero parameters and the schema is entirely covered by an empty properties object. Per calibration, a 0-parameter tool gets a baseline of 4; there is no parameter-level meaning for the description to add.

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 description opens with a specific verb and resource: 'Return the workspace's plan, monthly publish quota, usage and feature flags.' It clearly distinguishes itself from sibling tools by naming get_rate_meter and get_account_analytics as alternatives for different purposes.

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 guidance is given: use before a large create_pins_batch, after quota_exceeded, or to check plan features before upload_asset and create_pins_batch. It also explicitly routes the agent to get_rate_meter for per-account publish rate and get_account_analytics for pin performance, providing clear when-to-use and when-not-to-use instructions.

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

get_dashboard_summaryGet dashboard summaryA
Read-onlyIdempotent
Inspect

Summarize publishing activity over a period: how many pins went out and how it went.

    Use to answer "how did publishing go this week / today / last month":
    pin outcomes, success rate, the change against the previous period,
    and what is still queued or scheduled. Ranges up to 48 hours come back
    hourly, longer ones daily, up to 366 days. For Pinterest engagement
    (impressions, saves, clicks) use get_account_analytics; to see the
    individual failed pins use list_pins with status=failed.

    Returns start, end, timezone, granularity (hour | day), pins (total,
    submitted, by_status, success_rate from 0 to 1), previous_pins (same
    figures for the preceding period of equal length), series (created / published /
    failed per bucket), published_by_account, queue (queued, deferred,
    publishing right now), schedules (by_status in the range, upcoming) and
    import_jobs (null when filtered by account). Outcomes count by when
    they happened: published by publish time, failed by failure time (for
    pins still failed); pins.total is the sum of by_status, and
    pins.submitted and series.created count pins submitted in the range
    (API 1.38+; older APIs report submissions in pins.total and omit
    pins.submitted). Fails with invalid_date_range (start not before end, or
    more than 366 days), invalid_timezone, or account_not_permitted for an
    account outside the key's allow-list.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
tzNoIANA time zone for the day/hour buckets, e.g. "Europe/Paris". Default "UTC".UTC
endNoRange end, exclusive, ISO 8601. Default: now.
startNoRange start, inclusive, ISO 8601. Without an offset it is read in tz, e.g. "2026-09-01" is local midnight. Default: 30 days before end.
account_idNoUUID of a connected Pinterest account, from list_pinterest_accounts.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral detail beyond that: hourly vs. daily granularity by range length, the 366-day limit, full return-field semantics, how outcomes are counted, API version differences, and specific error names. This goes far beyond what the 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.

Conciseness5/5

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

The description is front-loaded with a one-sentence purpose, then alternatives, then behavior and return details in a logical order. Despite its length, every sentence carries meaningful information and there is no filler or repetition of schema text.

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?

There is no output schema, so the description correctly compensates by enumerating the full return shape, including nested fields like series, queue, schedules, and import_jobs. It also covers error conditions and edge cases such as old API versions, making it complete enough for an agent to invoke the tool confidently.

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 description coverage is 100%, so the schema already documents tz, start, end, and account_id well. The description adds complementary semantics about range length affecting granularity, the meaning of start/end inclusivity, and the invalid_date_range failure condition, which improves parameter understanding beyond the schema alone.

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 description opens with a specific verb and resource: 'Summarize publishing activity over a period: how many pins went out and how it went.' It clearly distinguishes this tool from siblings by naming get_account_analytics for engagement metrics and list_pins for failed-pin details, so an agent can identify the right tool immediately.

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?

The description explicitly states when to use the tool ('how did publishing go this week / today / last month') and gives concrete alternatives with conditions: use get_account_analytics for Pinterest engagement and list_pins with status=failed for individual failed pins. This is exactly the kind of when-to-use-versus-siblings guidance an agent needs.

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

get_pinGet pinA
Read-onlyIdempotent
Inspect

Fetch one pin's current status, Pinterest ID and any publish error.

    Use to poll a pin from create_pin until it is published, failed or
    deferred, or to read why it failed. To find pins without an id use
    list_pins; for impressions and clicks use get_pin_analytics; to fix a
    failure use retry_pin.

    Returns the pin with status, error_code and error_message when failed,
    pinterest_pin_id once published, and its media and board fields.
    removed_from_pinterest_at is set when the published pin was later
    deleted on Pinterest (status stays published). An unknown id fails with
    not_found.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pin_idYesUUID of the pin, from list_pins or create_pin.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral detail: return fields per state, error_code/error_message on failure, pinterest_pin_id once published, removed_from_pinterest_at behavior, and not_found for unknown ids. This goes well beyond the structured annotations.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and then organized into usage guidance and return behavior. Each sentence earns its place, and the structure makes the information easy to scan without being bloated.

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 simple one-parameter read tool, the description is complete: it explains when to poll, what each outcome returns, how deletion is reflected, and how unknown ids fail. No output schema exists, so the description correctly carries the burden of explaining return values.

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

Parameters3/5

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

The schema already documents pin_id as 'UUID of the pin, from list_pins or create_pin' with 100% coverage, so the description adds little new parameter-level meaning. It does mention not_found for unknown ids, which is useful behavioral context, but does not further clarify the parameter itself.

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 description opens with 'Fetch one pin's current status, Pinterest ID and any publish error,' which names a specific verb, resource, and scope. It clearly distinguishes itself from siblings by explicitly naming list_pins, get_pin_analytics, and retry_pin for other use cases.

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 explicitly states when to use this tool: 'Use to poll a pin from create_pin until it is published, failed or deferred, or to read why it failed.' It also provides exclusions and alternatives: 'To find pins without an id use list_pins; for impressions and clicks use get_pin_analytics; to fix a failure use retry_pin.'

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

get_pin_analyticsGet pin analyticsA
Read-onlyIdempotent
Inspect

Pinterest performance metrics for one published pin over a date range.

    Use after a pin has been published for a while to report impressions,
    saves and clicks. For the whole account use get_account_analytics; for
    publish status use get_pin.

    Returns pin_id, pinterest_pin_id, account_id, start_date, end_date,
    provider_mode, totals (each metric summed over the range, lowercase
    names), daily rows (empty with include_daily=false; pass that when the
    totals are enough), source (stored or live) and data_as_of for stored
    reads. total_comments and total_reactions are lifetime counts on live
    reads and 0 on stored reads, which do not keep them: use source=live
    for comments and reactions. They read 0 on every daily row, since
    Pinterest does not report them per day. A pin deleted on Pinterest is answered from stored
    history with removed_from_pinterest_at set, and fails with
    pin_removed_on_pinterest when none is stored. Fails with not_found for
    an unknown pin and with pin_not_published for a pin that has not
    published yet; sandbox pins return zeroed metrics.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pin_idYesUUID of the pin, from list_pins or create_pin.
sourceNoWhere to read from. auto (default): PinBridge's nightly stored history when it covers the range, else Pinterest. stored: history only (up to 366 days). live: always ask Pinterest (up to 90 days, counts against the read limit).
metricsNoComma-separated Pinterest metric types, e.g. IMPRESSION,SAVE,PIN_CLICK,OUTBOUND_CLICK. Default: the organic engagement set.
end_dateNoInclusive end, YYYY-MM-DD. Default: today. Up to 366 days from stored history, 90 days when read live from Pinterest.
start_dateNoInclusive start, YYYY-MM-DD. Default: 30 days ago.
include_dailyNofalse: return only the range totals, with an empty daily list. Use it when the totals are all you need, e.g. over 90 days. Default: true.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark the tool as readOnly and idempotent, but the description goes well beyond: it explains stored vs live reads, zeroed daily metrics, lifetime counts for comments/reactions, deleted-pin fallback behavior, specific error cases, and sandbox behavior. There is no contradiction with the annotations.

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

Conciseness5/5

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

The description is long but appropriately sized for a six-parameter read tool with no output schema. It is front-loaded with purpose and usage, then return fields, then exceptions. Each clause carries distinguishing information rather than padding.

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?

With no output schema, the description supplies the return field list, daily-row behavior, source semantics, and failure modes. Combined with the fully documented input schema, an agent has everything needed to invoke and interpret the tool correctly.

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 decision-relevant meaning beyond the schema: use source=live for comments and reactions, pass include_daily=false when totals suffice, and the implications of stored history vs live reads. Metrics and date syntax are already fully covered by the schema.

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 description opens with a specific verb and resource: 'Pinterest performance metrics for one published pin over a date range.' It also explicitly distinguishes itself from get_account_analytics and get_pin, so an agent can tell which tool to choose among many siblings.

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 gives explicit timing ('Use after a pin has been published for a while'), names the alternatives for account-level metrics and publish status, and even advises when to pass include_daily=false. This is clear, actionable when-to-use guidance.

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

get_rate_meterCheck rate limitsA
Read-onlyIdempotent
Inspect

Return how many Pinterest publishes an account can make right now.

    Use before publishing many pins at once, or after rate_limited, to
    decide between publishing now and spreading pins out with
    create_schedule. This is Pinterest's publish pacing; for the PinBridge
    monthly quota use get_billing_status.

    Returns account and global token buckets, each with tokens_available,
    capacity and refill_rate (tokens per second). tokens_available of 0
    means the next publish is deferred until the bucket refills. An unknown
    account fails with not_found.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description adds meaningful behavioral context: it returns account and global token buckets with fields, explains that tokens_available of 0 defers publishing, and documents not_found for unknown accounts. This is valuable beyond the annotations.

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

Conciseness5/5

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

The description is front-loaded with the core action and then provides usage guidance, return shape, and failure behavior, all in a compact set of sentences. Every sentence earns its place without redundancy.

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?

With no output schema, the description compensates by specifying the return fields and their semantics, including what zero tokens means. It also covers the failure case and the decision context, making the tool complete enough for an agent to call correctly.

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

Parameters3/5

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

The single parameter account_id is fully documented by the schema, including its source from list_pinterest_accounts. The description does not add additional parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.

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?

States a specific verb and resource: 'Return how many Pinterest publishes an account can make right now.' It clearly distinguishes itself from get_billing_status, which covers the PinBridge monthly quota, and from the scheduling workflow. An agent can tell exactly what this tool is for.

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?

Explicitly says when to use it: before publishing many pins at once or after rate_limited, to decide between publishing now or spreading pins out with create_schedule. It also names the alternative for monthly quota, get_billing_status. This gives the agent clear routing guidance.

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

get_scheduleGet scheduled pinA
Read-onlyIdempotent
Inspect

Fetch one scheduled pin (a pin queued to publish at a future time) by id.

    Use to check whether a schedule is still pending, has published, failed
    or was canceled. To browse schedules use list_schedules; once status is
    done, follow the resulting pin with get_pin using pin_id.

    Returns the schedule with status, run_at, pinterest_account_id, payload
    (board_id, title, media), pin_id and last_error. An unknown id fails
    with not_found.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
schedule_idYesUUID of the schedule, from list_schedules or create_schedule.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the read-only/idempotent/non-destructive annotations, the description reveals the exact return shape ('status, run_at, pinterest_account_id, payload ... pin_id and last_error') and failure behavior ('An unknown id fails with not_found'). Since there is no output schema, this behavioral disclosure is especially valuable.

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

Conciseness5/5

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

The description is front-loaded with the core action, then gives usage context, alternatives, return details, and error semantics in compact, purposeful sentences. No sentence is redundant or 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 single-parameter read-only retrieval tool, the description covers what the tool does, when to use it, what it returns, how to act on the result, and what happens on a bad id. With no output schema, this is fully sufficient for an agent to invoke and interpret the call correctly.

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

Parameters3/5

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

The schema already provides 100% coverage for schedule_id, including its UUID type and provenance ('from list_schedules or create_schedule'). The description adds only the generic 'by id', so it does not meaningfully improve on the schema.

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 description uses a specific verb and resource: 'Fetch one scheduled pin ... by id' and defines what a scheduled pin is. It clearly distinguishes this tool from list_schedules and get_pin, matching its place among the sibling tools.

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 explicitly states when to use the tool ('check whether a schedule is still pending, has published, failed or was canceled') and routes to alternatives: 'To browse schedules use list_schedules' and 'follow the resulting pin with get_pin using pin_id.' This gives an agent unambiguous selection criteria.

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

list_activity_logsList activity logsA
Read-onlyIdempotent
Inspect

Read the workspace audit trail: who did what, when, with what outcome.

    Use to reconstruct what happened to a pin or schedule, or to see
    changes made outside this session (dashboard, API, other agents). For
    current state use get_pin / get_schedule instead.

    Returns items (log entries with action, status, message, resource_type,
    resource_id, metadata, created_at) and next_cursor for the next page,
    null on the last page. Fails with validation_error for a malformed
    cursor or since value; unknown filter values return an empty page.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoEntries per page.
sinceNoISO 8601 timestamp; only entries after this time.
actionNoAction name, e.g. "pin.publish_failed".
cursorNonext_cursor from the previous page.
statusNoOutcome: "success", "failed", "queued", "canceled".
categoryNoCategory, e.g. "publishing", "configuration".
resource_typeNoResource kind, e.g. "pin", "schedule", "board".

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already signal read-only, idempotent, and non-destructive behavior. The description adds substantial behavioral context beyond that: it documents the return shape, pagination via next_cursor, null cursor on the last page, validation_error for malformed cursor/since, and empty-page behavior for unknown filters. No contradiction with annotations.

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

Conciseness5/5

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

The description is compact and front-loaded: purpose first, usage guidance second, return/error behavior last. Every sentence earns its place, and there is no filler or repetition of what the annotations already communicate.

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?

There is no output schema, so the description correctly takes responsibility for explaining return values and pagination. It also covers key failure modes, making it complete enough for an agent to invoke the tool and interpret its results correctly.

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

Parameters3/5

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

Input schema coverage is 100%, so the schema already documents all seven parameters. The description adds minor references to cursor and since behavior in error cases, but it does not substantially enrich parameter meaning beyond the schema's own descriptions. A baseline of 3 is appropriate.

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 description states a specific verb and resource: 'Read the workspace audit trail: who did what, when, with what outcome.' It clearly distinguishes this tool from other list tools by framing it as an audit trail rather than a current-state listing, and it explicitly names alternatives like get_pin/get_schedule later.

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?

The description gives explicit when-to-use guidance: reconstruct past events or see changes made outside the session. It also names the alternative for current state ('For current state use get_pin / get_schedule instead'), making the selection logic unambiguous.

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

list_boardsList boardsA
Read-onlyIdempotent
Inspect

List the boards an account can publish to.

    Use to pick a board_id for create_pin or create_schedule, or after
    board_not_found. Also read pinbridge://accounts/{account_id}/boards. To
    test one board's publishability use check_board_access.

    Returns id, name, description, privacy per board. Fails with not_found
    for an unknown account, account_not_permitted if the key cannot use it,
    and token_expired / token_revoked / scope_missing when the Pinterest
    connection needs a reconnect in the dashboard.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds valuable behavioral details: error conditions (not_found, account_not_permitted, token_expired/token_revoked/scope_missing) and the return shape (id, name, description, privacy). This goes beyond annotation safety to inform agents about failure modes and output, which is exactly what is needed. No contradiction.

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

Conciseness5/5

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

The description is three well-structured sentences: primary purpose, usage context with alternatives, and return/error information. It is front-loaded with the main action, then gives practical guidance, then technical details. No wasted words; every sentence earns its place.

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 simple list operation with one parameter and an output schema, the description is complete: it states the purpose, when to use it, alternatives, return fields, and error handling. It also connects to related tools and even provides a manual fallback URI. An agent has everything needed to invoke it correctly and interpret results.

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

Parameters3/5

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

The single parameter account_id is fully described in the schema with context (UUID from list_pinterest_accounts), and schema coverage is 100%. The tool description does not add extra meaning to the parameter itself; it only references account_id indirectly. Per rules, baseline of 3 is appropriate since the schema handles parameter documentation.

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 description clearly states the tool lists boards an account can publish to, using the specific verb 'List' and resource 'boards'. It distinguishes from board mutation tools (create/update/delete) and explicitly ties to downstream use cases (picking board_id for create_pin/create_schedule). It also names a sibling tool (check_board_access) for a different purpose, so an agent can differentiate them.

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?

The description explicitly states when to use the tool: to select a board_id for pin creation/scheduling or after board_not_found. It also directs agents to check_board_access when testing a single board's publishability, providing a clear alternative. It even references a non-tool alternative (pinbridge URI) for reading boards, giving full context.

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

list_pinsList pinsA
Read-onlyIdempotent
Inspect

List pins in this workspace, newest first, with search, filters and sorting.

    Use to find a pin's id (search its title with q), review what published
    or failed, or audit one board or account. For one known pin use
    get_pin; for scheduled (not yet published) pins use list_schedules; for
    totals over a period use get_dashboard_summary.

    Returns one page: {items, total, limit, offset, has_more}. items are
    pin summaries (id, title, status, board_id, pinterest_account_id,
    pinterest_pin_id, link_url, error_code, error_message, created_at,
    published_at, removed_from_pinterest_at); detail="full" returns every
    field, but read one pin with get_pin instead. removed=true lists
    published pins that were deleted on Pinterest. total counts every match
    across all pages, so "how many pins failed this week?" is one call with
    status=failed, since=... and limit=1. To read further, repeat the call
    with the same filters, q and sort and offset = offset + limit while
    has_more is true. total is null only against a PinBridge API older
    than 1.34. Filtering on an account
    outside the key's allow-list fails with account_not_permitted, and an
    unknown sort or status fails with validation_error.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
qNoCase-insensitive text to find in the title, description or link URL; % and _ match literally.
sortNoOrder: created_at, published_at (unpublished last), title or status, each _asc or _desc.created_at_desc
limitNoPage size, 1-200.
sinceNoISO 8601 timestamp with timezone; lower bound, inclusive.
untilNoISO 8601 timestamp with timezone; upper bound, exclusive.
detailNosummary (default): the fields needed to find, audit and count pins. full: the whole pin, including description, alt text and media URLs; about three times larger, so prefer get_pin for one pin.summary
offsetNoRows to skip. For the next page pass offset + limit from the last result.
statusNoOne of queued, deferred, publishing, published, failed.
removedNotrue: only published pins that were later deleted on Pinterest; false: leave them out. Default: both.
board_idNoPinterest board ID (numeric string), from list_boards.
account_idNoUUID of a connected Pinterest account, from list_pinterest_accounts.
error_codeNoOnly failed pins with this error code, e.g. board_access_denied.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesPins on this page in the requested order. With detail=summary each has id, title, status, board_id, pinterest_account_id, pinterest_pin_id, link_url, error_code, error_message, created_at, published_at and removed_from_pinterest_at (set when the pin was deleted on Pinterest). detail=full returns every pin field. Empty when nothing matches.
limitYesPage size used for this call.
totalYesHow many rows match the filters and search across all pages. Answer "how many ...?" from this; limit=1 is enough. Null only when the PinBridge API is older than 1.34.
offsetYesRows skipped before this page.
has_moreYestrue when more rows follow: call again with the same filters, q and sort and offset = offset + limit. When total is null it only means this page was full.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare the operation read-only, idempotent, and non-destructive. The description adds substantial behavioral context beyond that: pagination semantics (items, total, limit, offset, has_more), the fact that total counts all matching pages, a version-specific quirk (total null on PinBridge API older than 1.34), error conditions (account_not_permitted, validation_error), and the size trade-off of detail='full'. This far exceeds the annotation baseline.

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 description is front-loaded with a clear one-sentence purpose and then organized into use cases, return structure, pagination, and error behavior. It is long, and the return-field enumeration is partly redundant given an output schema exists, so it loses one point. However, nearly every other sentence earns its place with actionable detail.

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 12-parameter tool with a full input schema, output schema, and safety annotations, the description is complete. It covers pagination, counting patterns, edge cases (older API versions, allow-list failures), and error handling. Nothing an agent needs to call it 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 description coverage is 100%, so the baseline is 3. The description goes further by showing parameter combination patterns: using q to find a pin's id, status=failed with since and limit=1 for counts, and offset = offset + limit for pagination. It doesn't redefine individual params (schema already handles that), making 4 appropriate rather than 5.

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 description opens with a specific verb, resource, and scope: 'List pins in this workspace, newest first, with search, filters and sorting.' It then clarifies the core use cases (find pin id, audit published/failed pins, review one board or account), which differentiates it from siblings like get_pin, list_schedules, and get_dashboard_summary. This is a clear, non-tautological statement of function.

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?

The description explicitly names alternatives and the conditions that route to them: 'For one known pin use get_pin; for scheduled (not yet published) pins use list_schedules; for totals over a period use get_dashboard_summary.' It also gives concrete scenarios like 'how many pins failed this week?' with the parameter combination to use. This is exemplary when-to-use guidance.

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

list_pinterest_accountsList Pinterest accounts
Read-onlyIdempotent
Inspect

List the Pinterest accounts connected to this workspace with their health.

    Use first: list_boards, create_pin, create_schedule and get_rate_meter
    all need an account_id from here. Also read pinbridge://accounts. To
    connect a new account or fix reconnect_required, the user must use the
    PinBridge dashboard; there is no tool for that.

    Returns {"items": [...], "connect_url": "...", "next_step": ...}. items has
    one entry per account with id (the account_id), username, display_name,
    scopes (comma-separated), token_expires_at and health: health_status
    (healthy, refresh_due, reconnect_required or scope_missing),
    health_message, reconnect_required and missing_scopes. connect_url opens
    the dashboard's connect step. When items is empty nothing is connected:
    next_step says to give the user connect_url. Accounts outside this API
    key's allow-list are omitted. Never fails for a valid key.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

list_schedulesList scheduled pinsA
Read-onlyIdempotent
Inspect

List scheduled pins in this workspace, latest run_at first, with search and filters.

    Use to find a schedule's id (search its title with q), see what is
    queued for a period (status=scheduled, sort=run_at_asc), or list failed
    schedules to retry. For one known schedule use get_schedule; for pins
    that already published use list_pins.

    Returns one page: {items, total, limit, offset, has_more}. items are
    the schedules (id, pinterest_account_id, run_at, status, payload with
    board_id, title and media, pin_id once it ran, last_error, created_at,
    updated_at). total counts every match across all pages, so "how many
    pins are scheduled for next week?" is one call with status=scheduled,
    since/until and limit=1. To read further, repeat the call with the same
    filters, q and sort and offset = offset + limit while has_more is true.
    Fails with account_not_permitted for an account outside the key's
    allow-list and validation_error for a bad status, sort or timestamp.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
qNoCase-insensitive text to find in the title, description or link URL; % and _ match literally.
sortNoOrder: run_at, created_at, title or status, each _asc or _desc. run_at_asc lists the next run first.run_at_desc
limitNoPage size, 1-200.
sinceNoISO 8601 timestamp with timezone; lower bound, inclusive.
untilNoISO 8601 timestamp with timezone; upper bound, exclusive.
offsetNoRows to skip. For the next page pass offset + limit from the last result.
statusNoOne of scheduled, queued, deferred, running, done, failed, canceled.
board_idNoPinterest board ID (numeric string), from list_boards.
account_idNoUUID of a connected Pinterest account, from list_pinterest_accounts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesSchedules on this page in the requested order, each with id, pinterest_account_id, run_at, status, payload (board_id, title, media), pin_id once it ran, last_error, created_at and updated_at. Empty when nothing matches.
limitYesPage size used for this call.
totalYesHow many rows match the filters and search across all pages. Answer "how many ...?" from this; limit=1 is enough. Null only when the PinBridge API is older than 1.34.
offsetYesRows skipped before this page.
has_moreYestrue when more rows follow: call again with the same filters, q and sort and offset = offset + limit. When total is null it only means this page was full.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint; the description adds meaningful behavior beyond that: one-page result shape, total counting across pages, pagination loop via offset + limit, and error cases like account_not_permitted and validation_error. No contradiction.

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

Conciseness5/5

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

Well-structured: a one-line summary, then use cases and alternatives, then return/pagination/errors. Despite its length, every sentence earns its place given the tool has 9 parameters and a paged response.

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?

With an output schema present, the description need not restate every return field, but it still covers the page envelope, pagination technique, filtering semantics, and failure modes. An agent has everything needed to call and page through results correctly.

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 baseline is 3. The description adds contextual guidance over the schema, such as using status=scheduled with since/until and limit=1 to count matching schedules, and clarifying that run_at_asc lists the next run first.

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?

States a specific verb ('List'), resource ('scheduled pins'), scope ('in this workspace'), and default ordering ('latest run_at first'). It also distinguishes itself from siblings by explicitly naming get_schedule and list_pins as alternatives.

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?

Gives three concrete use cases: finding a schedule id by search, viewing queued items, and listing failed schedules to retry. It also explicitly routes to alternatives: 'For one known schedule use get_schedule; for pins that already published use list_pins.'

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

list_webhooksList webhooksA
Read-onlyIdempotent
Inspect

List every webhook endpoint registered in this workspace.

    Use before create_webhook to avoid registering the same URL twice, or
    to find a webhook's id for update_webhook or delete_webhook.

    Returns id, url, events, is_enabled, created_at per webhook; an empty
    list means none are registered. Secrets are never returned. Never fails
    for a valid key.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses the returned fields, the empty-list meaning, that secrets are never returned, and that it never fails for a valid key. These behavioral guarantees are genuinely additive.

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

Conciseness5/5

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

Four short sentences deliver the operation, usage guidance, return contract, and failure behavior with no filler. The main action is front-loaded and every sentence earns its place.

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?

With no parameters and an output schema present, the description only needed to cover listing scope, return content, and edge cases; it covers all three plus usage guidance. Nothing a caller needs to decide 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?

The tool has zero parameters, so the schema is trivially complete. The description adds no parameter details, but none are needed; the rubric baseline for 0-parameter tools is 4.

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?

Description begins with 'List every webhook endpoint registered in this workspace,' naming a specific resource (webhooks), the operation (list), and scope (workspace-wide). This distinguishes it from mutation siblings like update_webhook and delete_webhook.

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?

Provides explicit usage context: 'Use before create_webhook to avoid registering the same URL twice, or to find a webhook's id for update_webhook or delete_webhook.' This tells an agent exactly when to invoke it and ties it to relevant sibling tools.

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

retry_pinRetry pinA
Idempotent
Inspect

Re-queue a failed pin, optionally on another board or account.

    Use only for pins whose status is failed: pass board_id when the
    original board was deleted or inaccessible (check_board_access says
    why), or account_id when the original account needs a reconnect.
    Published pins cannot be edited or retried; for a failed schedule use
    retry_schedule.

    Returns the pin re-queued with status "queued"; poll get_pin. The new
    board is preflighted like create_pin. Fails with not_found for an
    unknown id and conflict when the pin is not in failed status.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
pin_idYesUUID of the pin, from list_pins or create_pin.
board_idNoBoard to publish to instead of the original one, from list_boards.
account_idNoPinterest account to publish with instead of the original one.

TDQS

A4.5/5.0
Behavior4/5

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

Although annotations already carry readOnlyHint=false and destructiveHint=false, the description adds meaningful behavioral detail beyond that: the return payload ('status quued'), the requirement to poll get_pin, the preflight check equivalent to create_pin, and the two explicit error conditions (not_found, conflict). It does not contradict any annotation (idempotentHint=true is plausible since re-queueing may be idempotent, though not stated). It could go further by noting idempotency behavior, but it already discloses the core outcomes.

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 description is compact but dense, organized into three purposeful paragraphs. The lead sentence states the purpose, the second covers usage constraints and alternatives, and the third covers behavior and errors. Every sentence contributes unique information; there is no fluff. It is longer than the shortest possible version, but the extra length is justified by the failure-mode detail and alternatives.

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

Completeness4/5

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

For a 3-parameter mutation tool with no output schema, the description covers the essential context: return status, polling, preflight behavior, and failure modes. It omits explicit idempotency behavior, but that is already encoded in the idempotentHint annotation. It also does not mention authorization requirements, but that is likely tool-agnostic and covered elsewhere. Overall, it is sufficient for a competent agent to call it correctly.

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% with descriptions for pin_id, board_id, and account_id. The description enriches these by giving the exact scenarios for board_id (original board deleted/inaccessible) and account_id (account reconnect needed). It clarifies that pin_id is required and originates from list_pins or create_pin, and ties the parameter choice to failure reasons. That adds value beyond the bare schema.

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 description opens with a crisp verb-and-resource statement 'Re-queue a failed pin' and immediately scopes it with 'optionally on another board or account.' It actively distinguishes itself from siblings, notably retry_schedule ('for a failed schedule use retry_schedule') and contrasts with create_pin via the preflight mention. An agent can tell exactly what this tool does and what it is not for.

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?

Usage guidance is explicit: 'Use only for pins whose status is failed' states the precondition, and 'Published pins cannot be edited or retried' states a hard exclusion. It also tells when to pass board_id (deleted/inaccessible board, with a pointer to check_board_access) and when to pass account_id (needs reconnect). The alternative for failed schedules is named directly. This leaves no ambiguity about when to invoke this tool versus alternatives.

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

retry_scheduleRetry scheduled pinA
Idempotent
Inspect

Re-queue a schedule whose publish failed.

    Use for schedules in failed status (list_schedules with
    status="failed"). To change the board or account first, use retry_pin
    on the linked pin_id; for a failed pin created directly, use retry_pin.

    Returns the schedule. Its status is usually "queued": a schedule that
    failed while publishing has a linked pin_id, and that pin is
    re-published right away. It is "scheduled" only when the schedule
    failed before any pin was created; the scheduler then runs it at
    run_at, or on its next tick when run_at has passed. Fails with
    not_found for an unknown id and bad_request when the schedule is not
    failed.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
schedule_idYesUUID of the schedule, from list_schedules or create_schedule.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (idempotent, non-destructive), and the description goes well beyond them: it explains the returned status semantics ("queued" vs "scheduled" and why), the pin re-publish side effect, and the two error conditions (not_found, bad_request when not failed). That is exactly the mutation/retry context annotations cannot express.

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

Conciseness4/5

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

Front-loads the core action and then layers routing, return semantics, and error modes in a logical order. It is dense and slightly long for a one-parameter tool, but each sentence carries distinct information about the retry branch, so little is wasted.

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?

With no output schema present, the description assumes responsibility for the return value and does so: it describes the returned schedule and its likely status. It also covers failure modes and the alternative tool path, so an agent has everything needed to call this correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so schedule_id is already fully documented (UUID from list_schedules or create_schedule) and the baseline is 3. The description references the id only indirectly via the not_found error and adds no new syntax or format meaning.

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?

States a specific verb (re-queue) and resource (a schedule whose publish failed), and explicitly contrasts itself with the sibling retry_pin and with list_schedules. An agent can distinguish this from create_schedule, update_schedule, and retry_pin 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.

Usage Guidelines5/5

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

Gives an explicit entry condition (schedules in failed status, discovered via list_schedules with status="failed") and names the alternative tool (retry_pin) for the board/account-change case and for a directly-created failed pin. Both when-to-use and which-sibling-to-use are spelled out, leaving nothing to inference.

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

server_infoServer infoA
Read-onlyIdempotent
Inspect

Report this server's version, target PinBridge API and enabled capabilities.

    Use when a client connects for the first time, or when a call fails
    unexpectedly, to confirm the server is reachable and whether write
    tools are on. For the workspace's plan and quota use get_billing_status.

    Returns server version, pinbridge_base_url, transport and whether write
    tools are enabled. Needs no PinBridge scope.
    
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint. The description adds valuable behavioral context beyond those flags by stating it requires no PinBridge scope and by enumerating the returned fields. This is useful safety and invocation context that the structured data does not capture.

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

Conciseness5/5

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

The description is three compact sentences with no filler. The core function is front-loaded, usage guidance follows, and the return summary and scope note are in the final sentence. Every sentence earns its place.

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 zero-parameter, read-only informational tool with no output schema, the description is complete. It states the purpose, when to use it, what it returns, and its authorization requirement. An agent has everything needed to invoke it correctly.

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

Parameters4/5

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

The tool has zero parameters, so parameter-level documentation is unnecessary. The description adds relevant semantic context by clarifying that no PinBridge scope is needed, which indirectly reassures an agent that no authorization parameter or setup is required. This meets the baseline for a no-parameter tool.

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 description opens with a specific verb and resource: 'Report this server's version, target PinBridge API and enabled capabilities.' It clearly identifies what the tool does and differentiates it from siblings like get_billing_status and get_rate_meter. An agent can immediately understand the tool's unique role.

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 explicitly states when to use this tool: when a client connects for the first time, or when a call fails unexpectedly, to confirm server reachability and whether write tools are enabled. It also names the alternative for workspace plan/quota inquiries: get_billing_status. This leaves no ambiguity about tool selection.

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

update_boardUpdate board
DestructiveIdempotent
Inspect

Rename a board or change its description or privacy on Pinterest.

    Use for board housekeeping; pins on the board are untouched. To move a
    pin that has not published between boards use update_pin; to remove a
    board use delete_board.
    Pass at least one of name, description or privacy.

    Returns the updated board (id, name, description, privacy). Fails with
    board_not_found for an unknown board, forbidden when sandbox board
    writes are blocked, and token_expired / scope_missing when the
    Pinterest connection needs a reconnect (including SECRET on an account
    connected without boards:write_secret).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew board name, unique within the account.
privacyNo"PUBLIC" or "SECRET". SECRET needs the boards:write_secret permission; older connections fail with scope_missing until reconnected.
board_idYesPinterest board ID (numeric string), from list_boards.
account_idYesUUID of a connected Pinterest account, from list_pinterest_accounts.
descriptionNoNew board description.
update_pinUpdate unpublished pin
DestructiveIdempotent
Inspect

Edit a pin that has NOT been published yet: title, description, link, alt text or board.

    Use to fix a typo, link or board before the pin publishes: queued,
    deferred and failed pins then publish with the new values. Published
    pins cannot be edited: Pinterest's API does not allow PinBridge to
    change a pin once it is live, so the call fails with
    pin_already_published. For a published pin, offer delete_pin plus a
    new create_pin (confirm first). To change the image use delete_pin then
    create_pin; for a failed pin on a bad board use retry_pin. Pass at
    least one field.

    Returns the updated pin. Fails with pin_already_published for a
    published pin, not_found for an unknown id, and conflict
    (pin_publishing) while the pin is mid-publish. A new board is
    preflighted like create_pin.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoPin title, at most 100 characters.
pin_idYesUUID of the pin, from list_pins or create_pin.
alt_textNoNew accessibility text, <= 500 characters.
board_idNoPinterest board ID (numeric string), from list_boards.
link_urlNoDestination URL opened when the pin is clicked.
descriptionNoPin description, at most 800 characters.
update_scheduleUpdate scheduled pin
DestructiveIdempotent
Inspect

Edit a pending schedule in place: time, board, text or media.

    Use to fix a wrong run_at, board, title or link on a schedule that has
    not started publishing, instead of cancel_schedule plus
    create_schedule; the id and history are kept. Once the schedule has
    run its pin is published and can no longer be edited; for a failed one
    use retry_schedule. Pass at least one field.

    Returns the updated schedule, still in status "scheduled". A new board
    is preflighted like create_schedule. Fails with not_found for an
    unknown id, schedule_not_editable (409) once publishing started, with a
    remediation naming the right tool, validation_error for a past or
    timezone-less run_at, and sandbox_board_fixed when changing the board
    of a sandbox schedule.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoPin title, at most 100 characters.
run_atNoNew publish time, ISO 8601 with timezone, in the future.
asset_idNoReplace the media with this uploaded asset (drops any image_url).
board_idNoPinterest board ID (numeric string), from list_boards.
link_urlNoDestination URL opened when the pin is clicked.
image_urlNoReplace the media with this public URL (drops any asset_id).
descriptionNoPin description, at most 800 characters.
schedule_idYesUUID of the schedule, from list_schedules or create_schedule.
cover_image_urlNoPublic cover image URL; video pins only.
cover_image_asset_idNoUploaded image asset UUID used as the video cover.
update_webhookUpdate webhook
DestructiveIdempotent
Inspect

Change a PinBridge webhook's URL, secret, events or enabled flag.

    Calls PATCH /v1/webhooks/{webhook_id} on the PinBridge API; the fields,
    event names and signed delivery format are documented at
    https://www.pinbridge.io/docs/api/webhooks/.

    Use to pause deliveries (is_enabled=false) or rotate the secret without
    losing the registration; to stop for good use delete_webhook. Only the
    fields you pass change. Pass at least one.

    Returns the updated webhook (id, url, events, is_enabled). Fails with
    not_found for an unknown id and validation_error for a short secret.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoNew endpoint URL.
eventsNoReplacement event list, e.g. ["pin.published", "pin.failed"].
secretNoNew signing secret, at least 16 characters.
is_enabledNofalse pauses deliveries, true resumes them.
webhook_idYesUUID of the webhook, from list_webhooks.
upload_assetUpload image or videoAInspect

Upload an image or video to PinBridge and get an asset_id for create_pin.

    Use when the media was generated in this session or Pinterest cannot
    fetch it from a public URL; otherwise pass image_url to create_pin
    directly. Provide exactly one of content_base64 or source_url. Videos
    must be uploaded assets.

    Returns id (use as asset_id), public_url, asset_type, content_type,
    size_bytes, created_at. Files are capped at 200 MB (plans cap lower).
    Fails with payment_required on plans without uploaded_media_assets
    (see get_billing_status), validation_error for unsupported media, and
    invalid_image when the file is truncated or corrupted (re-encode the
    exact original bytes; never retype base64 by hand).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesFile name with extension, e.g. "hero.png".
asset_typeNoKind of media being uploaded.image
source_urlNoPublic http(s) URL the server downloads instead of content_base64; no redirects, private hosts are refused.
content_typeNoMIME type, e.g. "image/png"; inferred when omitted.
content_base64NoBase64-encoded file bytes (data: prefix allowed).

TDQS

A5/5.0
Behavior5/5

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

Annotations only signal that this is a non-read, non-destructive, non-idempotent action. The description adds substantial behavior: the 200 MB cap, plan-gated payment_required failure, validation_error for unsupported media, invalid_image for corrupted files, and the exact recovery instruction to re-encode the original bytes.

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

Conciseness5/5

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

The description is dense but efficiently organized: purpose first, then usage routing, then exclusivity constraint, return fields, and failure modes. Every sentence conveys actionable information without redundancy.

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 tool with no output schema, five parameters, and failure-prone upload behavior, the description covers invocation conditions, parameter exclusivity, return format, file size limits, plan gating, and error recovery. Nothing essential is missing for correct use.

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

Parameters5/5

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

Schema coverage is 100%, so parameters are already documented, but the description adds meaning beyond the schema: exclusivity of content_base64 versus source_url, the requirement that videos be uploaded assets, practical MIME inference context, and the server behavior for source_url (no redirects, private hosts refused). It also documents the return fields no output schema provides.

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?

States a specific verb and resource: 'Upload an image or video to PinBridge and get an asset_id for create_pin.' The purpose is unmistakable and distinguishes this upload step from descendant pin-creation tools.

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?

Gives explicit when-to-use conditions ('generated in this session or Pinterest cannot fetch it from a public URL'), an explicit alternative ('otherwise pass image_url to create_pin directly'), and a hard constraint ('Provide exactly one of content_base64 or source_url'). This fully routes an agent to the correct tool.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedlist_pinterest_accounts1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_pinterest_accountsOutput",
        -  "type": "object"
        -}New value: +null
  2. 1 tool update
    • Addeddelete_asset
  3. 2 tool updates
    • Changedget_account_analytics1 field changed
      • addedInput schema / properties / include_daily
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "false: return only the range totals, with an empty daily list. Use it when the totals are all you need, e.g. over 90 days. Default: true.",
        +  "title": "Include Daily"
        +}
    • Changedget_pin_analytics1 field changed
      • addedInput schema / properties / include_daily
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "false: return only the range totals, with an empty daily list. Use it when the totals are all you need, e.g. over 90 days. Default: true.",
        +  "title": "Include Daily"
        +}
  4. 2 tool updates
    • Changedcreate_board1 field changed
      • changedInput schema / properties / privacy / description
        Previous value: -"\"PUBLIC\" (default) or \"SECRET\"."New value: +"\"PUBLIC\" (default) or \"SECRET\". SECRET needs the account to be connected with Pinterest's boards:write_secret permission; older connections fail with scope_missing until reconnected."
    • Changedupdate_board1 field changed
      • changedInput schema / properties / privacy / description
        Previous value: -"\"PUBLIC\" or \"SECRET\"."New value: +"\"PUBLIC\" or \"SECRET\". SECRET needs the boards:write_secret permission; older connections fail with scope_missing until reconnected."
  5. 3 tool updates
    • Changedget_account_analytics2 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"Inclusive end, YYYY-MM-DD. Default: today. Ranges are capped at 90 days."New value: +"Inclusive end, YYYY-MM-DD. Default: today. Up to 366 days from stored history, 90 days when read live from Pinterest."
      • addedInput schema / properties / source
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "auto",
        +        "stored",
        +        "live"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Where to read from. auto (default): PinBridge's nightly stored history when it covers the range, else Pinterest. stored: history only (up to 366 days). live: always ask Pinterest (up to 90 days, counts against the read limit).",
        +  "title": "Source"
        +}
    • Changedget_pin_analytics2 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"Inclusive end, YYYY-MM-DD. Default: today. Ranges are capped at 90 days."New value: +"Inclusive end, YYYY-MM-DD. Default: today. Up to 366 days from stored history, 90 days when read live from Pinterest."
      • addedInput schema / properties / source
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "auto",
        +        "stored",
        +        "live"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Where to read from. auto (default): PinBridge's nightly stored history when it covers the range, else Pinterest. stored: history only (up to 366 days). live: always ask Pinterest (up to 90 days, counts against the read limit).",
        +  "title": "Source"
        +}
    • Changedlist_pins3 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": "summary",
        +  "description": "summary (default): the fields needed to find, audit and count pins. full: the whole pin, including description, alt text and media URLs; about three times larger, so prefer get_pin for one pin.",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "title": "Detail",
        +  "type": "string"
        +}
      • addedInput schema / properties / removed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "true: only published pins that were later deleted on Pinterest; false: leave them out. Default: both.",
        +  "title": "Removed"
        +}
      • changedOutput schema / properties / items / description
        Previous value: -"Pins on this page in the requested order, each with id, title, board_id, pinterest_account_id, status, error_code, error_message, pinterest_pin_id, image_url, link_url, created_at and published_at. Empty when nothing matches."New value: +"Pins on this page in the requested order. With detail=summary each has id, title, status, board_id, pinterest_account_id, pinterest_pin_id, link_url, error_code, error_message, created_at, published_at and removed_from_pinterest_at (set when the pin was deleted on Pinterest). detail=full returns every pin field. Empty when nothing matches."
  6. 3 tool updates
    • Addedget_dashboard_summary
    • Changedlist_pins12 fields changed
      • changedInput schema / properties / offset / description
        Previous value: -"Rows to skip for pagination."New value: +"Rows to skip. For the next page pass offset + limit from the last result."
      • addedInput schema / properties / q
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 200,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Case-insensitive text to find in the title, description or link URL; % and _ match literally.",
        +  "title": "Q"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "default": "created_at_desc",
        +  "description": "Order: created_at, published_at (unpublished last), title or status, each _asc or _desc.",
        +  "enum": [
        +    "created_at_desc",
        +    "created_at_asc",
        +    "published_at_desc",
        +    "published_at_asc",
        +    "title_asc",
        +    "title_desc",
        +    "status_asc",
        +    "status_desc"
        +  ],
        +  "title": "Sort",
        +  "type": "string"
        +}
      • addedOutput schema / description
        Added value: +"One page of list_pins results plus the total number of matching pins."
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "true when more rows follow: call again with the same filters, q and sort and offset = offset + limit. When total is null it only means this page was full.",
        +  "title": "Has More",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / items
        Added value: +{
        +  "description": "Pins on this page in the requested order, each with id, title, board_id, pinterest_account_id, status, error_code, error_message, pinterest_pin_id, image_url, link_url, created_at and published_at. Empty when nothing matches.",
        +  "items": {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  "title": "Items",
        +  "type": "array"
        +}
      • addedOutput schema / properties / limit
        Added value: +{
        +  "description": "Page size used for this call.",
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Rows skipped before this page.",
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "items": {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  "title": "Result",
        -  "type": "array"
        -}
      • addedOutput schema / properties / total
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "How many rows match the filters and search across all pages. Answer \"how many ...?\" from this; limit=1 is enough. Null only when the PinBridge API is older than 1.34.",
        +  "title": "Total"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "items",
        +  "total",
        +  "limit",
        +  "offset",
        +  "has_more"
        +]
      • changedOutput schema / title
        Previous value: -"list_pinsOutput"New value: +"PinListPage"
    • Changedlist_schedules12 fields changed
      • changedInput schema / properties / offset / description
        Previous value: -"Rows to skip for pagination."New value: +"Rows to skip. For the next page pass offset + limit from the last result."
      • addedInput schema / properties / q
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 200,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Case-insensitive text to find in the title, description or link URL; % and _ match literally.",
        +  "title": "Q"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "default": "run_at_desc",
        +  "description": "Order: run_at, created_at, title or status, each _asc or _desc. run_at_asc lists the next run first.",
        +  "enum": [
        +    "run_at_desc",
        +    "run_at_asc",
        +    "created_at_desc",
        +    "created_at_asc",
        +    "title_asc",
        +    "title_desc",
        +    "status_asc",
        +    "status_desc"
        +  ],
        +  "title": "Sort",
        +  "type": "string"
        +}
      • addedOutput schema / description
        Added value: +"One page of list_schedules results plus the total number of matching schedules."
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "true when more rows follow: call again with the same filters, q and sort and offset = offset + limit. When total is null it only means this page was full.",
        +  "title": "Has More",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / items
        Added value: +{
        +  "description": "Schedules on this page in the requested order, each with id, pinterest_account_id, run_at, status, payload (board_id, title, media), pin_id once it ran, last_error, created_at and updated_at. Empty when nothing matches.",
        +  "items": {
        +    "additionalProperties": true,
        +    "type": "object"
        +  },
        +  "title": "Items",
        +  "type": "array"
        +}
      • addedOutput schema / properties / limit
        Added value: +{
        +  "description": "Page size used for this call.",
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Rows skipped before this page.",
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / result
        Removed value: -{
        -  "items": {
        -    "additionalProperties": true,
        -    "type": "object"
        -  },
        -  "title": "Result",
        -  "type": "array"
        -}
      • addedOutput schema / properties / total
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "How many rows match the filters and search across all pages. Answer \"how many ...?\" from this; limit=1 is enough. Null only when the PinBridge API is older than 1.34.",
        +  "title": "Total"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "items",
        +  "total",
        +  "limit",
        +  "offset",
        +  "has_more"
        +]
      • changedOutput schema / title
        Previous value: -"list_schedulesOutput"New value: +"ScheduleListPage"
  7. 2 tool updates
    • Addedupdate_board
    • Addedupdate_schedule
  8. 26 tool updates
    • Changedcancel_schedule1 field changed
      • addedInput schema / properties / schedule_id / description
        Added value: +"UUID of the schedule, from list_schedules or create_schedule."
    • Changedcheck_board_access3 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / board_id / description
        Added value: +"Pinterest board ID (numeric string), from list_boards."
      • addedInput schema / properties / fresh / description
        Added value: +"true bypasses the cached verdict and asks Pinterest again."
    • Changedcreate_board4 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / description / description
        Added value: +"Board description."
      • addedInput schema / properties / name / description
        Added value: +"Board name, unique within the account, <= 180 characters."
      • addedInput schema / properties / privacy / description
        Added value: +"\"PUBLIC\" (default) or \"SECRET\"."
    • Changedcreate_pin16 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / alt_text / description
        Added value: +"Accessibility text for the image, <= 500 characters."
      • addedInput schema / properties / asset_id / description
        Added value: +"UUID of an uploaded PinBridge asset, from upload_asset."
      • addedInput schema / properties / board_id / description
        Added value: +"Pinterest board ID (numeric string), from list_boards."
      • addedInput schema / properties / cover_image_asset_id / description
        Added value: +"Uploaded image asset UUID used as the video cover."
      • addedInput schema / properties / cover_image_url / description
        Added value: +"Public cover image URL; video pins only."
      • changedInput schema / properties / description / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 800,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / description / description
        Added value: +"Pin description, at most 800 characters."
      • addedInput schema / properties / dominant_color / description
        Added value: +"Hex color of the image, e.g. \"#FF5733\"."
      • addedInput schema / properties / dry_run / description
        Added value: +"true runs every API check (account, board, media, quota, rate headroom) and returns the resolved payload without publishing anything."
      • addedInput schema / properties / idempotency_key / description
        Added value: +"Unique key so a retry never duplicates the pin. Generated when omitted, in which case a repeat call publishes again; reuse the key on retries."
      • addedInput schema / properties / image_url / description
        Added value: +"Public URL of the image or video; Pinterest must be able to fetch it."
      • addedInput schema / properties / link_url / description
        Added value: +"Destination URL opened when the pin is clicked."
      • addedInput schema / properties / related_terms / description
        Added value: +"Keywords that improve discoverability."
      • addedInput schema / properties / title / description
        Added value: +"Pin title, at most 100 characters."
      • addedInput schema / properties / title / maxLength
        Added value: +100
    • Changedcreate_pins_batch1 field changed
      • addedInput schema / properties / pins / description
        Added value: +"Up to 100 pins, each with the same fields as create_pin."
    • Changedcreate_schedule13 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / asset_id / description
        Added value: +"UUID of an uploaded PinBridge asset, from upload_asset."
      • addedInput schema / properties / board_id / description
        Added value: +"Pinterest board ID (numeric string), from list_boards."
      • addedInput schema / properties / cover_image_asset_id / description
        Added value: +"Uploaded image asset UUID used as the video cover."
      • addedInput schema / properties / cover_image_url / description
        Added value: +"Public cover image URL; video pins only."
      • changedInput schema / properties / description / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 800,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / description / description
        Added value: +"Pin description, at most 800 characters."
      • addedInput schema / properties / dry_run / description
        Added value: +"true runs every API check (account, board, media, quota, rate headroom) and returns the resolved payload without publishing anything."
      • addedInput schema / properties / image_url / description
        Added value: +"Public URL of the image or video; Pinterest must be able to fetch it."
      • addedInput schema / properties / link_url / description
        Added value: +"Destination URL opened when the pin is clicked."
      • addedInput schema / properties / run_at / description
        Added value: +"Publish time as ISO 8601 with timezone, in the future, e.g. \"2026-04-01T10:00:00Z\"."
      • addedInput schema / properties / title / description
        Added value: +"Pin title, at most 100 characters."
      • addedInput schema / properties / title / maxLength
        Added value: +100
    • Changedcreate_webhook5 fields changed
      • addedInput schema / properties / events / description
        Added value: +"Event names to deliver; any of \"pin.published\", \"pin.failed\"."
      • addedInput schema / properties / is_enabled / description
        Added value: +"false registers the endpoint without sending deliveries yet."
      • addedInput schema / properties / secret / description
        Added value: +"Shared secret of at least 16 characters used to sign deliveries (HMAC-SHA256 in X-PinBridge-Signature)."
      • addedInput schema / properties / secret / minLength
        Added value: +16
      • addedInput schema / properties / url / description
        Added value: +"Public endpoint that receives POSTed events."
    • Changeddelete_board2 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / board_id / description
        Added value: +"Pinterest board ID (numeric string), from list_boards."
    • Changeddelete_pin2 fields changed
      • addedInput schema / properties / delete_from_pinterest / description
        Added value: +"true (default) also removes the published pin from Pinterest; false keeps it live there and only deletes the PinBridge record."
      • addedInput schema / properties / pin_id / description
        Added value: +"UUID of the pin, from list_pins or create_pin."
    • Changeddelete_schedule1 field changed
      • addedInput schema / properties / schedule_id / description
        Added value: +"UUID of the schedule, from list_schedules or create_schedule."
    • Changeddelete_webhook1 field changed
      • addedInput schema / properties / webhook_id / description
        Added value: +"UUID of the webhook, from list_webhooks."
    • Changedget_account_analytics4 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / end_date / description
        Added value: +"Inclusive end, YYYY-MM-DD. Default: today. Ranges are capped at 90 days."
      • addedInput schema / properties / metrics / description
        Added value: +"Comma-separated Pinterest metric types, e.g. IMPRESSION,SAVE,PIN_CLICK,OUTBOUND_CLICK. Default: the organic engagement set."
      • addedInput schema / properties / start_date / description
        Added value: +"Inclusive start, YYYY-MM-DD. Default: 30 days ago."
    • Changedget_pin1 field changed
      • addedInput schema / properties / pin_id / description
        Added value: +"UUID of the pin, from list_pins or create_pin."
    • Changedget_pin_analytics4 fields changed
      • addedInput schema / properties / end_date / description
        Added value: +"Inclusive end, YYYY-MM-DD. Default: today. Ranges are capped at 90 days."
      • addedInput schema / properties / metrics / description
        Added value: +"Comma-separated Pinterest metric types, e.g. IMPRESSION,SAVE,PIN_CLICK,OUTBOUND_CLICK. Default: the organic engagement set."
      • addedInput schema / properties / pin_id / description
        Added value: +"UUID of the pin, from list_pins or create_pin."
      • addedInput schema / properties / start_date / description
        Added value: +"Inclusive start, YYYY-MM-DD. Default: 30 days ago."
    • Changedget_rate_meter1 field changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
    • Changedget_schedule1 field changed
      • addedInput schema / properties / schedule_id / description
        Added value: +"UUID of the schedule, from list_schedules or create_schedule."
    • Changedlist_activity_logs9 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Action name, e.g. \"pin.publish_failed\"."
      • addedInput schema / properties / category / description
        Added value: +"Category, e.g. \"publishing\", \"configuration\"."
      • addedInput schema / properties / cursor / description
        Added value: +"next_cursor from the previous page."
      • addedInput schema / properties / limit / description
        Added value: +"Entries per page."
      • addedInput schema / properties / limit / maximum
        Added value: +200
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / resource_type / description
        Added value: +"Resource kind, e.g. \"pin\", \"schedule\", \"board\"."
      • addedInput schema / properties / since / description
        Added value: +"ISO 8601 timestamp; only entries after this time."
      • addedInput schema / properties / status / description
        Added value: +"Outcome: \"success\", \"failed\", \"queued\", \"canceled\"."
    • Changedlist_boards1 field changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
    • Changedlist_pins11 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / board_id / description
        Added value: +"Pinterest board ID (numeric string), from list_boards."
      • addedInput schema / properties / error_code / description
        Added value: +"Only failed pins with this error code, e.g. board_access_denied."
      • addedInput schema / properties / limit / description
        Added value: +"Page size, 1-200."
      • addedInput schema / properties / limit / maximum
        Added value: +200
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / description
        Added value: +"Rows to skip for pagination."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • addedInput schema / properties / since / description
        Added value: +"ISO 8601 timestamp with timezone; lower bound, inclusive."
      • addedInput schema / properties / status / description
        Added value: +"One of queued, deferred, publishing, published, failed."
      • addedInput schema / properties / until / description
        Added value: +"ISO 8601 timestamp with timezone; upper bound, exclusive."
    • Changedlist_related_terms3 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / exact_match / description
        Added value: +"true keeps only groups whose term exactly matches a seed."
      • addedInput schema / properties / terms / description
        Added value: +"One seed term, a comma-separated string, or a list of terms."
    • Changedlist_schedules10 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"UUID of a connected Pinterest account, from list_pinterest_accounts."
      • addedInput schema / properties / board_id / description
        Added value: +"Pinterest board ID (numeric string), from list_boards."
      • addedInput schema / properties / limit / description
        Added value: +"Page size, 1-200."
      • addedInput schema / properties / limit / maximum
        Added value: +200
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / offset / description
        Added value: +"Rows to skip for pagination."
      • addedInput schema / properties / offset / minimum
        Added value: +0
      • addedInput schema / properties / since / description
        Added value: +"ISO 8601 timestamp with timezone; lower bound, inclusive."
      • addedInput schema / properties / status / description
        Added value: +"One of scheduled, queued, deferred, running, done, failed, canceled."
      • addedInput schema / properties / until / description
        Added value: +"ISO 8601 timestamp with timezone; upper bound, exclusive."
    • Changedretry_pin3 fields changed
      • addedInput schema / properties / account_id / description
        Added value: +"Pinterest account to publish with instead of the original one."
      • addedInput schema / properties / board_id / description
        Added value: +"Board to publish to instead of the original one, from list_boards."
      • addedInput schema / properties / pin_id / description
        Added value: +"UUID of the pin, from list_pins or create_pin."
    • Changedretry_schedule1 field changed
      • addedInput schema / properties / schedule_id / description
        Added value: +"UUID of the schedule, from list_schedules or create_schedule."
    • Changedupdate_pin8 fields changed
      • addedInput schema / properties / alt_text / description
        Added value: +"New accessibility text, <= 500 characters."
      • addedInput schema / properties / board_id / description
        Added value: +"Pinterest board ID (numeric string), from list_boards."
      • changedInput schema / properties / description / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 800,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / description / description
        Added value: +"Pin description, at most 800 characters."
      • addedInput schema / properties / link_url / description
        Added value: +"Destination URL opened when the pin is clicked."
      • addedInput schema / properties / pin_id / description
        Added value: +"UUID of the pin, from list_pins or create_pin."
      • changedInput schema / properties / title / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 100,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / title / description
        Added value: +"Pin title, at most 100 characters."
    • Changedupdate_webhook5 fields changed
      • addedInput schema / properties / events / description
        Added value: +"Replacement event list, e.g. [\"pin.published\", \"pin.failed\"]."
      • addedInput schema / properties / is_enabled / description
        Added value: +"false pauses deliveries, true resumes them."
      • addedInput schema / properties / secret / description
        Added value: +"New signing secret, at least 16 characters."
      • addedInput schema / properties / url / description
        Added value: +"New endpoint URL."
      • addedInput schema / properties / webhook_id / description
        Added value: +"UUID of the webhook, from list_webhooks."
    • Changedupload_asset5 fields changed
      • addedInput schema / properties / asset_type / description
        Added value: +"Kind of media being uploaded."
      • addedInput schema / properties / content_base64 / description
        Added value: +"Base64-encoded file bytes (data: prefix allowed)."
      • addedInput schema / properties / content_type / description
        Added value: +"MIME type, e.g. \"image/png\"; inferred when omitted."
      • addedInput schema / properties / filename / description
        Added value: +"File name with extension, e.g. \"hero.png\"."
      • addedInput schema / properties / source_url / description
        Added value: +"Public http(s) URL the server downloads instead of content_base64; no redirects, private hosts are refused."
  9. 3 tool updates
    • Addeddelete_schedule
    • Addedretry_schedule
    • Addedupdate_webhook
  10. 15 tool updates
    • Addedcheck_board_access
    • Changedcreate_board1 field changed
      • changedInput schema / properties / privacy / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "PUBLIC",
        +      "SECRET"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedcreate_pin1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": false,
        +  "title": "Dry Run",
        +  "type": "boolean"
        +}
    • Addedcreate_pins_batch
    • Changedcreate_schedule2 fields changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": false,
        +  "title": "Dry Run",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / idempotency_key
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Idempotency Key"
        -}
    • Addedcreate_webhook
    • Addeddelete_pin
    • Addeddelete_webhook
    • Addedget_account_analytics
    • Addedget_pin_analytics
    • Changedlist_pins6 fields changed
      • addedInput schema / properties / account_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Account Id"
        +}
      • addedInput schema / properties / board_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Board Id"
        +}
      • addedInput schema / properties / error_code
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Error Code"
        +}
      • addedInput schema / properties / since
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Since"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Status"
        +}
      • addedInput schema / properties / until
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Until"
        +}
    • Changedlist_schedules4 fields changed
      • addedInput schema / properties / account_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Account Id"
        +}
      • addedInput schema / properties / board_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Board Id"
        +}
      • addedInput schema / properties / since
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Since"
        +}
      • addedInput schema / properties / until
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Until"
        +}
    • Addedretry_pin
    • Addedupdate_pin
    • Addedupload_asset
  11. 17 tool updates
    • First observedcancel_schedule
    • First observedcreate_board
    • First observedcreate_pin
    • First observedcreate_schedule
    • First observeddelete_board
    • First observedget_billing_status
    • First observedget_pin
    • First observedget_rate_meter
    • First observedget_schedule
    • First observedlist_activity_logs
    • First observedlist_boards
    • First observedlist_pins
    • First observedlist_pinterest_accounts
    • First observedlist_related_terms
    • First observedlist_schedules
    • First observedlist_webhooks
    • First observedserver_info

Publisher details

Operator
Pinbridge · Publisher source
Vendor relationship
Not available
Restrictions
Free Playground plan is enough to connect and use the tools. Requires a PinBridge account and at least one connected Pinterest account. API calls are subject to monthly plan quotas (paid plans from $9/mo raise limits and add bulk imports/media assets). No admin approval, regional restrictions, or custom OAuth app needed, authentication is built-in OAuth 2.1 with Dynamic Client Registration, or a PinBridge API key. · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    A guarded remote MCP bridge for publishing original Pinterest Pins, with dry-run safety, pin preview, board listing, and bounded batch publishing.
    30 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage Pinterest boards and pins, create and update pins, and track analytics via the Pinterest API v5.
    4
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A minimal MCP server for the Pinterest API v5 that reads boards, pins, and analytics and publishes new pins and boards, with human sign-off required before any public changes.
    8
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources