fix(repository-plugin): reject incomplete MCP publication
This commit is contained in:
@@ -23,6 +23,8 @@ import type { JsonSchemaNode, JsonValue } from '@deepseek-ai/dsh-tools'
|
||||
|
||||
/** Resolved options relevant to tool bridging. */
|
||||
export interface ToolBridgeOptions {
|
||||
/** Whether a registry conflict is contained or rejects this synchronization. */
|
||||
registrationFailure: 'contain' | 'throw'
|
||||
serverName: string
|
||||
toolCallTimeoutMs: number
|
||||
}
|
||||
@@ -111,8 +113,9 @@ export function publicToolName(serverName: string, rawName: string): string {
|
||||
* 2. Swap: dispose the previous generation, register the new one. A registry
|
||||
* conflict here can only mean a foreign registration squats on this
|
||||
* server's `mcp__<serverName>__` namespace — the partial generation is
|
||||
* rolled back (zero tools from this server), the error is logged, and an
|
||||
* empty map is returned.
|
||||
* rolled back (zero tools from this server) and logged. Initial strict
|
||||
* synchronization may propagate the conflict so its parent transaction
|
||||
* rejects; ordinary clients and later re-syncs return an empty map.
|
||||
*
|
||||
* @param client - Connected MCP Client instance used to list and call tools.
|
||||
* @param ctx - Cordis context providing the `tools` service for registration.
|
||||
@@ -164,6 +167,7 @@ export async function syncTools(
|
||||
// sees either the full generation or none of it — never a partial set.
|
||||
for (const dispose of disposers.values()) dispose()
|
||||
ctx.logger.error(`mcp-client(${opts.serverName}): tool registration failed, no tools registered: ${String(error)}`)
|
||||
if (opts.registrationFailure === 'throw') throw error
|
||||
return new Map()
|
||||
}
|
||||
return disposers
|
||||
|
||||
Reference in New Issue
Block a user