Skip to content
Median
Esc
↑↓navigate↵open⌘Jpreview
On this page

Tasks

Read, create and move cards on your organization's task board from the CLI, the REST API and MCP.

median tasks create --title "Retry failed exports" --priority high
median tasks status MED-12 in_review

Everybody in the organization can read and move cards. Changing the board settings needs an admin or owner. A MEDIAN_KEY acts as an admin.

Reference a card

Pass Example
The key MED-12. Case does not matter, so med-12 works
The number 12
The id k97a2fh3m1x8p4qv6r2t9w5y
Key rule Detail
Prefix Up to 8 letters or numbers, starting with a letter. Stored in capitals
Default prefix The first three letters or numbers of the organization slug, so acme-support gives ACM. TASK when that does not start with a letter
Numbers Counted per organization from 1. A deleted card’s number is not reused
Changing the prefix Every key on the board changes with it
Field Limit
Title 160 characters. Longer titles are cut. Runs of whitespace become one space
Description 10,000 characters. Longer descriptions are cut
Code Status When
task_not_found 404 No such card, or a key with another prefix. The message names the right one, like “Tasks here are MED-1, MED-2, and so on, so ABC-4 is not one of them.”
title_required 400 The title is empty
not_a_member 400 The assignee is not in the organization
key_prefix_invalid 400 “Use up to eight letters or numbers, starting with a letter.”
signal_not_found 404 Adopting a signal that is not in your organization
already_a_task 409 Adopting a signal that is already a card. The message names the card, like “That is already MED-4.”
not_a_request 409 Declining a card that is not in requests

Columns

Status Holds Its signal becomes
requests What customers asked for, before anybody decided open
planned Agreed, not started planned
in_progress Being worked on in progress
in_review Waiting on a review in review
done Finished, newest first done

A new card goes on top of its column, in planned unless you pass a status. A moved card goes to the bottom of its new column unless you pass place: "top".

Moving a card that came from a signal moves the signal to the matching status. Moving it to done messages everyone who reported it, in the conversation they reported it from. A card with a Linear or GitHub issue moves that issue too.

Endpoints

Endpoint Description
GET /v1/tasks One column, or the whole board. Up to 100 cards
POST /v1/tasks Create a card
GET /v1/tasks/{task} One card, with every commit and pull request on it
PATCH /v1/tasks/{task} Change the title, description, priority, assignee or status
DELETE /v1/tasks/{task} Delete a card. Its tracker issues stay
GET /v1/tasks/requests Open signals not yet on the board. Up to 60
POST /v1/tasks/requests/{id} Put a request on the board
POST /v1/tasks/{task}/decline Decline a request. The card goes and its signal is declined. Nobody is messaged
GET /v1/tasks/settings The prefix, trackers, watched repositories and code switch
PATCH /v1/tasks/settings Change the prefix, the code switch, the GitHub issue repository or the watched repositories. Admins and owners
curl "https://api.median.sh/v1/tasks?status=in_progress" \
  -H "Authorization: Bearer $MEDIAN_KEY"

In a PATCH, null clears the priority or the assignee. An assignee is an email address or a user id.

CLI

median tasks list --status planned --assignee dana@acme.com
median tasks get MED-12
median tasks create --title "Retry failed exports" --file ./notes/exports.md
median tasks status MED-12 in_progress --place top
median tasks priority MED-12 none
median tasks assign MED-12 dana@acme.com
median tasks requests
median tasks adopt <signal id> --status planned
median tasks decline MED-14
median tasks settings --prefix ACME --code off
median tasks settings --issues acme/app --watch acme/app

Every flag is in the CLI reference. Install and sign in with the CLI guide.

MCP

median.tasks is a namespace on the MCP server:

const review = await median.tasks.list({ status: "in_review" });
const stale = review.filter((t) => Date.now() - t.updatedAt > 7 * 864e5);
for (const task of stale) {
  await median.tasks.update({ task: task.key, priority: "high" });
}
return stale.map((t) => t.key);

What moves on its own

When Then
Median is connected to Linear and a team is picked A card gets a Linear issue when it is created, edited or moved while it is in planned, in_progress or in_review. The issue’s state follows the card
A signal with no card moves to planned, in progress, in review or done A card is made in the matching column
A signal with a card moves forward The card moves forward with it. It never moves back, except that reopening the signal sends the card to requests. Declining the signal leaves the card alone

--code off stops commits and pull requests from moving cards.

Was this page helpful?