[v1.x backport] Allow servers / clients to advertise extensions in the capability object (#1811)
This commit is contained in:
parent
7213816788
commit
5608e78dd0
4 changed files with 77 additions and 2 deletions
5
.changeset/add-extensions-capability.md
Normal file
5
.changeset/add-extensions-capability.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
'@modelcontextprotocol/sdk': minor
|
||||
---
|
||||
|
||||
Add `extensions` field to `ClientCapabilities` and `ServerCapabilities` to allow servers and clients to advertise extension support per SEP-2133
|
||||
|
|
@ -383,6 +383,10 @@ export interface ClientCapabilities {
|
|||
};
|
||||
};
|
||||
};
|
||||
/**
|
||||
* Extensions that the client supports. Keys are extension identifiers (vendor-prefix/extension-name).
|
||||
*/
|
||||
extensions?: { [key: string]: object };
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -461,6 +465,10 @@ export interface ServerCapabilities {
|
|||
};
|
||||
};
|
||||
};
|
||||
/**
|
||||
* Extensions that the server supports. Keys are extension identifiers (vendor-prefix/extension-name).
|
||||
*/
|
||||
extensions?: { [key: string]: object };
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
12
src/types.ts
12
src/types.ts
|
|
@ -511,7 +511,11 @@ export const ClientCapabilitiesSchema = z.object({
|
|||
/**
|
||||
* Present if the client supports task creation.
|
||||
*/
|
||||
tasks: ClientTasksCapabilitySchema.optional()
|
||||
tasks: ClientTasksCapabilitySchema.optional(),
|
||||
/**
|
||||
* Extensions that the client supports. Keys are extension identifiers (vendor-prefix/extension-name).
|
||||
*/
|
||||
extensions: z.record(z.string(), AssertObjectSchema).optional()
|
||||
});
|
||||
|
||||
export const InitializeRequestParamsSchema = BaseRequestParamsSchema.extend({
|
||||
|
|
@ -589,7 +593,11 @@ export const ServerCapabilitiesSchema = z.object({
|
|||
/**
|
||||
* Present if the server supports task creation.
|
||||
*/
|
||||
tasks: ServerTasksCapabilitySchema.optional()
|
||||
tasks: ServerTasksCapabilitySchema.optional(),
|
||||
/**
|
||||
* Extensions that the server supports. Keys are extension identifiers (vendor-prefix/extension-name).
|
||||
*/
|
||||
extensions: z.record(z.string(), AssertObjectSchema).optional()
|
||||
});
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -198,6 +198,60 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => {
|
|||
message: 'Completed step 3 of 3'
|
||||
});
|
||||
});
|
||||
|
||||
/***
|
||||
* Test: Extensions capability registration
|
||||
*/
|
||||
test('should register and advertise server extensions capability', async () => {
|
||||
const mcpServer = new McpServer({
|
||||
name: 'test server',
|
||||
version: '1.0'
|
||||
});
|
||||
const client = new Client({
|
||||
name: 'test client',
|
||||
version: '1.0'
|
||||
});
|
||||
|
||||
mcpServer.server.registerCapabilities({
|
||||
extensions: {
|
||||
'io.modelcontextprotocol/test-extension': { listChanged: true }
|
||||
}
|
||||
});
|
||||
|
||||
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
||||
await Promise.all([client.connect(clientTransport), mcpServer.connect(serverTransport)]);
|
||||
|
||||
const capabilities = client.getServerCapabilities();
|
||||
expect(capabilities?.extensions).toBeDefined();
|
||||
expect(capabilities?.extensions?.['io.modelcontextprotocol/test-extension']).toEqual({ listChanged: true });
|
||||
});
|
||||
|
||||
test('should advertise client extensions capability to server', async () => {
|
||||
const mcpServer = new McpServer({
|
||||
name: 'test server',
|
||||
version: '1.0'
|
||||
});
|
||||
const client = new Client(
|
||||
{
|
||||
name: 'test client',
|
||||
version: '1.0'
|
||||
},
|
||||
{
|
||||
capabilities: {
|
||||
extensions: {
|
||||
'io.modelcontextprotocol/test-extension': { streaming: true }
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
||||
await Promise.all([client.connect(clientTransport), mcpServer.connect(serverTransport)]);
|
||||
|
||||
const capabilities = mcpServer.server.getClientCapabilities();
|
||||
expect(capabilities?.extensions).toBeDefined();
|
||||
expect(capabilities?.extensions?.['io.modelcontextprotocol/test-extension']).toEqual({ streaming: true });
|
||||
});
|
||||
});
|
||||
|
||||
describe('ResourceTemplate', () => {
|
||||
|
|
|
|||
Loading…
Reference in a new issue