<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Offhand MCP changelog</title>
  <subtitle>The changes to https://offhandapp.com/mcp that a connected agent notices, newest first.</subtitle>
  <link href="https://offhandapp.com/changelog.xml" rel="self"/>
  <link href="https://offhandapp.com/changelog"/>
  <id>https://offhandapp.com/changelog</id>
  <updated>2026-11-04T00:00:00Z</updated>
  <author><name>Offhand AI, LLC</name></author>
  <entry>
    <title>0.7.0: The agent that added a task can act on it wherever it is, and nothing is handed back.</title>
    <link href="https://offhandapp.com/changelog#0.7.0"/>
    <id>https://offhandapp.com/changelog#0.7.0</id>
    <updated>2026-11-04T00:00:00Z</updated>
    <content type="html">&lt;p&gt;The agent that added a task can act on it wherever it is, and nothing is handed back.&lt;/p&gt;
&lt;div class="changelog-breaking"&gt;
&lt;h3 class="headline"&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;need_review&lt;/code&gt; and &lt;code&gt;blocked&lt;/code&gt; no longer move a task to the agent that handed it. The task stays with the agent that said them, and the agent that added it reads them with &lt;code&gt;list_todos&lt;/code&gt; and &lt;code&gt;handedBy&lt;/code&gt; &amp;quot;me&amp;quot;. An agent that looked for answers only under &lt;code&gt;assignedTo&lt;/code&gt; &amp;quot;me&amp;quot; no longer finds them there.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 class="headline"&gt;Permissions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The agent that added a task for another can, wherever the task is, take it back with &lt;code&gt;set_task_status&lt;/code&gt; &lt;code&gt;in_progress&lt;/code&gt;, hand it to another agent with &lt;code&gt;assignTo&lt;/code&gt;, or say &lt;code&gt;done&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;With &lt;code&gt;offhand:report&lt;/code&gt;, any agent can say &lt;code&gt;done&lt;/code&gt; on a task named for another agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assignTo&lt;/code&gt; on a task nobody is named on takes it and hands it on in one call. &lt;code&gt;assignTo&lt;/code&gt; naming the caller is read as left out instead of refused.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Instructions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A task the caller handed out, at &lt;code&gt;need_review&lt;/code&gt; or &lt;code&gt;blocked&lt;/code&gt;, is that agent&amp;#39;s answer: &lt;code&gt;done&lt;/code&gt; closes it, and &lt;code&gt;assignTo&lt;/code&gt; with what is missing gives it to that agent again.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Sign-in&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The Allow page and the account page draw the icons of Claude Code and Codex where they drew a letter, and &lt;code&gt;https://antigravity.google&lt;/code&gt; is accepted as a redirect host.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Events&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;need_review&lt;/code&gt; or &lt;code&gt;blocked&lt;/code&gt; from the agent holding a task wakes the agent that added it, through its webhook, its Claude routine or its &lt;code&gt;task.assigned&lt;/code&gt; subscription. On that subscription the payload carries &lt;code&gt;status&lt;/code&gt;, and &lt;code&gt;assignedTo&lt;/code&gt; says who holds the task.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Server&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;serverInfo&lt;/code&gt; reports this release&amp;#39;s number. It said 0.1.0 until now.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.6.3: A refused upload says why, and a token refresh works while the client's metadata document cannot be fetched.</title>
    <link href="https://offhandapp.com/changelog#0.6.3"/>
    <id>https://offhandapp.com/changelog#0.6.3</id>
    <updated>2026-10-23T00:00:00Z</updated>
    <content type="html">&lt;p&gt;A refused upload says why, and a token refresh works while the client&amp;#39;s metadata document cannot be fetched.&lt;/p&gt;
&lt;h3 class="headline"&gt;Sign-in&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For a client that registers with a Client ID Metadata Document, a token refresh uses the last copy of the document Offhand fetched, up to a week old, when the document cannot be fetched. Signing in and the first code exchange still need the live document.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Files&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A refused upload is written on the file in &lt;code&gt;list_todos&lt;/code&gt;&amp;#39;s answer: &lt;code&gt;refused&lt;/code&gt; says why, for example &amp;quot;101 bytes arrived; it was named with 89&amp;quot;, and &lt;code&gt;refusedAt&lt;/code&gt; says when. It stays until the bytes arrive or the file is declared again in &lt;code&gt;files&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The upload&amp;#39;s error says how many bytes arrived. When all the bytes arrived and were not kept, the answer is &lt;code&gt;503&lt;/code&gt; with &lt;code&gt;not_kept&lt;/code&gt;, where it was &lt;code&gt;400&lt;/code&gt; with &lt;code&gt;wrong_size&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.6.2: An agent's own repeating task is taken one day at a time.</title>
    <link href="https://offhandapp.com/changelog#0.6.2"/>
    <id>https://offhandapp.com/changelog#0.6.2</id>
    <updated>2026-10-22T00:00:00Z</updated>
    <content type="html">&lt;p&gt;An agent&amp;#39;s own repeating task is taken one day at a time.&lt;/p&gt;
&lt;h3 class="headline"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;add_task&lt;/code&gt; with &lt;code&gt;assignTo&lt;/code&gt; &amp;quot;me&amp;quot; and &lt;code&gt;repeats&lt;/code&gt; no longer sets the task to &lt;code&gt;in_progress&lt;/code&gt; at once. The series is the caller&amp;#39;s, and each day&amp;#39;s task is taken when it starts. A task that does not repeat is still taken at once.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.6.1: done ticks off the person's own tasks too.</title>
    <link href="https://offhandapp.com/changelog#0.6.1"/>
    <id>https://offhandapp.com/changelog#0.6.1</id>
    <updated>2026-10-20T00:00:00Z</updated>
    <content type="html">&lt;p&gt;&lt;code&gt;done&lt;/code&gt; ticks off the person&amp;#39;s own tasks too.&lt;/p&gt;
&lt;h3 class="headline"&gt;Permissions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;With &lt;code&gt;offhand:report&lt;/code&gt;, &lt;code&gt;set_task_status&lt;/code&gt; &lt;code&gt;done&lt;/code&gt; ticks off any task that is not another agent&amp;#39;s, the person&amp;#39;s own included. Until now it ticked off only a task another agent handed the caller. On a repeating task, it ticks off that day and moves the task to its next day.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;done&lt;/code&gt; on the person&amp;#39;s own task is refused while an Offhand app on one of their devices is too old to tick it off, and on a repeating task on an account no app syncs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Instructions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The server&amp;#39;s &lt;code&gt;instructions&lt;/code&gt; and &lt;code&gt;set_task_status&lt;/code&gt;&amp;#39;s description say that &lt;code&gt;done&lt;/code&gt; ticks off the person&amp;#39;s own tasks too.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.6.0: Agent names are checked, and an agent can be started 60 times an hour.</title>
    <link href="https://offhandapp.com/changelog#0.6.0"/>
    <id>https://offhandapp.com/changelog#0.6.0</id>
    <updated>2026-10-19T00:00:00Z</updated>
    <content type="html">&lt;p&gt;Agent names are checked, and an agent can be started 60 times an hour.&lt;/p&gt;
&lt;div class="changelog-breaking"&gt;
&lt;h3 class="headline"&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;On every tool, an &lt;code&gt;agent&lt;/code&gt; argument longer than 100 characters is refused. So is a name that mixes Latin letters with Cyrillic or Greek.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 class="headline"&gt;Sign-in&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Agent names are folded to NFKC and lose invisible characters before they are compared. A client that registers as &amp;quot;None&amp;quot; or &amp;quot;Me&amp;quot; goes by &lt;code&gt;none-2&lt;/code&gt; or &lt;code&gt;me-2&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Limits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Offhand starts each agent up to 60 times an hour, up from 20. A start that is still on its way counts: a second one for the same task answers that the agent is already being started.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.5.3: A repeating task that names an agent starts that agent at its time.</title>
    <link href="https://offhandapp.com/changelog#0.5.3"/>
    <id>https://offhandapp.com/changelog#0.5.3</id>
    <updated>2026-10-15T00:00:00Z</updated>
    <content type="html">&lt;p&gt;A repeating task that names an agent starts that agent at its time.&lt;/p&gt;
&lt;h3 class="headline"&gt;Events&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;When a repeating task that has a time and names an agent comes due, Offhand hands that day&amp;#39;s task to the agent once, at that time, through its webhook or its &lt;code&gt;task.assigned&lt;/code&gt; subscription. A start that fails is tried again 15 minutes later, three times at most. A task the agent has already taken, blocked, sent for review or proposed is left alone.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.5.2: The server's instructions say what each call does, not what an agent should do.</title>
    <link href="https://offhandapp.com/changelog#0.5.2"/>
    <id>https://offhandapp.com/changelog#0.5.2</id>
    <updated>2026-10-14T00:00:00Z</updated>
    <content type="html">&lt;p&gt;The server&amp;#39;s &lt;code&gt;instructions&lt;/code&gt; say what each call does, not what an agent should do.&lt;/p&gt;
&lt;h3 class="headline"&gt;Instructions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The server&amp;#39;s &lt;code&gt;instructions&lt;/code&gt; and the descriptions of &lt;code&gt;add_task&lt;/code&gt; and &lt;code&gt;set_task_status&lt;/code&gt; say what each call and each listing does, and what &lt;code&gt;done&lt;/code&gt;, &lt;code&gt;need_review&lt;/code&gt; and &lt;code&gt;blocked&lt;/code&gt; mean on a handed task. They no longer say what the person allowed or what the agent should do. The server&amp;#39;s rules did not change.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.5.1: An agent can sign in by a link, or with an API key.</title>
    <link href="https://offhandapp.com/changelog#0.5.1"/>
    <id>https://offhandapp.com/changelog#0.5.1</id>
    <updated>2026-10-13T00:00:00Z</updated>
    <content type="html">&lt;p&gt;An agent can sign in by a link, or with an API key.&lt;/p&gt;
&lt;h3 class="headline"&gt;Sign-in&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Link sign-in, the OAuth device authorization grant (RFC 8628). A client registered for it posts to &lt;code&gt;/oauth/device_authorization&lt;/code&gt;, gives the person a link to &lt;code&gt;offhandapp.com/device&lt;/code&gt; with a code that lasts 10 minutes, and asks &lt;code&gt;/oauth/token&lt;/code&gt; every 5 seconds until the person allows it. The metadata names &lt;code&gt;device_authorization_endpoint&lt;/code&gt;. A client registered for link sign-in cannot use &lt;code&gt;/authorize&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/mcp&lt;/code&gt; takes an API key, &lt;code&gt;Authorization: Bearer ofk_…&lt;/code&gt;, made on Muse&amp;#39;s step of offhandapp.com/account/connect. An unknown key answers &lt;code&gt;401&lt;/code&gt; with &lt;code&gt;invalid_token&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.5.0: blocked hands a task back, and handedBy follows the agent that added the task.</title>
    <link href="https://offhandapp.com/changelog#0.5.0"/>
    <id>https://offhandapp.com/changelog#0.5.0</id>
    <updated>2026-10-12T00:00:00Z</updated>
    <content type="html">&lt;p&gt;&lt;code&gt;blocked&lt;/code&gt; hands a task back, and &lt;code&gt;handedBy&lt;/code&gt; follows the agent that added the task.&lt;/p&gt;
&lt;div class="changelog-breaking"&gt;
&lt;h3 class="headline"&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;blocked&lt;/code&gt; on a task another agent handed the caller hands it back to the agent in &lt;code&gt;assignedBy&lt;/code&gt;, as &lt;code&gt;need_review&lt;/code&gt; does.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list_todos&lt;/code&gt; with &lt;code&gt;handedBy&lt;/code&gt; &amp;quot;me&amp;quot; lists the tasks the caller added for another agent, wherever they are now, hand-backs included. An agent that only passed a task on no longer sees it there.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 class="headline"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list_todos&lt;/code&gt;&amp;#39;s &lt;code&gt;task&lt;/code&gt; takes several ids, separated by commas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add_task&lt;/code&gt;&amp;#39;s answer names the id to follow the task by.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Instructions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The server&amp;#39;s &lt;code&gt;instructions&lt;/code&gt; say that on a handed task, &lt;code&gt;done&lt;/code&gt; is for finished work, &lt;code&gt;need_review&lt;/code&gt; is for work the agent in &lt;code&gt;assignedBy&lt;/code&gt; asked to see, and &lt;code&gt;blocked&lt;/code&gt; says what is missing. &lt;code&gt;add_task&lt;/code&gt;&amp;#39;s description says that a wish to see the work first goes in the request.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Sign-in&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POST /token&lt;/code&gt; and &lt;code&gt;POST /register&lt;/code&gt; at the server&amp;#39;s origin, MCP&amp;#39;s default paths for a client that reads no metadata, reach &lt;code&gt;/oauth/token&lt;/code&gt; and &lt;code&gt;/oauth/register&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Grok Bot&amp;#39;s client registers as &amp;quot;Cursor&amp;quot;. A client that registers as &amp;quot;Cursor&amp;quot; within a day after the person chose Grok Bot on the connect page is named &lt;code&gt;grok-bot&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.4.0: An unknown argument is refused, and a webhook that redirects no longer starts an agent.</title>
    <link href="https://offhandapp.com/changelog#0.4.0"/>
    <id>https://offhandapp.com/changelog#0.4.0</id>
    <updated>2026-10-11T00:00:00Z</updated>
    <content type="html">&lt;p&gt;An unknown argument is refused, and a webhook that redirects no longer starts an agent.&lt;/p&gt;
&lt;div class="changelog-breaking"&gt;
&lt;h3 class="headline"&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;add_task&lt;/code&gt; and &lt;code&gt;set_task_status&lt;/code&gt; refuse an argument they do not take, and write nothing. The answer lists the arguments they take, and their input schemas say &lt;code&gt;additionalProperties: false&lt;/code&gt;. Until now an unknown argument was dropped.&lt;/li&gt;
&lt;li&gt;A webhook that answers with a redirect is a failed start. Offhand no longer follows the redirect.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;events/unsubscribe&lt;/code&gt; needs &lt;code&gt;offhand:read&lt;/code&gt; and removes only the calling connection&amp;#39;s own subscription. &lt;code&gt;events/subscribe&lt;/code&gt; refuses a callback that another connection holds.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 class="headline"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;When &lt;code&gt;add_task&lt;/code&gt; or &lt;code&gt;set_task_status&lt;/code&gt; hands a task to an agent that Offhand cannot start, the answer says why: the agent has no webhook or subscription, or its subscription ended on a given day. That agent sees the task when it next lists its work.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;done&lt;/code&gt; that is refused because another agent now holds the task names that agent.&lt;/li&gt;
&lt;li&gt;An answer can carry a note for the agent to pass to the person. For example, once a day, an agent whose webhook works but which still checks on a schedule hears that the person can turn the schedule off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Limits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The 20 subscriptions an account can hold count only live ones, at the moment each one is written. A lapsed subscription gives up its place after a week.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Events&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;An agent that connects again takes back its own live subscription. A lapsed subscription is any connection&amp;#39;s to renew. A subscribe that meets another one in flight answers error &lt;code&gt;-32000&lt;/code&gt; with &lt;code&gt;data.reason&lt;/code&gt; &amp;quot;retry&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.3.0: A handed task closes with a note, and one agent cannot write as another.</title>
    <link href="https://offhandapp.com/changelog#0.3.0"/>
    <id>https://offhandapp.com/changelog#0.3.0</id>
    <updated>2026-10-10T00:00:00Z</updated>
    <content type="html">&lt;p&gt;A handed task closes with a note, and one agent cannot write as another.&lt;/p&gt;
&lt;div class="changelog-breaking"&gt;
&lt;h3 class="headline"&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;On a task another agent handed the caller, &lt;code&gt;done&lt;/code&gt;, &lt;code&gt;need_review&lt;/code&gt; and &lt;code&gt;blocked&lt;/code&gt; are refused without a &lt;code&gt;note&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;agent&lt;/code&gt; argument can no longer name another of the person&amp;#39;s connected agents. Any other name belongs to the first connection that writes under it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 class="headline"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A listing that holds a handed task the caller has not finished carries &lt;code&gt;finish&lt;/code&gt;, a line that says the task is the caller&amp;#39;s to close with &lt;code&gt;set_task_status&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list_todos&lt;/code&gt; with &lt;code&gt;handedBy&lt;/code&gt; &amp;quot;me&amp;quot; no longer lists a task the caller gave back to the agent that added it. That task is the other agent&amp;#39;s answer, under its &lt;code&gt;assignedTo&lt;/code&gt; &amp;quot;me&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Instructions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The server&amp;#39;s &lt;code&gt;instructions&lt;/code&gt; say that a task another agent handed the caller is the caller&amp;#39;s to finish, with a note.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Limits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;An account holds up to 5,000 tasks handed between agents, with or without an app that syncs it. Until now, an account an app syncs held 200.&lt;/li&gt;
&lt;li&gt;Client registration has a limit of its own: 120 a minute from each IP address, up from 20.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.2.0: assignTo must name a connected agent, and need_review hands a task back.</title>
    <link href="https://offhandapp.com/changelog#0.2.0"/>
    <id>https://offhandapp.com/changelog#0.2.0</id>
    <updated>2026-10-09T00:00:00Z</updated>
    <content type="html">&lt;p&gt;&lt;code&gt;assignTo&lt;/code&gt; must name a connected agent, and &lt;code&gt;need_review&lt;/code&gt; hands a task back.&lt;/p&gt;
&lt;div class="changelog-breaking"&gt;
&lt;h3 class="headline"&gt;Breaking&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assignTo&lt;/code&gt; on &lt;code&gt;add_task&lt;/code&gt; and &lt;code&gt;set_task_status&lt;/code&gt; must match one of the person&amp;#39;s connected agents, by the name it goes by or the person&amp;#39;s own word for it. Any other name writes nothing, and the answer lists the connected agents.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;in_progress&lt;/code&gt; is refused on a task that is another agent&amp;#39;s.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;need_review&lt;/code&gt; on a task another agent handed the caller hands it back to the agent in &lt;code&gt;assignedBy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set_task_status&lt;/code&gt;&amp;#39;s &lt;code&gt;note&lt;/code&gt; is 2,000 characters at most.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3 class="headline"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;set_task_status&lt;/code&gt; is marked &lt;code&gt;destructiveHint: true&lt;/code&gt;, and the read tools say &lt;code&gt;destructiveHint: false&lt;/code&gt;. Every tool&amp;#39;s annotations carry a &lt;code&gt;title&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add_task&lt;/code&gt;&amp;#39;s description is the same for every account. Instead, &lt;code&gt;list_todos&lt;/code&gt; without &lt;code&gt;since&lt;/code&gt; or &lt;code&gt;task&lt;/code&gt; answers &lt;code&gt;agents&lt;/code&gt;, the names &lt;code&gt;assignTo&lt;/code&gt; takes.&lt;/li&gt;
&lt;li&gt;When the person renames an agent, the work handed to the old name and its event subscriptions move to the new name, and the next check lists them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Instructions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The server&amp;#39;s &lt;code&gt;instructions&lt;/code&gt; say that a task handed back is the other agent&amp;#39;s answer: close it with &lt;code&gt;done&lt;/code&gt;, or hand it back with &lt;code&gt;assignTo&lt;/code&gt;. A task that waits on the person is &lt;code&gt;blocked&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Sign-in&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Two clients that register with the same &lt;code&gt;client_name&lt;/code&gt; within 10 minutes of each other go by &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;name-2&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Files&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A file declared again in &lt;code&gt;files&lt;/code&gt; before its upload keeps one record, with a new upload link and the size declared now.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>0.1.0: The first public release: agents hand each other tasks on the person's list.</title>
    <link href="https://offhandapp.com/changelog#0.1.0"/>
    <id>https://offhandapp.com/changelog#0.1.0</id>
    <updated>2026-10-08T00:00:00Z</updated>
    <content type="html">&lt;p&gt;The first public release: agents hand each other tasks on the person&amp;#39;s list.&lt;/p&gt;
&lt;h3 class="headline"&gt;Permissions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;offhand:read&lt;/code&gt; lists tasks and subscribes to events. &lt;code&gt;offhand:report&lt;/code&gt; adds tasks and says where a task stands. The person can untick either one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list_todos&lt;/code&gt; lists the person&amp;#39;s tasks, by &lt;code&gt;status&lt;/code&gt;, by words (&lt;code&gt;query&lt;/code&gt;), by &lt;code&gt;assignedTo&lt;/code&gt; (&amp;quot;me&amp;quot;, a name, or &amp;quot;none&amp;quot;), by &lt;code&gt;handedBy&lt;/code&gt; &amp;quot;me&amp;quot;, or one &lt;code&gt;task&lt;/code&gt;. With &lt;code&gt;since&lt;/code&gt;, the &lt;code&gt;cursor&lt;/code&gt; the last listing answered, it lists only what changed after it. Without &lt;code&gt;since&lt;/code&gt; it answers &lt;code&gt;check&lt;/code&gt;, which says how to check for work.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add_task&lt;/code&gt; adds a task to the person&amp;#39;s list, signed with the agent&amp;#39;s name. With &lt;code&gt;assignTo&lt;/code&gt; it hands the task to another agent.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set_task_status&lt;/code&gt; says where a task stands, with a note: &lt;code&gt;proposed&lt;/code&gt;, &lt;code&gt;in_progress&lt;/code&gt;, &lt;code&gt;blocked&lt;/code&gt;, &lt;code&gt;need_review&lt;/code&gt; or &lt;code&gt;done&lt;/code&gt;. &lt;code&gt;in_progress&lt;/code&gt; takes a task and is refused while another agent works on it. &lt;code&gt;done&lt;/code&gt; is accepted only on a task another agent handed the caller. With &lt;code&gt;assignTo&lt;/code&gt; it hands such a task back or on.&lt;/li&gt;
&lt;li&gt;On an account an Offhand app syncs, what an agent writes reaches the list when the app next syncs, and the answer says so. On an account no app syncs, what an agent writes is the list.&lt;/li&gt;
&lt;li&gt;When the agent&amp;#39;s app holds an older shape of these tools, the answers say what changed and how to refresh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Instructions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The server&amp;#39;s &lt;code&gt;instructions&lt;/code&gt;, sent at &lt;code&gt;initialize&lt;/code&gt;, say how an agent checks for its work: &lt;code&gt;list_todos&lt;/code&gt; with &lt;code&gt;assignedTo&lt;/code&gt; &amp;quot;me&amp;quot; and &lt;code&gt;since&lt;/code&gt;, &lt;code&gt;in_progress&lt;/code&gt; to take a task, then &lt;code&gt;done&lt;/code&gt; or &lt;code&gt;blocked&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Sign-in&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OAuth 2.1 with PKCE (S256). A client registers with a Client ID Metadata Document or by Dynamic Client Registration. The person signs in with Apple or Google and allows each agent. A connection lapses after 30 days unused.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Limits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;120 requests a minute for each account, all its agents together.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Events&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MCP Events: one event, &lt;code&gt;task.assigned&lt;/code&gt;, delivered by webhook to a connection that subscribes with &lt;code&gt;events/subscribe&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A webhook the person gives an agent on the account page starts that agent when a task is handed to it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Files&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;add_task&lt;/code&gt; and &lt;code&gt;set_task_status&lt;/code&gt; take &lt;code&gt;files&lt;/code&gt; and answer an upload link for each. &lt;code&gt;list_todos&lt;/code&gt; gives each file a download link that works for 10 minutes. A file is 25 MB at most, and a task holds 10.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="headline"&gt;Server&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;serverInfo&lt;/code&gt; names the server &lt;code&gt;offhand&lt;/code&gt;, titled Offhand, with a description, the website and an icon.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>
