ACP: The Universal Remote Control for AI Agents — Alex Hancock, Block
Read the talk
ACP: A Common Control Interface for AI Agents
Alex Hancock explains how the Agent Client Protocol separates the application a user chooses from the harness that runs an agent, then demonstrates local and network connections to Goose.
From a talk by Alex Hancock
At a glance
Ideas worth remembering
ACP addresses the client-to-harness boundary: submitting work and receiving responses, progress, and permission requests. MCP addresses the harness’s access to tools and resources.
ACP uses JSON RPC and underscore-prefixed custom methods. Hancock proposes using recurring extension patterns across projects to guide future standardization.
Zed and a Poolside AI terminal client demonstrate the same basic interaction with Goose through one harness interface over local standard input/output.
Remote interfaces can separate the placement of client, harness, tools, and model. The transport work was described as just landing, and the network demonstration still ran on Hancock’s own machine.
The proposed payoff is a market for personal, domain-specific, and customizable clients, where users’ ability to switch applications encourages competition on experience. That outcome remains dependent on interoperability and adoption.
From Goose and MCP to the client interface
Alex Hancock introduces the idea of a universal remote control for AI. He opens with a joke about his own unfinished support for MCP tasks, then establishes the experience behind his proposal: he is a software engineer at Block, has worked on Square and Cash App, and has spent the last couple of years working on open source AI.
His main project is Goose, an open source agent harness that began inside Block. Hancock says it was subsequently open sourced and donated to the Linux Foundation, with Block engineers continuing to contribute. He also maintains the Rust SDK for the Model Context Protocol, or MCP, and has recently begun working on the Agent Client Protocol, or ACP. That places his argument at the boundary between the software that runs an agent and the interfaces through which other software uses it.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Bespoke harness interfaces limit client choice
Hancock identifies a recurring problem across otherwise capable harnesses: their control interfaces are often custom. In the most restrictive case, exactly one client application can drive a harness. A user therefore cannot freely choose an application independently of the agent implementation it controls. His browser analogy makes the cost concrete: an open web would be difficult to sustain if each website required its own browser or connection protocol.
The reason to standardize this boundary is that standards can create ecosystems and markets. Hancock points to MCP as the existing example on the agent’s outward-facing side: it supports calling tools, taking actions in other systems, and reading resources and data. He argues that its strongest property is widespread adoption. His estimate of thousands or tens of thousands of servers illustrates the resulting network effect: many integrations become useful to many agents through a shared interface.
The missing boundary runs in the other direction. Client software needs to give an agent tasks, tell it what to work on, and receive updates. Hancock argues that this interaction still lacks a good common standard, and introduces his team’s work as a candidate solution. The distinction matters because access to tools does not itself define how a user-facing application submits work or follows its progress.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
One editor integration, many harnesses
ACP originated with the Zed and JetBrains teams, according to Hancock. Their motivation was straightforward: build one high-quality client implementation inside an editor and use it to control different harnesses. That integration would send tasks, receive results, and expose information such as which files the agent was editing. A shared protocol would let the editor team invest in that experience without rebuilding the entire interaction for every harness.
The Goose team saw a wider application. Hancock describes ACP as relatively neutral, with few editor-specific features, which makes it a plausible foundation for other kinds of client software. Its origin supplies a concrete integration problem, while its generality leaves room for applications whose main purpose is something other than editing code.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Sessions, updates, permissions, and extensions
Hancock describes ACP interactions as connections between clients and agent harnesses, with a set of capabilities associated with each connection. Within that connection, the client can create sessions and send user messages. Those messages may come directly from someone typing into an application or from the client software itself. The agent can respond with text, images, audio, or updates about its work. Connections describe the available interaction, while sessions provide the context in which messages are exchanged.
Updates include tool-call notifications that identify the tool and carry metadata about the call. ACP also carries permission requests, allowing the client to ask the user whether a proposed tool call should proceed. These are distinct interactions: a notification explains what is happening, while a permission request presents a decision. Carrying both through the protocol lets the harness communicate its work and request user input through whichever compatible client is in use.
The protocol uses JSON RPC messages and allows custom methods beyond its standard set. The naming convention is to prefix those methods with an underscore. This gives implementers room to add behavior without waiting for every feature to become part of the core protocol. That flexibility also means the standard method set does not encompass every interaction a particular implementation may offer.
Hancock wants extensions to inform the standard’s development. He imagines teams such as Codex, Goose, and client developers adding custom methods, then comparing the patterns that emerge. When multiple projects solve the same problem in similar ways, that behavior could move onto a standards track and eventually enter ACP itself. This is a proposed path from experimentation to shared semantics, dependent on adoption and community agreement rather than an automatic consequence of adding an extension.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Two local clients use Goose’s ACP interface
The first demonstration uses standard input/output locally. Hancock opens a simple project in Zed and asks the agent to explain it. The project consists of a single HTML file, and the agent is Goose, reached through its ACP interface. In his account of the demonstration, Zed receives text and tool-call information describing what Goose read and did, followed by an explanation of the project.
He then submits the same request about the same project through a terminal-based client from Poolside AI. Hancock describes the same categories of interaction: text results, a tool call, and a streaming summary. The practical result is two different client interfaces using one implementation on the harness side. The example demonstrates the shared request-and-update interaction locally; it does not establish that every client supports every possible harness feature.
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 independently placeable
Local connections are insufficient for the cloud-hosted agents Hancock expects people to use. He says ACP lacked remote support when his team approached the project, so they specified an HTTP transport, including an HTTP version and a WebSocket upgrade. The intended separation is between transport and protocol: the messages and their semantics remain the same, while the transport changes how they travel. He describes this work as just landing at the time of the talk, leaving its final release and standardization status unresolved.
The Goose team frames the agentic stack as four components. The client is the application a user operates, or a headless application running on a machine. The harness is the program that implements the tool-calling loop. The tools provide the operations available to that loop, often through MCP. The model is the remaining component. This division separates the interface that requests work from the program that carries it out, the operations it invokes, and the model it uses.
Remote ACP connects the client to the harness; remote MCP connects the harness to tools; remote model endpoints provide the model connection. With those boundaries available over a network, Hancock argues that all four components can be placed independently. They might share one machine, the harness might run separately from the client, or only the model or tools might be remote. The architectural benefit is deployment flexibility: a component’s location need not dictate the location of the rest of the stack, provided the relevant interfaces have suitable transports.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
A network connection on the same machine
For the network demonstration, Hancock uses a client he says he live-coded the previous night and asks Goose to write a poem. The client connects over the network to the same process on his own machine. This distinction matters: the example exercises a network transport, but it is not a demonstration of an agent deployed on a separate cloud machine.
Hancock explains that the target process could instead run in a container or in the cloud. In his implementation, the messages and the library used by the client stay the same, making switching between local and remote connections straightforward. The example supports that continuity of the client interaction; it does not supply details about operating the connection across a production network.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Interoperability creates room to compete on experience
Hancock closes by encouraging developers to build clients or add ACP support to harnesses. He describes an emerging range of clients and agent servers, with clients spanning editors, desktop applications, mobile applications, and terminals. The breadth matters to his argument because a common control interface can serve several interaction styles rather than tying agent use to a single application category.
He proposes several uses for that interoperability: personal clients that orchestrate agents according to an individual’s preferences, clients designed for a business domain or a particular company, and customizable white-label clients that work across harnesses. These are possibilities he expects a shared interface to enable. Their appeal is that developers can tailor how people interact with agents while retaining access to multiple harness implementations.
His final claim is about incentives. If interoperable clients become a product category with many options, users can leave applications that do not meet their needs. Developers would then compete on the quality of the user experience, which Hancock expects to improve the experience of using AI overall. This is a conditional market argument, rather than a measured result: the expected improvement depends on an ecosystem forming and users having meaningful alternatives. He ends by offering to help interested developers get involved.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
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]