Lecture 5 · COMS W4995 Agentic Engineering

Agent tools in pictures

Chapter one

Forty years of calling someone else's code

Follow remote calls from 1984 to 2026 and you can tell which parts of today’s tool protocols are lasting problems and which are packaging that will change again.

After this chapter you can

  1. Explain the “did it run?” problem and why a retry can make it worse.
  2. Trace how describing and discovering a remote call evolved, and say what each step solved and what it left open.
  3. Explain what changed when the caller became a model.
  4. Separate what stayed stable in MCP across its versions from what changed.
  5. Apply the lasting-versus-packaging test to a protocol feature.

22 minutes to read9 sections8 quiz questions

Start reading →

Your agent asks a payments tool to send a refund. Thirty seconds pass, and you get no response. Should the agent try again? If the first request reached the payments system, a second request might send the money twice. If the first request never arrived, not retrying means the customer gets nothing. People building distributed systems wrote about this dilemma in 1984. No protocol since has made it go away. This chapter looks at forty years of calling code that lives somewhere else. You will see which problems are old, which are new, and which parts of today’s tools are likely to change next year.

Section 1.1

1984: make a remote call look local

A remote procedure call. The caller calls a stub that looks local; the stub sends a message across the network to a server stub, which runs the procedure. If the reply comes back, the procedure ran exactly once. If an exception comes back instead, it ran once or not at all, and the caller is not told which. Caller's machine Server's machine Callerrefund(order) Stublooks local Stubunpacks the call Procedureruns network What the caller learns Reply arrives the procedure ran exactly once Exception instead ran once or not at all; the caller is not told which
A remote call looks like a local one to the caller, until it fails. Then the caller cannot tell whether the procedure ran.

Imagine a function call within a single program. You call refund(order); it runs and returns. If it fails, you know immediately. Now, move refund to a different machine. The function call must transform into a message, travel across a network, execute on the remote machine, and return as another message.

Bruce Jay Nelson is widely recognized for coining the term “remote procedure call” in 19811. He and Andrew Birrell at Xerox PARC developed “Lupine”, which “automatically generated stubs, providing type-safe bindings”1. A stub is a small, generated code segment. To the caller, it appears to be the local function. In reality, it packages arguments into a message and transmits it. Birrell and Nelson intended RPC to “remove unnecessary difficulties, leaving only the fundamental difficulties of building distributed systems: timing, independent failure of components, and the coexistence of independent execution environments”2.

Their 1984 paper openly discusses what the stub cannot conceal. If the call returns, the procedure executed exactly once. “Otherwise, an exception is reported to the user and the procedure will have been invoked either once or not at all—the user is not told which”2. Worse: “If an exception is reported, the user does not know whether the server has crashed or whether there is a problem in the communication network”2.

Sun’s RPC, documented as RFC 1057 in 1988, offered servers a partial defense. Each message includes a transaction ID, and a server “may choose to remember this ID after executing a call and not execute calls with the same ID in order to achieve some degree of execute-at-most-once semantics”3. Even over TCP, if the caller “receives no reply message, it cannot assume the remote procedure was not executed”3.

This means the caller bears the burden. For some procedures, this is simpler: “Idempotent procedures (those that have no additional effects if called more than once) are easily handled”1. Reading an account balance twice does not change it. Sending a refund twice does. This distinction—between calls you can safely repeat and those you cannot—will be important throughout our course and for an agent’s tool list.

Check yourselfSuppose a tool call times out. Which is safe to retry without further consideration: get_balance or send_refund?

get_balance. Reading twice has no additional effect; this is the definition of an idempotent procedure1. send_refund might have already run, because after a failed call, the caller “is not told which”2.

Section 1.2

2000s: describe it for strangers

Describing and finding remote services, 1991 to 2017: CORBA's interface language and repository in 1991, XML-RPC in 1999, SOAP in 2000, WSDL in 2001, the public UDDI registry closed in 2006, gRPC and GraphQL in 2015, OpenAPI 3.0 in 2017. Description formats lasted; the public directory closed. Describe the service Find the service 1991CORBA IDL 1999XML-RPC 2000SOAP 2001WSDL 2006 2015gRPCGraphQL 2017OpenAPI 3.0 CORBArepository UDDI publicregistry closes Description formats lasted. The open public directory did not.
Each step made a remote service easier for a stranger to describe or find. The public directory is the one that closed.

Birrell and Nelson’s callers were programmers working in the same lab. A new problem arose with strangers: how can a program from one company call a service from another? You need a shared way to describe the service and a way to find it.

CORBA 1.0, released in October 1991, included an “Interface Definition Language (IDL)” and an “Interface Repository”6. An IDL is a neutral language. You use it to write down what a remote object offers, including its operations and argument types. An interface repository lets a program ask, at run time, what interfaces are available. A standard “out of the box” interoperability architecture became available only with CORBA 2.0, in August 19966.

The web then shifted remote calls to HTTP. The XML-RPC specification of 1999 states it clearly: “An XML-RPC message is an HTTP-POST request”7. SOAP 1.1, a W3C Note from May 2000, added an envelope and “a convention for representing remote procedure calls and responses”8. WSDL 1.1, from 2001, described a service using XML “as a set of endpoints operating on messages”9.

The final component was discovery: a public directory where any company could publish its services and any other could find them. This was the UDDI Business Registry. Microsoft, IBM, and SAP shut it down. Publication was “disabled as of January 12, 2006”5. By Microsoft’s own count, it had managed “over 50,000 replicated entries” over five years5. An analyst at ZapThink explained why the vision failed: “there’s always a human element to establishing a relationship”5. The format for describing services survived. Automated trust between strangers did not.

Meanwhile, in 2000, Roy Fielding’s dissertation described REST. Its stateless constraint means “each request from client to server must contain all of the information necessary to understand the request” and “Session state is therefore kept entirely on the client”10. Hold on to that sentence; MCP arrives at the same place in 2026. REST’s constraints say how to talk to a service, not how to describe one; OpenAPI later gave HTTP APIs a standard description. Version 3.0.0, published in July 2017, “allows both humans and computers to discover and understand the capabilities of a service without requiring access to source code, additional documentation, or inspection of network traffic”4. In 2015 Google open-sourced gRPC11 and Facebook began open-sourcing GraphQL, whose servers “can be queried for the types it supports”12.

Check yourselfThe public UDDI registry closed in 2006. Did describing services for strangers fail?

No. Description formats lasted: WSDL, then OpenAPI, which still lets humans and computers discover a service’s capabilities without the source4. What failed was automated discovery without trust; the registry’s critics said “there’s always a human element to establishing a relationship”5.

Section 1.3

2022–24: the caller becomes a model

How the tool call got its structure, 2022 to 2023: ReAct wrote actions as text that the program parsed; Toolformer paused decoding to call an API; LangChain structured tools gave a tool many typed inputs; native function calling returned a JSON object of arguments from the API. From text your program parsed to a structured request Oct 2022ReActaction writtenas text in themodel's output Feb 2023Toolformerdecoding pauses,the API is called,output inserted May 2023Structuredtools: manyinputs of anytype (LangChain) Jun 2023Function callingthe API returnsJSON argumentsfor your code In every step the caller is a model, not a program written against the interface. Results in the research papers come from 2022 and 2023 models.
Four steps from 2022 to 2023 moved tool calls from text your program parsed to structured requests the API returns.

Until recently, every caller was a program. A programmer would read the IDL or OpenAPI document, write code based on it, and that code would send the exact call it was designed to send. In 2022, the caller began to change.

ReAct, posted in October 2022, prompted language models to produce “reasoning traces and task-specific actions in an interleaved manner” and showed the approach “interacting with a simple Wikipedia API”14. The action was text in the model’s output, and the surrounding program had to find and run it. Toolformer, in February 2023, trained a model “to decide which APIs to call, when to call them, what arguments to pass, and how to best incorporate the results”15. At inference, decoding pauses when the model produces a special token, the program calls the API, and decoding continues with the response inserted15. Gorilla, in May 2023, named the new failure: a hallucinated call is “an API call that is not a sub-tree of any API in the database – invoking an entirely imagined tool”16. All three are research systems built on 2022–2023 models.

Frameworks and APIs then gave the call a structure. LangChain’s history shows that “In the early days, tool use was simplistic”: a model generated a tool name and one input string17. On May 2, 2023 LangChain introduced structured tools that “can take in an arbitrary number of inputs of arbitrary types”17. OpenAI’s ChatGPT plugins, launched March 23, 2023, asked developers to describe their API with an OpenAPI specification and a manifest18. Its red team had already “discovered ways for plugins—if released without safeguards—to perform sophisticated prompt injection, send fraudulent and spam emails, bypass safety restrictions, or misuse information sent to the plugin”18.

On June 13, 2023 OpenAI moved this structure into the API itself. Developers describe functions “via JSON Schema”, and the model can “choose to output a JSON object containing arguments to call those functions”13. The same post warned that “untrusted data from a tool’s output can instruct the model to perform unintended actions”13. Google’s Gemini API listed function calling among its launch features on December 13, 202319. In November 2023, OpenAI released the Assistants API with hosted tools such as Code Interpreter, and function calling gained “the ability to call multiple functions in a single message”20.

The caller has changed. A traditional program sends exactly what its author wrote. A model, however, reads a plain-language description and makes a guess. It might choose the wrong tool, invent a tool that does not exist, or follow an instruction hidden in text that a tool returned. The description is no longer just documentation a programmer consults once. It is the input the caller acts on every time.

Check yourselfOn launch day in June 2023, what risk did OpenAI already warn about?

They warned that “untrusted data from a tool’s output can instruct the model to perform unintended actions”13. OpenAI advised consuming information only from trusted tools and adding user confirmation before actions that have real-world impact13.

Section 1.4

2024: one protocol for every tool

Before MCP, each of three applications needed its own connector to each of three data sources, nine connectors in all. With MCP, each source runs one server, and each host creates one client per server it connects to. Before: a connector per pair With MCP: one server per source App A App B App C Docs Tickets Database 3 apps x 3 sources = 9 custom connectors Host client 1 client 2 client 3 Docs server Tickets server DB server any MCP host reuses the same servers
Before MCP, each application wrote its own connector for each source. With MCP, a source runs one server and any MCP host can connect to it.

Before MCP, each agent application wrote its own connectors. Anthropic’s announcement on November 25, 2024 named the problem: “Every new data source requires its own custom implementation, making truly connected systems difficult to scale”22. Their solution was the Model Context Protocol (MCP), designed to replace “fragmented integrations with a single protocol”22.

The design has three roles. The first specification, dated 2024-11-05, defines hosts as “LLM applications that initiate connections”, clients as “Connectors within the host application”, and servers as “Services that provide context and capabilities”21. The current architecture page explains the mechanics clearly: “The MCP host accomplishes this by creating one MCP client for each MCP server”23. All messages “MUST follow the JSON-RPC 2.0 specification”24, a “stateless, light-weight remote procedure call (RPC) protocol” that is “transport agnostic”25. The first version specified two transports: “stdio, communication over standard in and standard out” and “HTTP with Server-Sent Events (SSE)”26.

The first specification also stated what MCP would not do. “While MCP itself cannot enforce these security principles at the protocol level, implementors SHOULD” build “robust consent and authorization flows into their applications”21. MCP standardizes how you describe and call a tool. The host still decides whether a call should run.

Within six months the large vendors adopted it: OpenAI’s Agents SDK on March 26, 202527, Google’s Agent Development Kit at its April 9, 2025 launch28, Microsoft at Build on May 19, 2025, where it also joined “the MCP Steering Committee”29, and OpenAI’s Responses API on May 20, 202530.

Check yourselfDoes connecting a tool through MCP make it safe to use?

No. MCP standardizes how a tool is described and called. Its first specification states that MCP “cannot enforce these security principles at the protocol level”; the host must21.

Section 1.5

Five versions in twenty months

Five MCP versions side by side. Tools and JSON-RPC 2.0 messages are present in every version. The HTTP transport, batching, authorization and the handshake with sessions changed: SSE was replaced by Streamable HTTP, batching was added then removed, authorization went from none to OAuth 2.1 and was reworked twice, and the handshake and sessions were removed in 2026. Part of the protocol 2024-11 2025-03 2025-06 2025-11 2026-07 Tools yes yes yes yes yes JSON-RPC 2.0 messages yes yes yes yes yes HTTP transport SSE Streamable Streamable Streamable Streamable Batching added removed Authorization none OAuth 2.1 resource srv new reg. old reg. dep. Handshake, sessions yes yes yes yes removed Top rows never changed. Bottom rows changed at least once. "reg." = client registration; "dep." = deprecated.
Across five versions, tools never left the specification. Transports, batching, authorization and sessions kept changing.

MCP published five versions between November 2024 and July 2026: 2024-11-0526, 2025-03-2631, 2025-06-1833, 2025-11-2534 and 2026-07-2832. Lay them side by side and two kinds of parts appear.

Some parts kept moving. The transport changed in the second version, which “Replaced the previous HTTP+SSE transport with a more flexible Streamable HTTP transport”31. The same version added JSON-RPC batching31; the next version removed it33. Authorization went from absent (“Authentication and authorization are not currently part of the core MCP specification”24) to OAuth 2.131,35, then to servers acting as OAuth resource servers that accept only tokens meant for them33,36, then to a new client registration mechanism34,37, with the old one deprecated in 202632,38.

The 2026 version made the biggest break. It removed “the initialize/notifications/initialized handshake” and “protocol-level sessions”32. The maintainers explained their reasoning: “Any request can now land on any server instance behind a plain round-robin load balancer without needing shared storage”39. They stated that a server needing state across calls should “mint an explicit handle from a tool and have the model pass it back as an argument”39. Fielding argued for statelessness in 200010; MCP arrived at the same design in 2026. We observe this parallel; the maintainers do not claim it.

Other parts stayed. Tools were a server feature in the first version24. In the 2026 version servers still return them from tools/list32. Tool annotations, added in 202531, are still there, and clients “MUST consider” them untrusted “unless they come from trusted servers”40. The data layer of the current architecture still lists “core primitives, such as tools, resources, prompts and notifications”23. One year in, the maintainers called MCP “the de-facto standard” for providing context to models41.

Check yourselfIf you build an MCP server today, which parts would you expect to change again?

Transport and session rules are good candidates: they changed in 2025 and again in 202631,32. Tools themselves have been part of the protocol since its first version24,32. You can base your judgment on the parts that have remained stable.

Section 1.6

2026: the provider runs the loop

Who runs the agent loop. In 2022 your application wrote the loop: ask the model, run the tool, paste the result, repeat. In 2026 the provider runs it: Claude Managed Agents entered public beta on April 8, 2026, and OpenAI's Agents API on September 10, 2026. You still own which tools, whose credentials, and which calls need a human yes. 2022: your code runs the loop 2026: the provider runs the loop 1 ask the model 2 run the tool it asked for 3 paste the result back 4 repeat Claude Managed Agents public beta, Apr 8, 2026 OpenAI Agents API public beta, Sep 10, 2026 You still own which tools, whose keys, who says yes Between them: OpenAI's Assistants API, Nov 2023, shut down Aug 26, 2026.
In 2022 every application wrote the agent loop itself. By 2026 both large providers offered the loop as a managed service.

In 2022 every application wrote its own loop: ask the model, run the tool it requested, paste the result back, ask again. OpenAI made a first attempt to host part of that loop with the Assistants API in November 2023, whose threads let developers “hand off thread state management to OpenAI”20. That API shut down on August 26, 202630.

By then both large providers offered the whole loop as a product. Anthropic launched Claude Managed Agents in public beta on April 8, 2026, as “a fully managed agent harness for running Claude as an autonomous agent with secure sandboxing, built-in tools, and server-sent event streaming”43. OpenAI released its Agents API in public beta on September 10, 2026, with “a managed Codex harness while OpenAI handles session orchestration, context compaction, and recovery”30. OpenAI’s documentation says the Agents API “manages the agent loop for you”44.

When someone else runs the loop, their defaults become your behavior. In Claude Managed Agents, “the agent toolset defaults to always_allow, and MCP toolsets default to always_ask“42, and custom tools sit outside these policies because your application runs them42. A later release added an auto policy in which “the server evaluates each agent or MCP tool call and runs it, denies it, or pauses for your approval”43.

Check yourselfYour agent moves onto a provider-run loop. What do you still control?

You control the decisions: which tools the agent may use, with whose credentials, and which calls require human approval. The provider’s defaults remain until you change them. For example, in Claude Managed Agents, the built-in toolset starts at always_allow42.

Section 1.7

MCP borrowed plumbing, not answers

What MCP borrowed and what it left open. Borrowed: JSON-RPC 2.0 messages; an initialize request with capability negotiation, as in the Language Server Protocol; JSON Schema inputs, as in function calling; asking a server what it offers, as in CORBA's interface repository. Left open: did the call run, where did the tool come from and can you trust it, and who may call it. Borrowed plumbing Questions left open Message formatJSON-RPC 2.0 Initialize, negotiate capabilitiesLanguage Server Protocol Inputs described in JSON Schemafunction calling Ask the server what it offersCORBA interface repository Did it run?open since 1984 Where is it from? Can I trust it?annotations stay untrusted Who may call it?left to the host
MCP reused proven parts from earlier protocols. The three old questions came along unanswered.

Now you can read MCP as a sum of older parts. Its messages are JSON-RPC 2.024,25. Its first version opened every connection with “Connection initialization, capability negotiation, and session control”24, the pattern of the Language Server Protocol, where “The initialize request is sent as the first request from the client to the server”45. The specification itself says “MCP takes some inspiration from the Language Server Protocol”21. A tool definition carries a name, a description and an inputSchema in JSON Schema40,46, the format function calling already used13,47. Asking a server what it offers repeats an idea as old as CORBA’s interface repository6.

Let’s be precise about the benefits of LSP’s design. A language server can “be implemented once and have different tools take advantage of it”48. This means an implementation can be reused. Each running server still serves a single development tool: “The protocol currently assumes that one server serves one tool”45. MCP’s local servers work the same way, usually serving a single client23, but “remote MCP servers that use the Streamable HTTP transport will typically serve many MCP clients”23.

What MCP did not take was an answer to the questions from 1984. Did the call run? The 2026 transport says that when a stream breaks, the client “MUST re-issue it as a new request with a new request ID”32; if the first request had already taken effect, a re-issued call can run it again. That consequence is our inference, the same one Birrell and Nelson spelled out2. Where did the tool come from, and can you trust its description? Annotations stay untrusted unless the server is trusted40. Who may call it? The first specification left enforcement to implementors21.

Check yourselfWhich of the three open questions could a retry make worse?

“Did it run?” If the first call ran but the reply was lost, a retry runs it again. This could lead to two refunds or two emails. A failed call “will have been invoked either once or not at all”2.

Section 1.8

The judgment call: what lasts?

Yan Wang's split applied to MCP. The lasting problem, which appreciates: giving agents clear, safe interfaces and deciding what plain code should handle. The packaging, which depreciates: routing every tool definition and result through the context window, MCP-first. The two test questions sit underneath. Lasting problem: appreciates Packaging: depreciates Giving agents clear, safe interfaces and deciding what plain code should handle Routing every tool definition and result through the context window, MCP-first The two questions If the model were 10x better, would this still matter? What problem is it actually solving, and do I still have it?
Yan Wang’s split for MCP: the lasting problem appreciates, the packaging of its year depreciates.

A new protocol arrives every few years, and each one is sold as the answer. How do you decide what to learn deeply and what to treat as this year’s packaging? Yan Wang gave our class a ruler in his October 2 guest lecture: “Every hot noun bundles a lasting problem with packaging from its year”49. The lasting problem is “The underlying need that remains whatever the model does; understanding it appreciates.” The packaging is “The brand-name implementation shaped around the limits of its year; it depreciates”49.

He splits them with two questions: “If the model were 10x better, would this still matter?” and “What problem is it actually solving, and do I still have it?”49 For MCP, his split puts “Giving agents clear, safe interfaces and deciding what plain code should handle” on the lasting side, and “Routing every tool definition and result through the context window, MCP-first” on the packaging side49.

Let’s apply this test to what we covered in this chapter. “Did it run?” passes both questions: a smarter caller still cannot see a lost reply. Describing a service and deciding who can call it also pass; these have been re-solved since 1991. Protocol sessions fail the second question: the need they served, keeping state across calls, can be met with a handle the model passes back, and MCP removed them in 202632,39. That shows the pattern of a packaging decision.

This guideline has a limit. “Packaging” means you should not base your entire judgment on it. It does not mean you can ignore it: a change in transport can break every server you operate. Also, the distinction is a judgment, not a measurement. Two careful engineers might categorize the same feature differently and should be able to explain their reasoning.

Check yourselfMCP’s 2026 version removed protocol-level sessions. Is this a lasting problem, or packaging?

It’s packaging. The lasting problem is how to serve many clients from many machines. REST advocated keeping session state on the client in 200010, and MCP removed its sessions so that any request can be handled by any server instance39.

Before you go on

Close the book

  1. Tell the story of remote calls in five sentences, one per era: 1984, the 2000s, 2022–23, 2024 and 2026. Then name the three questions that are still open.
  2. Choose one feature from a tool protocol you use. This could be a transport, a registry, or a permission prompt. Apply Yan Wang’s two questions to it and determine if it represents a lasting problem or merely packaging.
  3. Imagine your agent’s send_email tool timed out. Explain to a teammate why simply retrying isn’t automatically safe. Then, describe what the tool would need to make a retry safe.

Chapter one · quiz

Test yourself

Most questions have more than one right answer, so select every option that is true. Check each question, then open “Answer and why” for the reasoning.

Question 1An agent calls create_invoice, and the call times out with no reply. Which statements are true?Select all that apply.
Answer and why
  • RightThe invoice may or may not have been created. After a failed call the procedure ran either once or not at all, and the caller is not told which2.
  • RightA blind retry may create a second invoice. If the first call ran and only the reply was lost, a retry runs it again; this is why idempotent procedures are the easy case1.
  • WrongUsing TCP instead of a datagram transport tells you the call did not run. Even over TCP, a caller that gets no reply cannot assume the procedure was not executed3.
  • RightA server that remembers request IDs can avoid running a repeated request again. Sun RPC servers may remember a transaction ID and not execute calls with the same ID, for “some degree of execute-at-most-once semantics”3.
  • WrongThe caller can always tell a crashed server from a network problem. The user does not know whether the server has crashed or whether there is a problem in the network2.
Question 2Which of these tool calls is safe to retry after a timeout without any extra mechanism?Select one.
Answer and why
  • Rightget_order_status(order_id). Reading has no additional effect when repeated; idempotent procedures are easily handled1.
  • Wrongcharge_card(amount). A second charge is an additional effect; the first call may already have run2.
  • Wrongsend_email(to, body). A repeated send produces a second email.
  • Wrongappend_row(sheet, values). Appending twice adds two rows.
Question 3Which statements about describing and finding remote services are supported by the history in this chapter?Select all that apply.
Answer and why
  • RightCORBA 1.0 already shipped an interface definition language and an interface repository. CORBA 1.0 (October 1991) included IDL and an Interface Repository6.
  • WrongThe public UDDI registry closed because nobody had published any services. It managed over 50,000 entries; the critique was that relationships need a human element5.
  • RightOpenAPI lets a program understand a service’s capabilities without its source code. OpenAPI lets humans and computers discover a service’s capabilities without access to source code4.
  • RightDescription formats outlasted the public directory. OpenAPI is still a description standard, while UDDI’s public registry stopped accepting publications in 20064,5.
  • WrongREST requires the server to keep each client’s session. REST’s stateless constraint keeps session state entirely on the client10.
Question 4A team replaces a hand-written integration script with an LLM agent that calls the same API as a tool. What is new about the caller?Select all that apply.
Answer and why
  • RightIt chooses which tool to call by reading a description. Function calling lets the model choose to output a JSON object with arguments after reading described functions13.
  • RightIt may call a tool that does not exist. Gorilla defines a hallucinated call as invoking an entirely imagined tool16.
  • RightText in a tool’s output can steer what it does next. OpenAI warned that untrusted data from a tool’s output can instruct the model13.
  • WrongIts calls travel over a network that can fail. That was already true of the script; independent failure was named in 19842.
  • WrongIt no longer needs the API to be described. The description becomes more important: the model acts on it every time.
Question 5Before native function calling, how did programs get tool calls out of a model?Select all that apply.
Answer and why
  • RightParse an action written as text in the model’s output. ReAct interleaved reasoning traces and actions in the model’s text14.
  • RightPause decoding at a special token, call the API, and insert the response. Toolformer interrupts decoding when the model produces the arrow token, calls the API, and continues15.
  • WrongRead a JSON object of arguments that the API returns. That is native function calling itself, launched June 13, 202313.
  • WrongRead MCP tools/call requests. MCP was announced in November 2024, after native function calling22.
Question 6Which parts of MCP changed between its first version and 2026-07-28?Select all that apply.
Answer and why
  • RightThe HTTP transport. HTTP with SSE was replaced by Streamable HTTP in 2025-03-2631.
  • RightWhether the protocol has an initialize handshake and sessions. The 2026-07-28 version removed the handshake and protocol-level sessions32.
  • WrongWhether servers can offer tools. Tools were a server feature in the first version and are still listed by tools/list in 202624,32.
  • RightWhether authorization is part of the specification. The first version left auth out of the core; 2025-03-26 added OAuth 2.124,31.
  • RightSupport for JSON-RPC batching. Batching was added in 2025-03-26 and removed in 2025-06-1831,33.
  • WrongIts use of JSON-RPC messages. Messages follow JSON-RPC 2.0 in the first version, and the current data layer is still JSON-RPC based23,24.
Question 7A colleague says: ‘MCP is just LSP for AI, so one MCP server always serves one client.’ What is right and wrong here?Select all that apply.
Answer and why
  • RightMCP’s specification says it takes inspiration from LSP. The 2024-11-05 overview says MCP takes some inspiration from the Language Server Protocol21.
  • RightLSP assumes one running server serves one tool. The LSP specification says the protocol assumes one server serves one tool45.
  • RightRemote MCP servers typically serve many clients. Remote MCP servers using Streamable HTTP will typically serve many MCP clients23.
  • WrongAn MCP host connects to exactly one server. A host creates one client for each of one or more servers23.
Question 8Apply Yan Wang’s two questions. Which of these are lasting problems rather than packaging?Select all that apply.
Answer and why
  • RightKnowing whether a call that got no reply actually ran. A better model cannot see a lost reply; the problem dates to 19842.
  • WrongMCP’s protocol-level sessions. They were removed in 2026 so any request can land on any server instance32,39.
  • RightGiving agents clear, safe interfaces and deciding what plain code should handle. Yan Wang puts this on the lasting side of his MCP split49.
  • WrongRouting every tool definition and result through the context window. Yan Wang puts this on the packaging side49.
  • WrongThe HTTP+SSE transport. It was replaced in the second version, less than five months after the first26,31.
  • RightDeciding who may call a tool. The first MCP specification left enforcement to implementors, and every era had to answer it again21.

Sources

  1. Remote procedure call. Wikipedia. en.wikipedia.org/wiki/Remote_procedure_call ↗
  2. Implementing Remote Procedure Calls (Birrell & Nelson), ACM TOCS 2(1). ACM Transactions on Computer Systems (copy hosted at cmu.edu). www.cs.cmu.edu/~dga/15-712/F07/papers/birrell842.pdf ↗
  3. RFC 1057: RPC: Remote Procedure Call Protocol Specification Version 2. Sun Microsystems / RFC Editor. www.rfc-editor.org/rfc/rfc1057.txt ↗
  4. OpenAPI Specification v3.0.0. OpenAPI Initiative / Linux Foundation. spec.openapis.org/oas/v3.0.0.html ↗
  5. Microsoft, IBM, SAP discontinue UDDI registry effort. InfoWorld (Paul Krill). www.infoworld.com/article/2215182/microsoft-ibm-sap-discontinue-uddi-registry-effort.html ↗
  6. History of CORBA. Object Management Group. www.omg.org/gettingstarted/history_of_corba.htm ↗
  7. XML-RPC Specification. Dave Winer / UserLand Software (xmlrpc.com). xmlrpc.com/spec.md ↗
  8. Simple Object Access Protocol (SOAP) 1.1, W3C Note. W3C (member submission: DevelopMentor, IBM, Lotus, Microsoft, UserLand). www.w3.org/TR/2000/NOTE-SOAP-20000508 ↗
  9. Web Services Description Language (WSDL) 1.1, W3C Note. W3C (member submission: Ariba, IBM, Microsoft). www.w3.org/TR/2001/NOTE-wsdl-20010315 ↗
  10. Fielding Dissertation, Chapter 5: Representational State Transfer (REST). Roy T. Fielding, UC Irvine. ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm ↗
  11. Introducing gRPC, a new open source HTTP/2 RPC Framework. Google Developers Blog (Mugur Marculescu). developers.googleblog.com/2015/02/introducing-grpc-new-open-source-http2.html ↗
  12. GraphQL: A data query language. Facebook Engineering (Lee Byron). engineering.fb.com/2015/09/14/core-infra/graphql-a-data-query-language ↗
  13. Function calling and other API updates. OpenAI. openai.com/index/function-calling-and-other-api-updates ↗
  14. Yao et al. "ReAct: Synergizing Reasoning and Acting in Language Models." ICLR (2023).. arXiv (Yao et al.). arxiv.org/abs/2210.03629 ↗
  15. Toolformer: Language Models Can Teach Themselves to Use Tools. arXiv (Schick et al.). arxiv.org/abs/2302.04761 ↗
  16. Gorilla: Large Language Model Connected with Massive APIs. arXiv (Patil et al., UC Berkeley). arxiv.org/abs/2305.15334 ↗
  17. Structured Tools. LangChain. www.langchain.com/blog/structured-tools ↗
  18. ChatGPT plugins. OpenAI. openai.com/index/chatgpt-plugins ↗
  19. It’s time for developers and enterprises to build with Gemini Pro. Google (The Keyword). blog.google/innovation-and-ai/products/gemini-api-developers-cloud ↗
  20. New models and developer products announced at DevDay. OpenAI. openai.com/index/new-models-and-developer-products-announced-at-devday ↗
  21. Specification (revision 2024-11-05), Overview. Model Context Protocol. modelcontextprotocol.io/specification/2024-11-05 ↗
  22. Introducing the Model Context Protocol. Anthropic. www.anthropic.com/news/model-context-protocol ↗
  23. Architecture overview, MCP docs (round-1 source, B7/B14 URL; page version 2026-07-28). modelcontextprotocol.io (assigned reading; now serves the 2026-07-28 docs). modelcontextprotocol.io/docs/learn/architecture ↗
  24. Specification (revision 2024-11-05), Base Protocol overview. Model Context Protocol. modelcontextprotocol.io/specification/2024-11-05/basic ↗
  25. JSON-RPC 2.0 Specification. JSON-RPC Working Group. www.jsonrpc.org/specification ↗
  26. Specification (revision 2024-11-05), Transports. Model Context Protocol. modelcontextprotocol.io/specification/2024-11-05/basic/transports ↗
  27. Release v0.0.7 · openai/openai-agents-python. OpenAI (GitHub release). github.com/openai/openai-agents-python/releases/tag/v0.0.7 ↗
  28. Agent Development Kit: Making it easy to build multi-agent applications. Google for Developers Blog. developers.googleblog.com/en/agent-development-kit-easy-to-build-multi-agent-applications ↗
  29. Microsoft Build 2025: The age of AI agents and building the open agentic web. Microsoft (Official Microsoft Blog). blogs.microsoft.com/blog/2025/05/19/microsoft-build-2025-the-age-of-ai-agents-and-building-the-open-agentic-web ↗
  30. Changelog | OpenAI API (round-1 source, A28 URL). OpenAI. developers.openai.com/api/docs/changelog ↗
  31. Key Changes (2025-03-26). modelcontextprotocol.io. modelcontextprotocol.io/specification/2025-03-26/changelog ↗
  32. MCP specification 2026-07-28: Key Changes. Model Context Protocol. modelcontextprotocol.io/specification/2026-07-28/changelog ↗
  33. Key Changes (2025-06-18). modelcontextprotocol.io. modelcontextprotocol.io/specification/2025-06-18/changelog ↗
  34. MCP specification 2025-11-25: Key Changes. Model Context Protocol. modelcontextprotocol.io/specification/2025-11-25/changelog ↗
  35. Authorization (MCP specification, version 2025-03-26). Model Context Protocol (LF Projects, LLC). modelcontextprotocol.io/specification/2025-03-26/basic/authorization ↗
  36. Authorization (MCP specification, version 2025-06-18). Model Context Protocol (LF Projects, LLC). modelcontextprotocol.io/specification/2025-06-18/basic/authorization ↗
  37. Authorization (MCP specification, version 2025-11-25). Model Context Protocol (LF Projects, LLC). modelcontextprotocol.io/specification/2025-11-25/basic/authorization ↗
  38. Authorization - Overview (MCP specification, version 2026-07-28). Model Context Protocol (LF Projects, LLC). modelcontextprotocol.io/specification/2026-07-28/basic/authorization ↗
  39. MCP 2026-07-28 Specification Release. MCP Blog (D. Soria Parra, D. Delimarsky, Lead Maintainers). blog.modelcontextprotocol.io/posts/2026-07-28 ↗
  40. Tools - Model Context Protocol (spec version 2026-07-28, latest). Model Context Protocol (LF Projects). modelcontextprotocol.io/specification/latest/server/tools ↗
  41. One Year of MCP: November 2025 Spec Release. MCP Core Maintainers. blog.modelcontextprotocol.io/posts/2025-11-25-first-mcp-anniversary ↗
  42. Permission policies (Claude Managed Agents). Anthropic (Claude Platform Docs). platform.claude.com/docs/en/managed-agents/permission-policies ↗
  43. Claude Platform release notes (round-1 source, A29 URL). Anthropic. platform.claude.com/docs/en/release-notes/overview ↗
  44. Programmatic Tool Calling. OpenAI. developers.openai.com/api/docs/guides/tools-programmatic-tool-calling ↗
  45. Language Server Protocol Specification - 3.17. Microsoft (LSP site). microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification ↗
  46. MCP TypeScript SDK v2 Overview. ts.sdk.modelcontextprotocol.io/v2 ↗
  47. Define tools. Anthropic. platform.claude.com/docs/en/agents-and-tools/tool-use/implement-tool-use ↗
  48. A Common Protocol for Languages. Microsoft, Visual Studio Code team blog. code.visualstudio.com/blogs/2016/06/27/common-language-protocol ↗
  49. What Gets You Hired, What Gets You Promoted, and What AI Changed. Yan Wang guest deck. ai-builders.com/resources/w4995 ↗