Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions direct-tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@ export function resolveDirectTools(

if (!toolFilter) continue;

const excludeSet = definition.excludeTools ? new Set(definition.excludeTools) : null;

for (const tool of serverCache.tools ?? []) {
if (excludeSet && (excludeSet.has(tool.name) || excludeSet.has(formatToolName(tool.name, serverName, prefix)))) continue;
if (toolFilter !== true && !toolFilter.includes(tool.name)) continue;
const prefixedName = formatToolName(tool.name, serverName, prefix);
if (BUILTIN_NAMES.has(prefixedName)) {
Expand All @@ -92,6 +95,7 @@ export function resolveDirectTools(
if (definition.exposeResources !== false) {
for (const resource of serverCache.resources ?? []) {
const baseName = `get_${resourceNameToToolName(resource.name)}`;
if (excludeSet && (excludeSet.has(baseName) || excludeSet.has(formatToolName(baseName, serverName, prefix)))) continue;
if (toolFilter !== true && !toolFilter.includes(baseName)) continue;
const prefixedName = formatToolName(baseName, serverName, prefix);
if (BUILTIN_NAMES.has(prefixedName)) {
Expand Down
2 changes: 1 addition & 1 deletion init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export async function initializeMcp(
}

if (cache?.servers?.[name] && isServerCacheValid(cache.servers[name], definition)) {
const metadata = reconstructToolMetadata(name, cache.servers[name], prefix, definition.exposeResources);
const metadata = reconstructToolMetadata(name, cache.servers[name], prefix, definition.exposeResources, definition.excludeTools);
toolMetadata.set(name, metadata);
}
}
Expand Down
6 changes: 6 additions & 0 deletions mcp-panel.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { matchesKey, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
import type { McpConfig, McpPanelCallbacks, McpPanelResult, ServerProvenance } from "./types.js";
import { resourceNameToToolName } from "./resource-tools.js";
import { formatToolName } from "./types.js";
import type { MetadataCache, ServerCacheEntry, CachedTool } from "./metadata-cache.js";

interface PanelTheme {
Expand Down Expand Up @@ -145,9 +146,13 @@ class McpPanel {
toolFilter = globalDirect;
}

const prefix = config.settings?.toolPrefix ?? "server";
const excludeSet = definition.excludeTools ? new Set(definition.excludeTools) : null;

const tools: ToolState[] = [];
if (serverCache) {
for (const tool of serverCache.tools ?? []) {
if (excludeSet && (excludeSet.has(tool.name) || excludeSet.has(formatToolName(tool.name, serverName, prefix)))) continue;
const isDirect = toolFilter === true || (Array.isArray(toolFilter) && toolFilter.includes(tool.name));
tools.push({
name: tool.name,
Expand All @@ -160,6 +165,7 @@ class McpPanel {
if (definition.exposeResources !== false) {
for (const resource of serverCache.resources ?? []) {
const baseName = `get_${resourceNameToToolName(resource.name)}`;
if (excludeSet && (excludeSet.has(baseName) || excludeSet.has(formatToolName(baseName, serverName, prefix)))) continue;
const isDirect = toolFilter === true || (Array.isArray(toolFilter) && toolFilter.includes(baseName));
const ct: CachedTool = { name: baseName, description: resource.description };
tools.push({
Expand Down
6 changes: 5 additions & 1 deletion metadata-cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,15 @@ export function reconstructToolMetadata(
serverName: string,
entry: ServerCacheEntry,
prefix: "server" | "none" | "short",
exposeResources?: boolean
exposeResources?: boolean,
excludeTools?: string[]
): ToolMetadata[] {
const metadata: ToolMetadata[] = [];
const excludeSet = excludeTools ? new Set(excludeTools) : null;

for (const tool of entry.tools ?? []) {
if (!tool?.name) continue;
if (excludeSet && (excludeSet.has(tool.name) || excludeSet.has(formatToolName(tool.name, serverName, prefix)))) continue;
metadata.push({
name: formatToolName(tool.name, serverName, prefix),
originalName: tool.name,
Expand All @@ -135,6 +138,7 @@ export function reconstructToolMetadata(
for (const resource of entry.resources ?? []) {
if (!resource?.name || !resource?.uri) continue;
const baseName = `get_${resourceNameToToolName(resource.name)}`;
if (excludeSet && (excludeSet.has(baseName) || excludeSet.has(formatToolName(baseName, serverName, prefix)))) continue;
metadata.push({
name: formatToolName(baseName, serverName, prefix),
originalName: baseName,
Expand Down
4 changes: 4 additions & 0 deletions tool-metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,14 @@ export function buildToolMetadata(
const metadata: ToolMetadata[] = [];
const failedTools: string[] = [];

const excludeSet = definition.excludeTools ? new Set(definition.excludeTools) : null;

for (const tool of tools) {
if (!tool?.name) {
failedTools.push("(unnamed)");
continue;
}
if (excludeSet && (excludeSet.has(tool.name) || excludeSet.has(formatToolName(tool.name, serverName, prefix)))) continue;
let uiResourceUri: string | undefined;
try {
uiResourceUri = getToolUiResourceUri({ _meta: tool._meta });
Expand All @@ -39,6 +42,7 @@ export function buildToolMetadata(
if (definition.exposeResources !== false) {
for (const resource of resources) {
const baseName = `get_${resourceNameToToolName(resource.name)}`;
if (excludeSet && (excludeSet.has(baseName) || excludeSet.has(formatToolName(baseName, serverName, prefix)))) continue;
metadata.push({
name: formatToolName(baseName, serverName, prefix),
originalName: baseName,
Expand Down
1 change: 1 addition & 0 deletions types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ export interface ServerEntry {
exposeResources?: boolean;
// Direct tool registration
directTools?: boolean | string[];
excludeTools?: string[];
// Debug
debug?: boolean; // Show server stderr (default: false)
}
Expand Down