Skip to content

Commit b91ef5d

Browse files
committed
Implement message blocking for ignored tools in mcpProxy
1 parent 714e3e1 commit b91ef5d

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

src/lib/utils.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,14 @@ export function log(str: string, ...rest: unknown[]) {
8181
}
8282

8383
type Message = any
84+
const MESSAGE_BLOCKED = Symbol('MessageBlocked')
85+
const isMessageBlocked = (value: any): value is typeof MESSAGE_BLOCKED => value === MESSAGE_BLOCKED
8486

8587
export function createMessageTransformer({
8688
transformRequestFunction,
8789
transformResponseFunction,
8890
}: {
89-
transformRequestFunction?: null | ((request: Message) => Message)
91+
transformRequestFunction?: null | ((request: Message) => Message | typeof MESSAGE_BLOCKED)
9092
transformResponseFunction?: null | ((request: Message, response: Message) => Message)
9193
} = {}) {
9294
const pendingRequests = new Map<string, Message>()
@@ -129,7 +131,27 @@ export function mcpProxy({
129131
let transportToServerClosed = false
130132

131133
const messageTransformer = createMessageTransformer({
132-
transformRequestFunction: null,
134+
transformRequestFunction: (request: Message) => {
135+
// Block tools/call for ignored tools
136+
if (request.method === 'tools/call' && request.params?.name) {
137+
const toolName = request.params.name
138+
if (!shouldIncludeTool(ignoredTools, toolName)) {
139+
// Send error response back to client immediately
140+
const errorResponse = {
141+
jsonrpc: '2.0' as const,
142+
id: request.id,
143+
error: {
144+
code: -32603,
145+
message: `Tool "${toolName}" is not available`,
146+
},
147+
}
148+
transportToClient.send(errorResponse).catch(onClientError)
149+
// Return symbol to indicate this request should not be forwarded
150+
return MESSAGE_BLOCKED
151+
}
152+
}
153+
return request
154+
},
133155
transformResponseFunction: (req: Message, res: Message) => {
134156
if (req.method === 'tools/list') {
135157
return {
@@ -147,6 +169,12 @@ export function mcpProxy({
147169
transportToClient.onmessage = (_message) => {
148170
// TODO: fix types
149171
const message = messageTransformer.interceptRequest(_message as any)
172+
173+
// If interceptor returns MESSAGE_BLOCKED, don't forward the message
174+
if (isMessageBlocked(message)) {
175+
return
176+
}
177+
150178
log('[Local→Remote]', message.method || message.id)
151179

152180
if (DEBUG) {

0 commit comments

Comments
 (0)