ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block

Read the talk

ACP: The Universal Remote Control for AI Agents

Selected presentation frame from ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block at 508 seconds
ACP: The Universal Remote Control for AI Agents

Alex Hancock explains how the Agent Client Protocol lets different applications drive the same harness, and how remote transports could make clients, harnesses, tools, and models independently placeable.

From a talk by Alex Hancock

At a glance

Ideas worth remembering

  • ACP supplies the client-to-harness interface for assigning work and receiving updates; MCP supplies connectivity from agents to external tools and data.

  • Sessions can carry user messages, multimodal replies, tool-call notifications, and permission requests, giving clients information to display during work.

  • Zed and Poolside AI's terminal client drive the same Goose agent through one harness-side ACP implementation, demonstrating a change of interface without replacing the agent.

  • Remote ACP, remote MCP, and model endpoints make the placement of clients, harnesses, tools, and models independently configurable.

  • Underscore-prefixed custom methods allow experimentation; repeated patterns across projects can inform additions to the shared protocol.

A good harness can still trap you in one application

An agent harness may offer useful capabilities while leaving you only one application that can control it. Alex Hancock, a software engineer at Block, encounters this problem through his work on Goose, an open-source harness that began inside Block and was donated to the Linux Foundation. He also maintains the Rust SDK for the Model Context Protocol, or MCP. His opening joke about not implementing MCP tasks—blaming his own laziness—sets a practical tone: standards need people to implement them before they help users.

Selected presentation frame from ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block at 178 seconds
A good harness can still trap you in one application

The problem is the bespoke interface between an application and its harness. When each harness expects its own way of receiving instructions and returning updates, client software must accommodate those differences. In the worst case Hancock describes, exactly one client can drive a particular harness. His web analogy makes the cost familiar: imagine needing a different browser for every website. The choice of underlying service would also dictate the interface you use.

MCP supplies a useful precedent on the other side of the agent. It gives agents a shared way to call tools, read resources, and act in external systems. Hancock locates its greatest strength in adoption: many servers become useful to many agents because they share the protocol. The missing counterpart is a shared way for client software to assign work to an agent and receive updates about that work.

0:120:43
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:12 · section reference included

One editor implementation, many harnesses

The Agent Client Protocol, or ACP, emerged from the Zed and JetBrains teams. Their immediate need was straightforward: build one high-quality agent client inside an editor, then use that implementation with different harnesses. Sending tasks, receiving results, and showing which files an agent edits should not require a separate client implementation for every harness. 3:12

Selected presentation frame from ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block at 216 seconds
One editor implementation, many harnesses

Goose's team saw room to use the same interface beyond editors. ACP has relatively few editor-specific features, so the application controlling an agent could take another form. The architectural decision is to keep the client-to-harness conversation general enough that a terminal, desktop application, or other client can express work and display progress without becoming an editor.

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

3:12 · section reference included

Sessions carry work, progress, and permission requests

An ACP interaction starts with a connection between a client and a harness, with capabilities associated with that connection. The client can then create sessions and send user messages within them. Those messages may originate from a person typing into an application or from client software acting on its own. Sessions give the subsequent replies and updates a place in the interaction.

Selected presentation frame from ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block at 276 seconds
Sessions carry work, progress, and permission requests

The return path carries several kinds of information:

  • Content: The agent can respond with text, images, or audio.
  • Tool activity: A tool-call notification identifies the tool and supplies metadata about the call, allowing the client to show what the agent is doing as work proceeds.
  • Permission requests: The harness can send a request that the client presents to the user as a decision about whether a tool call should proceed.

This gives the client more to render than a final answer. It can make ongoing work visible and bring a user into a decision when permission is needed.

ACP uses JSON-RPC messages and permits custom methods with an underscore prefix. That extension convention lets projects add behavior beyond the shared protocol. Hancock's proposed path to standardization begins with actual use: if different client and harness projects develop similar extensions, those recurring needs can become candidates for the protocol itself.

The tradeoff is between a common implementation and room to experiment. A custom method creates space for a project-specific feature; moving a useful pattern into the shared protocol makes it available through a common interface. Extensions therefore supply evidence for future design decisions, while the base protocol supplies the interoperability that clients can already build around.

4:124:42
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

4:12 · section reference included

The same HTML project, through Zed and a terminal

The first demonstration follows one small task through two interfaces. In Zed, Hancock asks Goose to explain a project containing a single HTML file. Zed sends the request through Goose's ACP interface. Goose returns text and tool-call information describing what it read and did, then identifies the single-file project and explains it. The client displays both the activity and the resulting explanation. 6:12

Next, a terminal-based client from Poolside AI receives the same request in the same project. It connects to the same agent, displays text and a tool call, and streams a summary. The observable change is the application presenting the interaction: an editor gives way to a terminal, while Goose continues to handle the work through one harness-side ACP implementation.

Both clients communicate locally over standard I/O. The demonstration makes the separation concrete: the client sends the task and renders the updates; Goose performs the agent work and emits those updates through its common interface. Changing clients preserves that division of responsibility, so the terminal does not need to become a second implementation of Goose's agent loop.

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:12 · section reference included

Remote transport makes four components movable

Local standard I/O connects applications on one machine, but cloud-hosted harnesses need a network path. When Goose's team joined the ACP work, the protocol lacked remote support. They specified an HTTP transport with a WebSocket upgrade. At the time of the recording, this transport was just landing; the design kept the messages and protocol semantics the same while changing how they traveled. 7:13

Selected presentation frame from ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block at 546 seconds
Remote transport makes four components movable

Where does each protocol sit, and which component must move with which? The topology below answers that question. Goose's model of the stack has four parts: a client, a harness implementing the tool-calling loop, the tools, and the model. ACP joins the client to the harness. MCP commonly joins the harness to tools. Model endpoints supply another network connection. The harness sits at the junction of these relationships; the tools and model are separate participants rather than steps downstream of the client interface.

Once each connection can cross a network, placement becomes a choice for each component. All four could run on the same machine. The harness could run elsewhere while the client stays local. Alternatively, only the tools or only the model could be remote. The transport work matters because a common message format alone does not provide these deployment choices: the connections also need a way to reach another machine.

A final demonstration uses a client Hancock built the previous night to ask Goose to write a poem. This client reaches the same process over the network, although both still run on his machine. It demonstrates the network transport rather than a cloud deployment. A container or cloud-hosted harness is the proposed next placement; the attraction is that the messages and client library remain the same when switching between local and remote communication.

How it fits togetherThree connections around the harness

User-facing application or headless software that sends work and receives updates.

Remote transports let the client, harness, tools, and model occupy different machines while preserving their roles.

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

7:13 · section reference included

Let clients compete on the experience

The closing invitation is to build clients or add ACP support to harnesses. Hancock describes an emerging range of editors, desktop applications, mobile applications, and terminal clients. His suggested uses extend that variety:

  • Personal clients: An interface tailored to how one person wants to orchestrate agents.
  • Business clients: Applications organized around a particular domain or company's needs.
  • White-label clients: A customized interface that works with multiple harnesses through the common protocol.
Selected presentation frame from ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block at 582 seconds
Let clients compete on the experience

The intended incentive follows from being able to switch. If a client fails to meet a user's needs, interoperability gives that user another place to go while retaining access to compatible harnesses. Client developers then have a reason to compete on interaction quality. Hancock expects this market to improve the experience of using AI; that remains a forecast dependent on adoption and useful alternatives, rather than an outcome established by the demonstrations.

9:139:43
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

9:13 · section reference included

Resources

  • A subsequent proposal linked by Hancock for reconnecting and resuming ACP connections to cloud-hosted agents. It extends the remote-transport topic beyond the recording's same-machine network demonstration.

Read the complete timestamped transcript
  1. 0:01

    [music]

  2. 0:12

    >> Hey everybody.

  3. 0:13

    Um

  4. 0:14

    my name's Alex Hancock. Today I'm going

  5. 0:16

    to talk about a universal remote control

  6. 0:18

    for AI.

  7. 0:19

    And before I start, I just want to say

  8. 0:20

    the previous speaker said that MCP

  9. 0:21

    client maintainers haven't implemented

  10. 0:23

    support for tasks because they're smart.

  11. 0:25

    I'm an MCP client maintainer. I can tell

  12. 0:27

    you it's just because I'm lazy. I

  13. 0:29

    haven't done it.

  14. 0:30

    Um

  15. 0:32

    Okay. So, a little bit about me before

  16. 0:34

    we start. I am a software engineer at

  17. 0:36

    Block, which is the parent company of

  18. 0:38

    Cash App and Square and Title. We have a

  19. 0:41

    few different things going on now. Um

  20. 0:43

    and I've worked there for a long time. I

  21. 0:44

    worked on Square product stuff and Cash

  22. 0:46

    App stuff, but I've been doing open

  23. 0:47

    source AI for the last couple years.

  24. 0:49

    Specifically, I work on this open source

  25. 0:51

    harness project called Goose, which

  26. 0:54

    started as an internal project at Block.

  27. 0:57

    Yeah, some Goose fans out there. And

  28. 0:59

    then uh yeah, we open sourced it and we

  29. 1:01

    donated it to the Linux Foundation. So,

  30. 1:03

    now the IP is there, but we still lots

  31. 1:05

    of us from Block still work on it.

  32. 1:07

    Um I'm also a maintainer of MCP, the

  33. 1:10

    Model Context Protocol. I work on the

  34. 1:12

    Rust SDK for that project. And more

  35. 1:15

    recently, I've also started some work on

  36. 1:18

    ACP, the Agent Client Protocol, which is

  37. 1:20

    what I'm going to talk about today.

  38. 1:23

    So, I think I think we have an issue

  39. 1:25

    with harnesses that I want to I want to

  40. 1:27

    try to put to you all today,

  41. 1:29

    uh propose to you all today as a problem

  42. 1:31

    and then and then recommend a a

  43. 1:33

    solution.

  44. 1:34

    So, what I've been noticing recently

  45. 1:37

    is that we've got lots of great

  46. 1:38

    harnesses out there, right? There are

  47. 1:40

    ones from the labs, there are one from

  48. 1:42

    ones from different companies, there's

  49. 1:43

    lots of open standards-based ones.

  50. 1:45

    Um but I noticed that the interface to

  51. 1:47

    them

  52. 1:48

    is often custom or bespoke. And in in

  53. 1:51

    the worst case, it's like you might have

  54. 1:53

    some harnesses where there's literally

  55. 1:54

    only one client application you can use

  56. 1:56

    to control that harness, right? And I

  57. 2:00

    think this has a couple issues with it,

  58. 2:01

    but the analogy that I'll make with the

  59. 2:03

    web is it would be like if you had to

  60. 2:06

    use one browser or a

  61. 2:08

    one given protocol to connect to a to

  62. 2:11

    every website, right? That just wouldn't

  63. 2:12

    work. You wouldn't have something like

  64. 2:14

    the open web if if that were the reality

  65. 2:17

    with browsers. And so I think we can do

  66. 2:19

    better.

  67. 2:20

    And the thing about standards by finding

  68. 2:22

    a standard and the thing about standards

  69. 2:24

    is that they create ecosystems and

  70. 2:26

    markets.

  71. 2:27

    And I would argue that in the agentic AI

  72. 2:30

    space, we have a good standard for the

  73. 2:33

    agent going out and doing things, right?

  74. 2:36

    Calling tools, taking actions in other

  75. 2:38

    systems, reading resources, reading

  76. 2:40

    data. We've all benefited as a community

  77. 2:42

    from having MCP.

  78. 2:44

    Right? And the most powerful thing about

  79. 2:46

    MCP is not anything about MCP itself,

  80. 2:50

    but it's that everyone uses MCP.

  81. 2:52

    And that's why we have, you know,

  82. 2:53

    thousands or tens of thousands of

  83. 2:55

    servers around the world and all the

  84. 2:57

    agents can connect to them and go and do

  85. 2:59

    things in those other systems.

  86. 3:02

    I would say that we don't yet have a

  87. 3:04

    good solution or a standard for client

  88. 3:08

    software to tell agents what to do.

  89. 3:11

    Giving it tasks, telling it what to work

  90. 3:13

    on and getting updates.

  91. 3:15

    And so

  92. 3:17

    I'm going to put forward an option today

  93. 3:19

    that I think is a good option that that

  94. 3:21

    we on our team have been working on and

  95. 3:23

    we think is a good a good solution in

  96. 3:25

    the open standards space.

  97. 3:27

    And this is ACP, so agent client

  98. 3:29

    protocol

  99. 3:30

    is the name of this project and it came

  100. 3:32

    from the editor companies. It came from

  101. 3:34

    like if you've used the Zed text editor

  102. 3:37

    or you've used any of JetBrains

  103. 3:39

    products, the Zed folks and the

  104. 3:40

    JetBrains JetBrains folks teamed up and

  105. 3:43

    proposed a standard for

  106. 3:45

    um clients to be able to control

  107. 3:47

    harnesses. And it makes sense if you put

  108. 3:48

    yourself in their shoes, right? What

  109. 3:49

    they wanted to be able to do is write a

  110. 3:52

    single high quality client

  111. 3:53

    implementation in an editor, maybe in

  112. 3:55

    Zed or in IntelliJ or something like

  113. 3:57

    that, and be able to control any harness

  114. 4:00

    by with that single client

  115. 4:02

    implementation, sending tasks, getting

  116. 4:04

    results back,

  117. 4:06

    seeing what files are being edited, etc.

  118. 4:08

    It makes a ton of sense if you put

  119. 4:09

    yourself in their shoes, right? But we

  120. 4:11

    saw this on the Goose team, and we think

  121. 4:14

    that there is a much broader utility

  122. 4:16

    than just editors, right? So it's a

  123. 4:19

    it's it's relatively neutral and it

  124. 4:20

    doesn't have many editor specific

  125. 4:22

    features. And so we think that this can

  126. 4:23

    can go to a be spread to a wider range

  127. 4:27

    of client software.

  128. 4:28

    To go into a little bit more depth about

  129. 4:31

    ACP's design and and what you can do

  130. 4:32

    with it,

  131. 4:34

    it lets you establish connections

  132. 4:36

    between clients and agent harnesses that

  133. 4:39

    have a given

  134. 4:40

    a set of capabilities associated with

  135. 4:42

    the the connection, and then you can

  136. 4:45

    make sessions. Within sessions, you can

  137. 4:47

    send user messages, the things that a

  138. 4:49

    user is maybe typing into the app or

  139. 4:51

    that the client software wants to send.

  140. 4:53

    The agent can then respond to those with

  141. 4:56

    text,

  142. 4:57

    uh more images or audio, text, etc., or

  143. 5:00

    updates about what's going on. So like,

  144. 5:02

    if a tool is called, it can send a tool

  145. 5:04

    call notification and explain what tool

  146. 5:06

    was called and what the metadata was.

  147. 5:08

    Um and it can also send things like

  148. 5:10

    permission requests, so that if the

  149. 5:12

    client software needs to show the user,

  150. 5:14

    you know, "Should I do this tool call?

  151. 5:16

    Yes or no?" It can go over this uh

  152. 5:19

    this protocol. And it's it's pretty

  153. 5:21

    simple in its design. Uh it uses JSON

  154. 5:24

    RPC messages, and the thing we like

  155. 5:26

    about it most is that it's extensible as

  156. 5:28

    well, so you're not limited to just

  157. 5:29

    what's in the vanilla protocol. You can

  158. 5:32

    add custom methods. So the

  159. 5:34

    the convention is you put an underscore,

  160. 5:37

    and then you start to put your custom

  161. 5:38

    methods. And the thing I like about this

  162. 5:40

    is that if enough harness projects or

  163. 5:42

    client projects adopt this,

  164. 5:44

    we can start to see what we're all doing

  165. 5:45

    that's the same,

  166. 5:47

    right? Like if the Codex team has some

  167. 5:49

    custom methods, the Goose team has some

  168. 5:50

    custom methods,

  169. 5:52

    uh the client team has some custom

  170. 5:53

    methods, whoever, we can see what

  171. 5:55

    emerges in the in the ecosystem and what

  172. 5:58

    makes sense to get on a standards track

  173. 6:00

    and bring into the protocol itself so

  174. 6:02

    that this is sort of shaped by usage and

  175. 6:04

    shaped by the community.

  176. 6:06

    Um I'm going to do a demo

  177. 6:08

    of a standard IO version of this. So,

  178. 6:12

    I'm going to open Zed and I just have a

  179. 6:14

    really simple project here

  180. 6:17

    where I'll say, "Tell me about this

  181. 6:19

    project." And so, this is a single HTML

  182. 6:21

    file.

  183. 6:22

    So, you can see I was able to type my

  184. 6:24

    query into Zed and this is the agent in

  185. 6:26

    play here is Goose, so it's using

  186. 6:28

    Goose's ACP interface.

  187. 6:30

    And it's you can see it's like sending

  188. 6:31

    text back, it's sending tool call

  189. 6:33

    information back

  190. 6:35

    um about what it read and what it did

  191. 6:37

    and then it found, you know, that it's a

  192. 6:38

    single HTML file and then explained it.

  193. 6:41

    And I'll do another

  194. 6:42

    I'll do another one. This is one from a

  195. 6:44

    company called Poolside AI.

  196. 6:47

    Uh

  197. 6:48

    I'll say, "Tell me about this project."

  198. 6:50

    In the same project. And so, this is a

  199. 6:52

    terminal-based client getting exactly

  200. 6:54

    the same experience from the same agent,

  201. 6:56

    one implementation on the harness side,

  202. 6:59

    and you can now use any client. Right?

  203. 7:01

    And so, you can see it did the same

  204. 7:02

    thing. It showed me

  205. 7:04

    some text results back, it showed a tool

  206. 7:05

    call, and then it showed a It's it's

  207. 7:07

    streaming in a summary.

  208. 7:09

    Um

  209. 7:10

    So, that's a basic demo showing two

  210. 7:11

    clients talking to the same agent

  211. 7:15

    uh over standard IO locally in this

  212. 7:16

    case.

  213. 7:18

    But local obviously isn't enough, right?

  214. 7:20

    If you want this to take off, you have

  215. 7:21

    to be able to do remote as well. Agents

  216. 7:23

    are going to be running in the cloud.

  217. 7:25

    And so, when we came to this project, we

  218. 7:27

    saw that it did not have remote support

  219. 7:28

    yet. So, we specified an HTTP transport.

  220. 7:32

    There's an HTTP version and there's a

  221. 7:33

    websocket upgrade. And so now, the

  222. 7:36

    messages are the same, the protocol

  223. 7:38

    semantics are the same, but there's a

  224. 7:39

    new transport that is just landing now

  225. 7:41

    that enables remote.

  226. 7:43

    And

  227. 7:45

    the way we think about this on the Goose

  228. 7:47

    team, the agentic stack, is there's sort

  229. 7:48

    of these four important components,

  230. 7:50

    right? You have the client,

  231. 7:52

    which is like the app that the user is

  232. 7:53

    using or a headless app running

  233. 7:55

    somewhere on a machine. There's the

  234. 7:57

    harness, which is the program that

  235. 7:59

    implements the tool calling loop.

  236. 8:01

    There are the tools themselves. This

  237. 8:03

    often MCP. And then there's the model,

  238. 8:05

    right? And if you do a remote transport

  239. 8:08

    for the agent client protocol,

  240. 8:11

    and MCP has remote transport for tool

  241. 8:14

    calling,

  242. 8:15

    and the models have kind of all had

  243. 8:16

    remote endpoints like responses APIs for

  244. 8:19

    a long time. Now you have the

  245. 8:20

    flexibility to move all of these four

  246. 8:22

    components around. They could all be on

  247. 8:24

    the same machine. The harness could be

  248. 8:26

    on a different machine than the client.

  249. 8:28

    Uh the model could be the only thing

  250. 8:30

    that's remote. The tools could be the

  251. 8:32

    only thing that's remote. Uh aligning on

  252. 8:34

    standards and making sure that they have

  253. 8:36

    good transport stories is what's going

  254. 8:38

    to let us move all the pieces of this

  255. 8:40

    agentic stack around.

  256. 8:43

    And I can show a quick demo of this as

  257. 8:45

    well.

  258. 8:46

    So, this is a a client just to show how

  259. 8:49

    easy it is to create clients for this. I

  260. 8:51

    just live-coded this, you know, last

  261. 8:53

    night. And I'll say, "Write a poem." So,

  262. 8:57

    this is again connecting to that same

  263. 8:58

    process on my machine.

  264. 9:01

    Uh in this case I'm running it over the

  265. 9:02

    network, but it's on my machine. It's

  266. 9:03

    connecting and sending Goose

  267. 9:05

    instructions for what to do uh remotely.

  268. 9:08

    So, this could be in a container, could

  269. 9:10

    be up in the cloud, but the messages are

  270. 9:12

    the same and the library you use is the

  271. 9:14

    same. So, you can just switch between

  272. 9:16

    local and remote very, very easily.

  273. 9:19

    Um

  274. 9:21

    So, if you want to get plugged into this

  275. 9:23

    ecosystem, start experimenting with

  276. 9:25

    support, either making your own clients

  277. 9:26

    or adding stuff to harnesses, this is a

  278. 9:29

    this will link you to the agent client

  279. 9:30

    protocol site for

  280. 9:32

    how to get started. There's a number of

  281. 9:34

    clients and and agent servers are out

  282. 9:36

    there. This ranges from editors, desktop

  283. 9:39

    applications, mobile applications,

  284. 9:41

    terminal based things, like there's a

  285. 9:43

    proliferation.

  286. 9:45

    And

  287. 9:46

    I I think the use cases are are are

  288. 9:49

    potentially huge, right? If we if we get

  289. 9:50

    some interoperability going here because

  290. 9:52

    you can have people can make personal

  291. 9:54

    clients that's exactly how you want it

  292. 9:56

    orchestrating your agents. You could

  293. 9:58

    have sort of clients created for certain

  294. 10:00

    business domains or an individual

  295. 10:02

    company or a set of clients from a

  296. 10:05

    company you could customize like a white

  297. 10:07

    label

  298. 10:08

    client have it work with all the

  299. 10:09

    harnesses. And I also think if we make a

  300. 10:11

    new category here,

  301. 10:13

    we're going to see quality of the

  302. 10:15

    clients go up, right? Because any

  303. 10:16

    anytime you get an ecosystem or a

  304. 10:18

    marketplace going and there's many

  305. 10:19

    options,

  306. 10:20

    users can vote with their feet if

  307. 10:22

    clients aren't meeting their needs and

  308. 10:24

    so people will start to compete on the

  309. 10:25

    quality of the user experience and and

  310. 10:27

    like overall I think this should drive

  311. 10:29

    up uh

  312. 10:30

    the user experience of using AI.

  313. 10:33

    That's what I've got today. Thank you

  314. 10:34

    very much. And if you want to chat with

  315. 10:36

    me, find me after or send me an email.

  316. 10:39

    Um happy to get you plugged into this

  317. 10:41

    work.

  318. 10:42

    Thank you.

  319. 10:57

    >> [music]