@@ -81,12 +81,14 @@ export function log(str: string, ...rest: unknown[]) {
81
81
}
82
82
83
83
type Message = any
84
+ const MESSAGE_BLOCKED = Symbol ( 'MessageBlocked' )
85
+ const isMessageBlocked = ( value : any ) : value is typeof MESSAGE_BLOCKED => value === MESSAGE_BLOCKED
84
86
85
87
export function createMessageTransformer ( {
86
88
transformRequestFunction,
87
89
transformResponseFunction,
88
90
} : {
89
- transformRequestFunction ?: null | ( ( request : Message ) => Message )
91
+ transformRequestFunction ?: null | ( ( request : Message ) => Message | typeof MESSAGE_BLOCKED )
90
92
transformResponseFunction ?: null | ( ( request : Message , response : Message ) => Message )
91
93
} = { } ) {
92
94
const pendingRequests = new Map < string , Message > ( )
@@ -129,7 +131,27 @@ export function mcpProxy({
129
131
let transportToServerClosed = false
130
132
131
133
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
+ } ,
133
155
transformResponseFunction : ( req : Message , res : Message ) => {
134
156
if ( req . method === 'tools/list' ) {
135
157
return {
@@ -147,6 +169,12 @@ export function mcpProxy({
147
169
transportToClient . onmessage = ( _message ) => {
148
170
// TODO: fix types
149
171
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
+
150
178
log ( '[Local→Remote]' , message . method || message . id )
151
179
152
180
if ( DEBUG ) {
0 commit comments