ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block
Read the talk
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.
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.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
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
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.
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.
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.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
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.
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
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.
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.
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.
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.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
Further reading
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.
Related talks
- Building an ACP-Compatible Agent Live — Bennet Fenner, Zed
A practical next recording for moving from ACP's client–harness separation to building a compatible agent.
- Scaling Agents on Kubernetes with acpx and ACP
Continues the deployment question raised by making the harness remotely reachable.
Read the complete timestamped transcript
- 0:01
[music]
- 0:12
>> Hey everybody.
- 0:13
Um
- 0:14
my name's Alex Hancock. Today I'm going
- 0:16
to talk about a universal remote control
- 0:18
for AI.
- 0:19
And before I start, I just want to say
- 0:20
the previous speaker said that MCP
- 0:21
client maintainers haven't implemented
- 0:23
support for tasks because they're smart.
- 0:25
I'm an MCP client maintainer. I can tell
- 0:27
you it's just because I'm lazy. I
- 0:29
haven't done it.
- 0:30
Um
- 0:32
Okay. So, a little bit about me before
- 0:34
we start. I am a software engineer at
- 0:36
Block, which is the parent company of
- 0:38
Cash App and Square and Title. We have a
- 0:41
few different things going on now. Um
- 0:43
and I've worked there for a long time. I
- 0:44
worked on Square product stuff and Cash
- 0:46
App stuff, but I've been doing open
- 0:47
source AI for the last couple years.
- 0:49
Specifically, I work on this open source
- 0:51
harness project called Goose, which
- 0:54
started as an internal project at Block.
- 0:57
Yeah, some Goose fans out there. And
- 0:59
then uh yeah, we open sourced it and we
- 1:01
donated it to the Linux Foundation. So,
- 1:03
now the IP is there, but we still lots
- 1:05
of us from Block still work on it.
- 1:07
Um I'm also a maintainer of MCP, the
- 1:10
Model Context Protocol. I work on the
- 1:12
Rust SDK for that project. And more
- 1:15
recently, I've also started some work on
- 1:18
ACP, the Agent Client Protocol, which is
- 1:20
what I'm going to talk about today.
- 1:23
So, I think I think we have an issue
- 1:25
with harnesses that I want to I want to
- 1:27
try to put to you all today,
- 1:29
uh propose to you all today as a problem
- 1:31
and then and then recommend a a
- 1:33
solution.
- 1:34
So, what I've been noticing recently
- 1:37
is that we've got lots of great
- 1:38
harnesses out there, right? There are
- 1:40
ones from the labs, there are one from
- 1:42
ones from different companies, there's
- 1:43
lots of open standards-based ones.
- 1:45
Um but I noticed that the interface to
- 1:47
them
- 1:48
is often custom or bespoke. And in in
- 1:51
the worst case, it's like you might have
- 1:53
some harnesses where there's literally
- 1:54
only one client application you can use
- 1:56
to control that harness, right? And I
- 2:00
think this has a couple issues with it,
- 2:01
but the analogy that I'll make with the
- 2:03
web is it would be like if you had to
- 2:06
use one browser or a
- 2:08
one given protocol to connect to a to
- 2:11
every website, right? That just wouldn't
- 2:12
work. You wouldn't have something like
- 2:14
the open web if if that were the reality
- 2:17
with browsers. And so I think we can do
- 2:19
better.
- 2:20
And the thing about standards by finding
- 2:22
a standard and the thing about standards
- 2:24
is that they create ecosystems and
- 2:26
markets.
- 2:27
And I would argue that in the agentic AI
- 2:30
space, we have a good standard for the
- 2:33
agent going out and doing things, right?
- 2:36
Calling tools, taking actions in other
- 2:38
systems, reading resources, reading
- 2:40
data. We've all benefited as a community
- 2:42
from having MCP.
- 2:44
Right? And the most powerful thing about
- 2:46
MCP is not anything about MCP itself,
- 2:50
but it's that everyone uses MCP.
- 2:52
And that's why we have, you know,
- 2:53
thousands or tens of thousands of
- 2:55
servers around the world and all the
- 2:57
agents can connect to them and go and do
- 2:59
things in those other systems.
- 3:02
I would say that we don't yet have a
- 3:04
good solution or a standard for client
- 3:08
software to tell agents what to do.
- 3:11
Giving it tasks, telling it what to work
- 3:13
on and getting updates.
- 3:15
And so
- 3:17
I'm going to put forward an option today
- 3:19
that I think is a good option that that
- 3:21
we on our team have been working on and
- 3:23
we think is a good a good solution in
- 3:25
the open standards space.
- 3:27
And this is ACP, so agent client
- 3:29
protocol
- 3:30
is the name of this project and it came
- 3:32
from the editor companies. It came from
- 3:34
like if you've used the Zed text editor
- 3:37
or you've used any of JetBrains
- 3:39
products, the Zed folks and the
- 3:40
JetBrains JetBrains folks teamed up and
- 3:43
proposed a standard for
- 3:45
um clients to be able to control
- 3:47
harnesses. And it makes sense if you put
- 3:48
yourself in their shoes, right? What
- 3:49
they wanted to be able to do is write a
- 3:52
single high quality client
- 3:53
implementation in an editor, maybe in
- 3:55
Zed or in IntelliJ or something like
- 3:57
that, and be able to control any harness
- 4:00
by with that single client
- 4:02
implementation, sending tasks, getting
- 4:04
results back,
- 4:06
seeing what files are being edited, etc.
- 4:08
It makes a ton of sense if you put
- 4:09
yourself in their shoes, right? But we
- 4:11
saw this on the Goose team, and we think
- 4:14
that there is a much broader utility
- 4:16
than just editors, right? So it's a
- 4:19
it's it's relatively neutral and it
- 4:20
doesn't have many editor specific
- 4:22
features. And so we think that this can
- 4:23
can go to a be spread to a wider range
- 4:27
of client software.
- 4:28
To go into a little bit more depth about
- 4:31
ACP's design and and what you can do
- 4:32
with it,
- 4:34
it lets you establish connections
- 4:36
between clients and agent harnesses that
- 4:39
have a given
- 4:40
a set of capabilities associated with
- 4:42
the the connection, and then you can
- 4:45
make sessions. Within sessions, you can
- 4:47
send user messages, the things that a
- 4:49
user is maybe typing into the app or
- 4:51
that the client software wants to send.
- 4:53
The agent can then respond to those with
- 4:56
text,
- 4:57
uh more images or audio, text, etc., or
- 5:00
updates about what's going on. So like,
- 5:02
if a tool is called, it can send a tool
- 5:04
call notification and explain what tool
- 5:06
was called and what the metadata was.
- 5:08
Um and it can also send things like
- 5:10
permission requests, so that if the
- 5:12
client software needs to show the user,
- 5:14
you know, "Should I do this tool call?
- 5:16
Yes or no?" It can go over this uh
- 5:19
this protocol. And it's it's pretty
- 5:21
simple in its design. Uh it uses JSON
- 5:24
RPC messages, and the thing we like
- 5:26
about it most is that it's extensible as
- 5:28
well, so you're not limited to just
- 5:29
what's in the vanilla protocol. You can
- 5:32
add custom methods. So the
- 5:34
the convention is you put an underscore,
- 5:37
and then you start to put your custom
- 5:38
methods. And the thing I like about this
- 5:40
is that if enough harness projects or
- 5:42
client projects adopt this,
- 5:44
we can start to see what we're all doing
- 5:45
that's the same,
- 5:47
right? Like if the Codex team has some
- 5:49
custom methods, the Goose team has some
- 5:50
custom methods,
- 5:52
uh the client team has some custom
- 5:53
methods, whoever, we can see what
- 5:55
emerges in the in the ecosystem and what
- 5:58
makes sense to get on a standards track
- 6:00
and bring into the protocol itself so
- 6:02
that this is sort of shaped by usage and
- 6:04
shaped by the community.
- 6:06
Um I'm going to do a demo
- 6:08
of a standard IO version of this. So,
- 6:12
I'm going to open Zed and I just have a
- 6:14
really simple project here
- 6:17
where I'll say, "Tell me about this
- 6:19
project." And so, this is a single HTML
- 6:21
file.
- 6:22
So, you can see I was able to type my
- 6:24
query into Zed and this is the agent in
- 6:26
play here is Goose, so it's using
- 6:28
Goose's ACP interface.
- 6:30
And it's you can see it's like sending
- 6:31
text back, it's sending tool call
- 6:33
information back
- 6:35
um about what it read and what it did
- 6:37
and then it found, you know, that it's a
- 6:38
single HTML file and then explained it.
- 6:41
And I'll do another
- 6:42
I'll do another one. This is one from a
- 6:44
company called Poolside AI.
- 6:47
Uh
- 6:48
I'll say, "Tell me about this project."
- 6:50
In the same project. And so, this is a
- 6:52
terminal-based client getting exactly
- 6:54
the same experience from the same agent,
- 6:56
one implementation on the harness side,
- 6:59
and you can now use any client. Right?
- 7:01
And so, you can see it did the same
- 7:02
thing. It showed me
- 7:04
some text results back, it showed a tool
- 7:05
call, and then it showed a It's it's
- 7:07
streaming in a summary.
- 7:09
Um
- 7:10
So, that's a basic demo showing two
- 7:11
clients talking to the same agent
- 7:15
uh over standard IO locally in this
- 7:16
case.
- 7:18
But local obviously isn't enough, right?
- 7:20
If you want this to take off, you have
- 7:21
to be able to do remote as well. Agents
- 7:23
are going to be running in the cloud.
- 7:25
And so, when we came to this project, we
- 7:27
saw that it did not have remote support
- 7:28
yet. So, we specified an HTTP transport.
- 7:32
There's an HTTP version and there's a
- 7:33
websocket upgrade. And so now, the
- 7:36
messages are the same, the protocol
- 7:38
semantics are the same, but there's a
- 7:39
new transport that is just landing now
- 7:41
that enables remote.
- 7:43
And
- 7:45
the way we think about this on the Goose
- 7:47
team, the agentic stack, is there's sort
- 7:48
of these four important components,
- 7:50
right? You have the client,
- 7:52
which is like the app that the user is
- 7:53
using or a headless app running
- 7:55
somewhere on a machine. There's the
- 7:57
harness, which is the program that
- 7:59
implements the tool calling loop.
- 8:01
There are the tools themselves. This
- 8:03
often MCP. And then there's the model,
- 8:05
right? And if you do a remote transport
- 8:08
for the agent client protocol,
- 8:11
and MCP has remote transport for tool
- 8:14
calling,
- 8:15
and the models have kind of all had
- 8:16
remote endpoints like responses APIs for
- 8:19
a long time. Now you have the
- 8:20
flexibility to move all of these four
- 8:22
components around. They could all be on
- 8:24
the same machine. The harness could be
- 8:26
on a different machine than the client.
- 8:28
Uh the model could be the only thing
- 8:30
that's remote. The tools could be the
- 8:32
only thing that's remote. Uh aligning on
- 8:34
standards and making sure that they have
- 8:36
good transport stories is what's going
- 8:38
to let us move all the pieces of this
- 8:40
agentic stack around.
- 8:43
And I can show a quick demo of this as
- 8:45
well.
- 8:46
So, this is a a client just to show how
- 8:49
easy it is to create clients for this. I
- 8:51
just live-coded this, you know, last
- 8:53
night. And I'll say, "Write a poem." So,
- 8:57
this is again connecting to that same
- 8:58
process on my machine.
- 9:01
Uh in this case I'm running it over the
- 9:02
network, but it's on my machine. It's
- 9:03
connecting and sending Goose
- 9:05
instructions for what to do uh remotely.
- 9:08
So, this could be in a container, could
- 9:10
be up in the cloud, but the messages are
- 9:12
the same and the library you use is the
- 9:14
same. So, you can just switch between
- 9:16
local and remote very, very easily.
- 9:19
Um
- 9:21
So, if you want to get plugged into this
- 9:23
ecosystem, start experimenting with
- 9:25
support, either making your own clients
- 9:26
or adding stuff to harnesses, this is a
- 9:29
this will link you to the agent client
- 9:30
protocol site for
- 9:32
how to get started. There's a number of
- 9:34
clients and and agent servers are out
- 9:36
there. This ranges from editors, desktop
- 9:39
applications, mobile applications,
- 9:41
terminal based things, like there's a
- 9:43
proliferation.
- 9:45
And
- 9:46
I I think the use cases are are are
- 9:49
potentially huge, right? If we if we get
- 9:50
some interoperability going here because
- 9:52
you can have people can make personal
- 9:54
clients that's exactly how you want it
- 9:56
orchestrating your agents. You could
- 9:58
have sort of clients created for certain
- 10:00
business domains or an individual
- 10:02
company or a set of clients from a
- 10:05
company you could customize like a white
- 10:07
label
- 10:08
client have it work with all the
- 10:09
harnesses. And I also think if we make a
- 10:11
new category here,
- 10:13
we're going to see quality of the
- 10:15
clients go up, right? Because any
- 10:16
anytime you get an ecosystem or a
- 10:18
marketplace going and there's many
- 10:19
options,
- 10:20
users can vote with their feet if
- 10:22
clients aren't meeting their needs and
- 10:24
so people will start to compete on the
- 10:25
quality of the user experience and and
- 10:27
like overall I think this should drive
- 10:29
up uh
- 10:30
the user experience of using AI.
- 10:33
That's what I've got today. Thank you
- 10:34
very much. And if you want to chat with
- 10:36
me, find me after or send me an email.
- 10:39
Um happy to get you plugged into this
- 10:41
work.
- 10:42
Thank you.
- 10:57
>> [music]