Composway Docs
Tool reference

Optimize article

Start an asynchronous optimization job for an article in a campaign.

Tool name: optimize_article

Cost: Free - not billed, and does not draw on a plan quota.

Writes data - confirmation required

This tool creates or changes data. It is not annotated readOnlyHint, so your MCP client prompts you before it runs, and the server asks for an explicit confirmation describing exactly what will change. Declining cancels the call cleanly.

Start an asynchronous optimization job for an article in a campaign. optimizeType may be entity, authoritative_source, or full. The completed result includes the optimized article and its new score.

Returns immediately with { jobId, status, kind, result, error }. This tool does not return the optimized article inline at queue time. After calling it, use get_evaluation_result({ jobId }) to poll the job about every 5 seconds while status is "queued" or "running". If status is "completed", read result. If status is "failed", read error. Optimize jobs are never cached. Do not call optimize_article again just to poll.

Parameters

ParameterTypeRequiredNotes
articlestringYes-
optimizeType"entity" | "authoritative_source" | "full"Yes-
campaignIdstring (uuid)Yes-
workspaceIdstring (uuid)Yes-
targetAiPromptIdstring (uuid)No-
Full input JSON Schema
{
	"$schema": "https://json-schema.org/draft/2020-12/schema",
	"type": "object",
	"properties": {
		"article": {
			"type": "string"
		},
		"optimizeType": {
			"type": "string",
			"enum": ["entity", "authoritative_source", "full"]
		},
		"campaignId": {
			"type": "string",
			"format": "uuid",
			"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
		},
		"workspaceId": {
			"type": "string",
			"format": "uuid",
			"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
		},
		"targetAiPromptId": {
			"type": "string",
			"format": "uuid",
			"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
		}
	},
	"required": ["article", "optimizeType", "campaignId", "workspaceId"]
}

Response

Full output JSON Schema
{
	"$schema": "https://json-schema.org/draft/2020-12/schema",
	"type": "object",
	"properties": {
		"jobId": {
			"type": "string",
			"format": "uuid",
			"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
		},
		"status": {
			"type": "string"
		},
		"kind": {
			"type": "string"
		},
		"cached": {
			"type": "boolean"
		},
		"result": {
			"anyOf": [
				{
					"type": "object",
					"propertyNames": {
						"type": "string"
					},
					"additionalProperties": {}
				},
				{
					"type": "null"
				}
			]
		},
		"error": {
			"anyOf": [
				{
					"type": "string"
				},
				{
					"type": "null"
				}
			]
		}
	},
	"required": ["jobId", "status", "kind"],
	"additionalProperties": false
}

On this page