Skip to content

Commit 3f709e2

Browse files
authored
Merge branch 'pcarleton-security-considerations' into pcarleton/confused-deputy
2 parents 2eada8a + df7350a commit 3f709e2

File tree

7 files changed

+3468
-35
lines changed

7 files changed

+3468
-35
lines changed

docs/clients.mdx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,15 @@ This page provides an overview of applications that support the Model Context Pr
2525
| [Genkit][Genkit] | ⚠️ ||||| Supports resource list and lookup through tools. |
2626
| [GenAIScript][GenAIScript] |||||| Supports tools. |
2727
| [Goose][Goose] |||||| Supports tools. |
28+
| [gptme][gptme] |||||| Supports tools. |
2829
| [Klavis AI Slack/Discord/Web][Klavis AI] |||||| Supports tools and resources. |
2930
| [LibreChat][LibreChat] |||||| Supports tools for Agents |
31+
| [Lutra][Lutra] |||||| Supports any MCP server for reusable playbook creation. |
3032
| [mcp-agent][mcp-agent] |||| ⚠️ || Supports tools, server connection management, and agent workflows. |
3133
| [MCPHub][MCPHub] | ✅ | ✅ | ✅ | ❌ | ❌ | Supports tools, resources, and prompts in Neovim
3234
| [MCPOmni-Connect][MCPOmni-Connect] |||||| Supports tools with agentic mode, ReAct, and orchestrator capabilities. |
3335
| [Microsoft Copilot Studio] |||||| Supports tools |
36+
| [MindPal][MindPal] |||||| Supports tools for no-code AI agents and multi-agent workflows. |
3437
| [OpenSumi][OpenSumi] |||||| Supports tools in OpenSumi |
3538
| [oterm][oterm] |||||| Supports tools, prompts and sampling for Ollama. |
3639
| [Roo Code][Roo Code] |||||| Supports tools and resources. |
@@ -62,10 +65,12 @@ This page provides an overview of applications that support the Model Context Pr
6265
[GenAIScript]: https://microsoft.github.io/genaiscript/reference/scripts/mcp-tools/
6366
[Goose]: https://block.github.io/goose/docs/goose-architecture/#interoperability-with-extensions
6467
[LibreChat]: https://github.com/danny-avila/LibreChat
68+
[Lutra]: https://lutra.ai
6569
[mcp-agent]: https://github.com/lastmile-ai/mcp-agent
6670
[MCPHub]: https://github.com/ravitemer/mcphub.nvim
6771
[MCPOmni-Connect]: https://github.com/Abiorh001/mcp_omni_connect
6872
[Microsoft Copilot Studio]: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-mcp
73+
[MindPal]: https://mindpal.io
6974
[OpenSumi]: https://github.com/opensumi/core
7075
[oterm]: https://github.com/ggozad/oterm
7176
[Roo Code]: https://roocode.com
@@ -76,6 +81,7 @@ This page provides an overview of applications that support the Model Context Pr
7681
[TypingMind App]: https://www.typingmind.com
7782
[VS Code]: https://code.visualstudio.com/
7883
[Windsurf]: https://codeium.com/windsurf
84+
[gptme]: https://github.com/gptme/gptme
7985
[Witsy]: https://github.com/nbonamy/witsy
8086
[Zed]: https://zed.dev
8187
[Resources]: https://modelcontextprotocol.io/docs/concepts/resources
@@ -223,6 +229,15 @@ Programmatically assemble prompts for LLMs using [GenAIScript](https://microsoft
223229
- Goose allows you to extend its functionality by [building your own MCP servers](https://block.github.io/goose/docs/tutorials/custom-extensions).
224230
- Includes built-in tools for development, web scraping, automation, memory, and integrations with JetBrains and Google Drive.
225231

232+
### gptme
233+
[gptme](https://github.com/gptme/gptme) is a open-source terminal-based personal AI assistant/agent, designed to assist with programming tasks and general knowledge work.
234+
235+
**Key features:**
236+
- CLI-first design with a focus on simplicity and ease of use
237+
- Rich set of built-in tools for shell commands, Python execution, file operations, and web browsing
238+
- Local-first approach with support for multiple LLM providers
239+
- Open-source, built to be extensible and easy to modify
240+
226241
### Klavis AI Slack/Discord/Web
227242
[Klavis AI](https://www.klavis.ai/) is an Open-Source Infra to Use, Build & Scale MCPs with ease.
228243

@@ -245,6 +260,18 @@ Programmatically assemble prompts for LLMs using [GenAIScript](https://microsoft
245260
- Open-source and self-hostable, with secure multi-user support
246261
- Future roadmap includes expanded MCP feature support
247262

263+
### Lutra
264+
[Lutra](https://lutra.ai) is an AI agent that transforms conversations into actionable, automated workflows.
265+
266+
**Key features:**
267+
- Easy MCP Integration: Connecting Lutra to MCP servers is as simple as providing the server URL; Lutra handles the rest behind the scenes.
268+
- Chat to Take Action: Lutra understands your conversational context and goals, automatically integrating with your existing apps to perform tasks.
269+
- Reusable Playbooks: After completing a task, save the steps as reusable, automated workflows—simplifying repeatable processes and reducing manual effort.
270+
- Shareable Automations: Easily share your saved playbooks with teammates to standardize best practices and accelerate collaborative workflows.
271+
272+
**Learn more:**
273+
- [Lutra AI agent explained](https://www.youtube.com/watch?v=W5ZpN0cMY70)
274+
248275
### mcp-agent
249276
[mcp-agent] is a simple, composable framework to build agents using Model Context Protocol.
250277

@@ -282,6 +309,19 @@ Programmatically assemble prompts for LLMs using [GenAIScript](https://microsoft
282309
- Extend Copilot Studio agents with MCP servers
283310
- Leveraging Microsoft unified, governed, and secure API management solutions
284311

312+
### MindPal
313+
[MindPal](https://mindpal.io) is a no-code platform for building and running AI agents and multi-agent workflows for business processes.
314+
315+
**Key features:**
316+
- Build custom AI agents with no-code
317+
- Connect any SSE MCP server to extend agent tools
318+
- Create multi-agent workflows for complex business processes
319+
- User-friendly for both technical and non-technical professionals
320+
- Ongoing development with continuous improvement of MCP support
321+
322+
**Learn more:**
323+
- [MindPal MCP Documentation](https://docs.mindpal.io/agent/mcp)
324+
285325
### OpenSumi
286326
[OpenSumi](https://github.com/opensumi/core) is a framework helps you quickly build AI Native IDE products.
287327

docs/examples.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ To use an MCP server with Claude, add it to your configuration:
122122
- [Awesome MCP Servers](https://github.com/punkpeye/awesome-mcp-servers) - Curated list of MCP servers
123123
- [MCP CLI](https://github.com/wong2/mcp-cli) - Command-line inspector for testing MCP servers
124124
- [MCP Get](https://mcp-get.com) - Tool for installing and managing MCP servers
125+
- [Pipedream MCP](https://mcp.pipedream.com) - MCP servers with built-in auth for 3,000+ APIs and 10,000+ tools
125126
- [Supergateway](https://github.com/supercorp-ai/supergateway) - Run MCP stdio servers over SSE
126127
- [Zapier MCP](https://zapier.com/mcp) - MCP Server with over 7,000+ apps and 30,000+ actions
127128

docs/specification/draft/basic/authorization.mdx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ while maintaining simplicity:
4545
1. MCP authorization servers and MCP clients **SHOULD** support the OAuth 2.0 Dynamic Client Registration
4646
Protocol ([RFC7591](https://datatracker.ietf.org/doc/html/rfc7591)).
4747

48-
1. MCP servers **MUST** implement [OAuth 2.0 Protected Resource Metadata](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-resource-metadata-13).
48+
1. MCP servers **MUST** implement OAuth 2.0 Protected Resource Metadata ([RFC9728](https://datatracker.ietf.org/doc/html/rfc9728)).
4949
MCP clients **MUST** use OAuth 2.0 Protected Resource Metadata for authorization server discovery.
5050

5151
1. MCP authorization servers and MCP clients **MUST** implement OAuth 2.0 Authorization
@@ -82,16 +82,20 @@ authorization servers to MCP clients, as well as the discovery process through w
8282
clients can determine authorization server endpoints and supported capabilities.
8383

8484
### 2.3.1 Authorization Server Location
85-
MCP servers **MUST** implement the [OAuth 2.0 Protected Resource Metadata](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-resource-metadata-13)
85+
86+
MCP servers **MUST** implement OAuth 2.0 Protected Resource Metadata ([RFC9728](https://datatracker.ietf.org/doc/html/rfc9728))
8687
specification to indicate the locations of authorization servers. The Protected Resource Metadata document returned by the MCP server **MUST** include
8788
the `authorization_servers` field containing at least one authorization server.
8889

8990
The specific use of `authorization_servers` is beyond the scope of this specification; implementers should consult
90-
the [OAuth 2.0 Protected Resource Metadata](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-resource-metadata-13) documentation for
91+
OAuth 2.0 Protected Resource Metadata ([RFC9728](https://datatracker.ietf.org/doc/html/rfc9728)) for
9192
guidance on implementation details.
9293

94+
Implementors should note that Protected Resource Metadata documents can define multiple authorization servers. The responsibility for selecting which authorization server to use lies with the MCP client, following the guidelines specified in
95+
[RFC9728 Section 7.6 "Authorization Servers"](https://datatracker.ietf.org/doc/html/rfc9728#name-authorization-servers).
96+
9397
MCP servers **MUST** use the HTTP header `WWW-Authenticate` when returning a _401 Unauthorized_ to indicate the location of the resource server metadata URL
94-
as described in [OAuth 2.0 Protected Resource Metadata](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-resource-metadata-13).
98+
as described in OAuth 2.0 Protected Resource Metadata ([RFC9728](https://datatracker.ietf.org/doc/html/rfc9728)).
9599

96100
MCP clients **MUST** be able to parse `WWW-Authenticate` headers and respond appropriately to `HTTP 401 Unauthorized` responses from the MCP server.
97101

@@ -255,15 +259,14 @@ Servers **MUST** return appropriate HTTP status codes for authorization errors:
255259

256260
## 3. Security Considerations
257261

258-
Implementations **MUST** follow OAuth 2.1 security best practices. Refer to
259-
[RFC9700](https://datatracker.ietf.org/doc/html/rfc9700) for details.
262+
Implementations **MUST** follow OAuth 2.1 security best practices as laid out in [Section 7. Security Considerations](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-12#name-security-considerations).
260263

261264
### 3.1 Token Theft
262265
Attackers who obtain tokens stored by the client, or tokens cached or logged on the server can access protected resources with
263266
requests that appear legitimate to resource servers.
264267

265268
Clients **MUST** implement secure token storage and follow OAuth 2.0 best practices,
266-
as outlined in [RFC 9700](https://datatracker.ietf.org/doc/html/rfc9700).
269+
as outlined in [OAuth 2.1, section 7.1](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-12#section-7.1).
267270

268271
MCP authorization servers SHOULD enforce token expiration and rotation to limit the window of exploitation.
269272

@@ -278,7 +281,7 @@ Specifically:
278281

279282
### 3.3 Authorization Code Protection
280283

281-
An attacker who has gained access to an authorization code contained in an authorization response can try to redeem the authorization code for an access token or otherwise make use of the authorization code. (Further described in [RFC 9700 Section 4.5](https://www.rfc-editor.org/rfc/rfc9700.html#name-authorization-code-injectio))
284+
An attacker who has gained access to an authorization code contained in an authorization response can try to redeem the authorization code for an access token or otherwise make use of the authorization code. (Further described in [OAuth 2.1, section 7.5](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-12#section-7.5))
282285

283286
MCP clients **MUST** implement PKCE according to [OAuth 2.1 section 7.5.2](https://www.ietf.org/archive/id/draft-ietf-oauth-v2-1-12.html#name-countermeasures). PKCE helps prevent authorization code interception attacks by requiring clients to create a secret verifier-challenge pair, ensuring that only the original requestor can exchange an authorization code for tokens.
284287

@@ -293,7 +296,7 @@ Authorization servers **MUST** validate exact redirect URIs against pre-register
293296
MCP clients **SHOULD** use and verify state parameters in the authorization code flow
294297
and discard any results that do not include or have a mis-match with the original state.
295298

296-
Authorization servers **MUST** take precautions to prevent redirecting user agents to untrusted URI's, following suggestions laid out in [RFC 9700 Section 4.11.2](https://www.rfc-editor.org/rfc/rfc9700.html#section-4.11.2)
299+
Authorization servers **MUST** take precautions to prevent redirecting user agents to untrusted URI's, following suggestions laid out in [OAuth 2.1, Section 7.12.2](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-12#section-7.12.2)
297300

298301
Authorization servers **SHOULD** only automatically redirect the user agent if it trusts the redirection URI. If the URI is not trusted, the authorization server MAY inform the user and rely on the user to make the correct decision.
299302

@@ -302,4 +305,4 @@ Authorization servers **SHOULD** only automatically redirect the user agent if i
302305
Attackers can exploit MCP servers acting as intermediaries to third-party APIs, leading to confused deputy vulnerabilities. By using stolen authorization codes, they can obtain access tokens without user consent. See [Security Best Practices 2.1](/specification/draft/basic/security_best_practices) for details.
303306

304307
MCP proxy servers using static client IDs **MUST** obtain user consent for each dynamically
305-
registered client before forwarding to third-party authorization servers (which may require additional consent).
308+
registered client before forwarding to third-party authorization servers (which may require additional consent).

docs/specification/draft/basic/transports.mdx

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ In the **stdio** transport:
2424
- The client launches the MCP server as a subprocess.
2525
- The server reads JSON-RPC messages from its standard input (`stdin`) and sends messages
2626
to its standard output (`stdout`).
27-
- Messages may be JSON-RPC requests, notifications, responses—or a JSON-RPC
28-
[batch](https://www.jsonrpc.org/specification#batch) containing one or more requests
29-
and/or notifications.
27+
- Messages are individual JSON-RPC requests, notifications, or responses.
3028
- Messages are delimited by newlines, and **MUST NOT** contain embedded newlines.
3129
- The server **MAY** write UTF-8 strings to its standard error (`stderr`) for logging
3230
purposes. Clients **MAY** capture, forward, or ignore this logging.
@@ -85,35 +83,27 @@ MCP endpoint.
8583
1. The client **MUST** use HTTP POST to send JSON-RPC messages to the MCP endpoint.
8684
2. The client **MUST** include an `Accept` header, listing both `application/json` and
8785
`text/event-stream` as supported content types.
88-
3. The body of the POST request **MUST** be one of the following:
89-
- A single JSON-RPC _request_, _notification_, or _response_
90-
- An array [batching](https://www.jsonrpc.org/specification#batch) one or more
91-
_requests and/or notifications_
92-
- An array [batching](https://www.jsonrpc.org/specification#batch) one or more
93-
_responses_
94-
4. If the input consists solely of (any number of) JSON-RPC _responses_ or
95-
_notifications_:
86+
3. The body of the POST request **MUST** be a single JSON-RPC _request_, _notification_, or _response_.
87+
4. If the input is a JSON-RPC _response_ or _notification_:
9688
- If the server accepts the input, the server **MUST** return HTTP status code 202
9789
Accepted with no body.
9890
- If the server cannot accept the input, it **MUST** return an HTTP error status code
9991
(e.g., 400 Bad Request). The HTTP response body **MAY** comprise a JSON-RPC _error
10092
response_ that has no `id`.
101-
5. If the input contains any number of JSON-RPC _requests_, the server **MUST** either
93+
5. If the input is a JSON-RPC _request_, the server **MUST** either
10294
return `Content-Type: text/event-stream`, to initiate an SSE stream, or
10395
`Content-Type: application/json`, to return one JSON object. The client **MUST**
10496
support both these cases.
10597
6. If the server initiates an SSE stream:
106-
- The SSE stream **SHOULD** eventually include one JSON-RPC _response_ per each
107-
JSON-RPC _request_ sent in the POST body. These _responses_ **MAY** be
108-
[batched](https://www.jsonrpc.org/specification#batch).
109-
- The server **MAY** send JSON-RPC _requests_ and _notifications_ before sending a
98+
- The SSE stream **SHOULD** eventually include JSON-RPC _response_ for the
99+
JSON-RPC _request_ sent in the POST body.
100+
- The server **MAY** send JSON-RPC _requests_ and _notifications_ before sending the
110101
JSON-RPC _response_. These messages **SHOULD** relate to the originating client
111-
_request_. These _requests_ and _notifications_ **MAY** be
112-
[batched](https://www.jsonrpc.org/specification#batch).
113-
- The server **SHOULD NOT** close the SSE stream before sending a JSON-RPC _response_
114-
per each received JSON-RPC _request_, unless the [session](#session-management)
102+
_request_.
103+
- The server **SHOULD NOT** close the SSE stream before sending the JSON-RPC _response_
104+
for the received JSON-RPC _request_, unless the [session](#session-management)
115105
expires.
116-
- After all JSON-RPC _responses_ have been sent, the server **SHOULD** close the SSE
106+
- After the JSON-RPC _response_ has been sent, the server **SHOULD** close the SSE
117107
stream.
118108
- Disconnection **MAY** occur at any time (e.g., due to network conditions).
119109
Therefore:
@@ -133,9 +123,7 @@ MCP endpoint.
133123
this HTTP GET, or else return HTTP 405 Method Not Allowed, indicating that the server
134124
does not offer an SSE stream at this endpoint.
135125
4. If the server initiates an SSE stream:
136-
- The server **MAY** send JSON-RPC _requests_ and _notifications_ on the stream. These
137-
_requests_ and _notifications_ **MAY** be
138-
[batched](https://www.jsonrpc.org/specification#batch).
126+
- The server **MAY** send JSON-RPC _requests_ and _notifications_ on the stream.
139127
- These messages **SHOULD** be unrelated to any concurrently-running JSON-RPC
140128
_request_ from the client.
141129
- The server **MUST NOT** send a JSON-RPC _response_ on the stream **unless**

docs/specification/draft/changelog.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ the previous revision, [2025-03-26](/specification/2025-03-26).
77

88
## Major changes
99

10-
1. TODO
10+
1. Removed support for JSON-RPC **[batching](https://www.jsonrpc.org/specification#batch)**
11+
(PR [#416](https://github.com/modelcontextprotocol/specification/pull/416))
12+
2. TODO
1113

1214
## Other schema changes
1315

0 commit comments

Comments
 (0)