Create and update Azure DevOps work items

flurryport:azure-devops-managedeliveryv1first-partysha256:39abe40076a0Needs: read/write agent token

Create and update Azure DevOps work items in one batched pipe: priority, state, tags, and sprint included.

Create and update Azure DevOps work items through the org-level batch endpoint. One fire carries many sub-requests: an entry with an id updates that work item, an entry without one creates a new item of the given type (Task by default). Each entry carries its own JSON Patch ops, so the same pipe sets priority, state, tags, and iteration path with no field-specific target. The org and project are fixed at install; the PAT is the secret, entered in the browser as an HTTP Basic credential. This pipe writes. Anyone who can post to its capture URL can change work items in your project, so endpoint signing is required posture for this recipe; set_endpoint_signing is the tool that turns it on, and get_endpoint answers whether it is already on. Choose your scope. The azure-devops family is a ladder. File only: azure-devops-workitem on its own, which runs on the free Deckhand tier and fits a developer logging bugs without leaving the code. Read: azure-devops-query plus azure-devops-read, which needs two pipe slots and a plan that stores full response bodies (Bosun), runs on a PAT scoped Work Items (Read) when nothing else in the family is installed, and fits a developer checking their own assignments or a manager checking team progress. Manage: those two plus azure-devops-manage, which needs three pipe slots (First Mate) and a PAT scoped Work Items (Read & write), for a PM or QA grooming the whole backlog.

The credential never enters the model context: it lives in the FlurryPORT secret store, deliveries are signed server-side, and every send returns a receipt your agent can quote.

Install with your agent

npx flurryport mcp

Point your agent at the FlurryPORT MCP server (npx flurryport mcp) and ask it for the flurryport:azure-devops-manage recipe. Works from AI clients that can run a local process: desktop apps and terminal agents. Web-only chat clients cannot reach a local MCP server; open a desktop client instead.

Tools your agent gains

flry_azure_devops_manage
Create and update Azure DevOps work items in the configured org and project, many per fire. Input: items (required), each entry an object with ops (required JSON Patch array), id (present to update, absent to create), and type (create only, defaults to Task). Per-item results arrive on the replay execution, read them with get_replay_execution.

Setup walkthrough

  1. AZURE_DEVOPS_PAT: In Azure DevOps: User settings, Personal access tokens, New Token, scope Work Items (Read & write). This recipe writes, so a read-only token will not do. The value to paste in the FlurryPORT secret page is the HTTP Basic credential, NOT the raw token: run `printf ':YOUR_PAT' | base64` and paste the result. The recipe sends it as `Authorization: Basic <value>`. A raw PAT answers 401, or 203 with a sign-in page.

Intent schema

{
  "type": "object",
  "required": [
    "items"
  ],
  "properties": {
    "items": {
      "type": "array",
      "minItems": 1,
      "description": "One entry per work item. Entries with an id update; entries without one create.",
      "items": {
        "type": "object",
        "required": [
          "ops"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "description": "Work item id to update. Omit it to create a new work item instead."
          },
          "type": {
            "type": "string",
            "description": "Work item type for a create entry, such as Task, Bug, or User Story. Omit it and the entry creates a Task. Ignored on entries that carry an id."
          },
          "ops": {
            "type": "array",
            "minItems": 1,
            "description": "JSON Patch operations against /fields/..., for example {\"op\": \"add\", \"path\": \"/fields/Microsoft.VSTS.Common.Priority\", \"value\": 3}.",
            "items": {
              "type": "object",
              "required": [
                "op",
                "path"
              ],
              "properties": {
                "op": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "value": {}
              }
            }
          }
        }
      }
    }
  }
}

Install-time parameters

org
install-time: Azure DevOps organization.
project
install-time: Project within the organization. The batch URL is org-level, so this value is inlined into the transformation instead: creates address /PROJECT/_apis/wit/workitems/$Type, updates address the item directly.

Transformation

[$body.items.{ "method": "PATCH", "uri": ($exists(id) ? "/_apis/wit/workItems/" & $string(id) : "/" & $install.project & "/_apis/wit/workitems/$" & ($exists(type) ? type : "Task")) & "?api-version=7.1", "headers": { "Content-Type": "application/json-patch+json" }, "body": [ops] }]

Delivery target

POST https://dev.azure.com/$install.org/_apis/wit/$batch?api-version=7.1

Placeholders like $secrets.NAME resolve server-side at delivery, never in the agent.

Gotchas

Where this fits

Related recipes

flurryport:azure-devops-querydelivery

Query Azure DevOps work items with WIQL and read the matching ids back, without your AI ever holding the PAT.

flurryport:azure-devops-readdelivery

Read fields for a batch of Azure DevOps work items by id: title, state, tags, priority, iteration.

flurryport:azure-devops-workitemdelivery

Let your AI file Azure DevOps work items (bugs, tasks) the model never holds credentials for.

flurryport:github-create-issuedelivery

Let your AI file GitHub issues with a fine-grained PAT it never touches.

flurryport:jira-create-issuedelivery

Let your AI file Jira Cloud issues with an API token it never touches.

flurryport:linear-create-issuedelivery

Let your AI file Linear issues with an API key it never touches.