Skip to main content
Glama

HelpCenter.io for agents

Bulk Create HelpCenter Articles

helpcenter_bulk_create_articles
Destructive

Create or upsert many articles in one request. Use this for imports and migrations instead of calling helpcenter_create_article in a loop. Send at most 50 articles per call; split a larger import into batches of 50.

Requires a write-scoped API key. Give every item an external_id: the batch is then replayable, so a run that dies halfway can simply be sent again — what exists is updated, what is missing is created, and nothing is duplicated.

Args:

  • articles (array, required, 1-50): each item takes the same fields as helpcenter_create_article (title required, plus content, slug, category_id, categories, type, visibility, published, external_id, content_format, rehost_images). rehost_images is per item, ON by default through this connector, and all items share one image-download time budget.

Returns: HTTP 207 — { status: "success", results: [...], meta: { total, created, updated, failed } }, one result per item in the order sent. A success is { index, status: "created" | "updated", article, images }. images summarises the external images found in its content: { rehosted, reused, failed: [{ src, reason }], failed_count }, where rehosted counts the images copied into the help center, reused the ones it already held, and failed_count the ones that could not be copied; failed lists their source and reason, and on a very long list stops short of failed_count. The article is saved even when failed_count is above 0, so check it. images is absent when the item had no content or rehost_images was false. A failure is { index, status: "error", external_id, error: { code, message } }. index is the item's position in your articles array: match outcomes to items by index, because a success does not echo external_id at the top level (it is article.external_id). A partly-failed batch is the NORMAL result, not an exception: check meta.failed and read every result whose status is "error" rather than assuming success. One bad item never discards the work of the rest.

Errors: 403 if the key is read-scoped or your role cannot create articles. Otherwise items fail individually, and error.code says why:

  • "validation_error": the item was refused as sent; error.errors lists the problem with each field.

  • "invalid_argument": a value the site cannot take, such as a language that is not enabled for it.

  • "capability_forbidden": your role cannot do what the item asks (publish it, file it in a category, set its visibility, or write to an article it cannot see); error.capability names the permission and error.message the reason.

  • "publication_forbidden": the item's external_id belongs to a published article and your role cannot publish; stage the change with helpcenter_stage_article_changes for the article in error.staged_endpoint instead.

  • "external_id_busy": that key already belongs to a different live article.

  • "persist_failed": the save failed on the server; send the item again (safe when it has an external_id).

Input Schema

NameRequiredDescriptionDefault
articlesYesArticles to create or upsert. Give each one an `external_id` so replaying the batch updates rather than duplicates.
agent_keyYesThe api_key helpcenter_create_help_center returned for this help center, exactly as returned. Required on every call: this endpoint has no sign-in, so the key is how each call says which help center it acts on. It is sent to HelpCenter.io as this call's credential and nowhere else, and it is never shown again: keep it for the whole task, and never show it to the user or write it into content.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses the 50-item cap, the HTTP 207 partial-success model, the per-item result shape, the shared image-download time budget, and a full error-code taxonomy (validation_error, invalid_argument, capability_forbidden, publication_forbidden, external_id_busy, persist_failed) with remediation for each. The description's claim that external_id makes a batch replayable is conditional idempotency, not a contradiction of idempotentHint=false (which holds when no external_id is supplied); destructiveHint=true is consistent with upserts overwriting existing articles.

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?

Well front-loaded and organized into purpose, Args, Returns, and Errors sections, with the critical 'a partly-failed batch is NORMAL' warning emphasized. It is long, and the Args paragraph partly re-enumerates field names (content, slug, category_id, categories, type, visibility, published...) that the schema already documents, which is mild 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 bulk mutation tool with no output schema, the description supplies what is needed to call and interpret it safely: the batch limit, the 207 envelope, the per-item success/failure shapes, image rehost reporting, and how to handle each error code. Nothing material about calling the tool or reading its response is left to guesswork.

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 already 100%, but the description still adds meaning the schema cannot: match outcomes to items by index because success does not echo external_id at the top level (it lives at article.external_id), external_id enables safe replay after a half-finished run, and rehost_images is on by default per item within one shared time budget. These are genuine usage-level semantics, not restatements.

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?

Opens with a specific verb+resource+scope: 'Create or upsert many articles in one request', and explicitly contrasts itself with the sibling helpcenter_create_article in a loop. An agent can pick this over the single-article tool without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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

Names the exact use case (imports and migrations), the alternative it replaces (helpcenter_create_article in a loop), and a hard operational rule (max 50 per call, split larger imports into batches of 50). Also states the 403 prerequisite of a write-scoped key and a role that can create articles.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources