Skip to main content
Glama

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).

Tool call template

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

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

Input Schema

NameRequiredDescriptionDefault
site_idNoWhich help center to act on: an id from helpcenter_list_sites. Needed when this connection reaches more than one help center; omit it when it reaches one. Applies to this call only — pass it on every call of a task, and ask the user which help center they mean if their request does not say.
articlesYesArticles to create or upsert. Give each one an `external_id` so replaying the batch updates rather than duplicates.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Well beyond the annotations, the description discloses the write-scoped key requirement (403 otherwise), conditional idempotency via external_id including the upsert semantics ('what exists is updated, what is missing is created'), the shared image-download time budget across items, and that a partly-failed batch is the normal outcome. It enumerates the per-item error taxonomy (validation_error, invalid_argument, capability_forbidden, publication_forbidden, external_id_busy, persist_failed) with the recovery action for each. The destructiveHint=true and idempotentHint=false annotations are consistent with this: the tool can overwrite existing articles and is only replayable when external_id is supplied.

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?

It is long, but for a 50-item bulk mutation with a per-item error model the length is mostly earned, and the Args/Returns/Errors layout is front-loaded and scannable. The main redundancy is re-listing every item field that the schema already documents complete with descriptions.

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 carries the return contract itself, and it does: HTTP 207, the per-item result shape, meta counters, the images sub-object with rehosted/reused/failed, the truncation caveat on failed, and the warning that index is the only reliable way to match outcomes because successes do not echo external_id at the top level. Nothing an agent needs to interpret a partial batch is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description still adds meaning: it notes rehost_images is per item and ON by default with one shared download budget, that title is the only required field while the rest mirror helpcenter_create_article, and that external_id is strongly recommended so retries update rather than duplicate. The field enumeration largely repeats the schema, which caps this below 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 opening sentence gives a specific verb and resource ('Create or upsert many articles in one request') and immediately distinguishes this tool from the sibling that does the same job one at a time ('instead of calling helpcenter_create_article in a loop'). An agent can choose between the batch and single-article paths 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?

It states the intended scenarios (imports and migrations), the hard batching rule (at most 50 per call, split larger imports), and the recovery pattern (replay a batch that died halfway). It also routes the agent to an alternative when the primary path is blocked: on 'publication_forbidden', stage the change with helpcenter_stage_article_changes against error.staged_endpoint.

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