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: 2 additions & 2 deletions src/server.web.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { getTableauServerInfo } from './getTableauServerInfo';
import { Server } from './server';
import { getTableauAuthInfo } from './server/oauth/getTableauAuthInfo';
import { TableauAuthInfo } from './server/oauth/schemas.js';
import { Tool } from './tools/tool.js';
import { WebTool } from './tools/tool.web.js';
import { TableauRequestHandlerExtra } from './tools/toolContext.js';
import { webToolNames } from './tools/toolName.web.js';
import { toolFactories } from './tools/tools.js';
Expand Down Expand Up @@ -80,7 +80,7 @@ export class WebMcpServer extends Server {

protected _getToolsToRegister = async (
tableauAuthInfo?: TableauAuthInfo,
): Promise<Array<Tool<any>>> => {
): Promise<Array<WebTool<any>>> => {
const config = getConfig();
const configOverrides = await getConfigWithOverrides({
restApiArgs: {
Expand Down
6 changes: 3 additions & 3 deletions src/tools/contentExploration/searchContent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
searchContentFilterSchema,
} from '../../sdks/tableau/types/contentExploration.js';
import { WebMcpServer } from '../../server.web.js';
import { Tool } from '../tool.js';
import { WebTool } from '../tool.web.js';
import {
buildFilterString,
buildOrderByString,
Expand All @@ -24,8 +24,8 @@ const paramsSchema = {
filter: searchContentFilterSchema.optional(),
};

export const getSearchContentTool = (server: WebMcpServer): Tool<typeof paramsSchema> => {
const searchContentTool = new Tool({
export const getSearchContentTool = (server: WebMcpServer): WebTool<typeof paramsSchema> => {
const searchContentTool = new WebTool({
server,
name: 'search-content',
description: `
Expand Down
2 changes: 1 addition & 1 deletion src/tools/contentExploration/searchContentUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
SearchContentFilter,
SearchContentResponse,
} from '../../sdks/tableau/types/contentExploration.js';
import { ConstrainedResult } from '../tool.js';
import { ConstrainedResult } from '../tool.web.js';

export type ReducedSearchContentResponse = Partial<Record<SearchItemContent, unknown>>;

Expand Down
6 changes: 3 additions & 3 deletions src/tools/getDatasourceMetadata/getDatasourceMetadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { WebMcpServer } from '../../server.web.js';
import { getResultForTableauVersion } from '../../utils/isTableauVersionAtLeast.js';
import { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';
import { resourceAccessChecker } from '../resourceAccessChecker.js';
import { Tool, ToolRules } from '../tool.js';
import { ToolRules, WebTool } from '../tool.web.js';
import { combineFields, simplifyReadMetadataResult } from './datasourceMetadataUtils.js';

export const getGraphqlQuery = (datasourceLuid: string): string => `
Expand Down Expand Up @@ -99,9 +99,9 @@ export type GetDatasourceMetadataError =
export const getGetDatasourceMetadataTool = (
server: WebMcpServer,
productVersion: ProductVersion,
): Tool<typeof paramsSchema> => {
): WebTool<typeof paramsSchema> => {
const rules = getDatasourceMetadataRules(productVersion);
const getDatasourceMetadataTool = new Tool({
const getDatasourceMetadataTool = new WebTool({
server,
name: 'get-datasource-metadata',
description: `
Expand Down
6 changes: 3 additions & 3 deletions src/tools/listDatasources/listDatasources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { DataSource } from '../../sdks/tableau/types/dataSource.js';
import { WebMcpServer } from '../../server.web.js';
import { paginate } from '../../utils/paginate.js';
import { genericFilterDescription } from '../genericFilterDescription.js';
import { ConstrainedResult, Tool } from '../tool.js';
import { ConstrainedResult, WebTool } from '../tool.web.js';
import { parseAndValidateDatasourcesFilterString } from './datasourcesFilterUtils.js';

const paramsSchema = {
Expand All @@ -17,8 +17,8 @@ const paramsSchema = {
limit: z.number().gt(0).optional(),
};

export const getListDatasourcesTool = (server: WebMcpServer): Tool<typeof paramsSchema> => {
const listDatasourcesTool = new Tool({
export const getListDatasourcesTool = (server: WebMcpServer): WebTool<typeof paramsSchema> => {
const listDatasourcesTool = new WebTool({
server,
name: 'list-datasources',
description: `
Expand Down
2 changes: 1 addition & 1 deletion src/tools/pulse/constrainPulseDefinitions.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { BoundedContext } from '../../overridableConfig.js';
import { PulseMetricDefinition } from '../../sdks/tableau/types/pulse.js';
import { ConstrainedResult } from '../tool.js';
import { ConstrainedResult } from '../tool.web.js';

export function constrainPulseDefinitions({
boundedContext,
Expand Down
2 changes: 1 addition & 1 deletion src/tools/pulse/constrainPulseMetrics.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { BoundedContext } from '../../overridableConfig.js';
import { PulseMetric } from '../../sdks/tableau/types/pulse.js';
import { ConstrainedResult } from '../tool.js';
import { ConstrainedResult } from '../tool.web.js';

export function constrainPulseMetrics({
metrics,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@ import {
PulseInsightBriefResponse,
} from '../../../sdks/tableau/types/pulse.js';
import { WebMcpServer } from '../../../server.web.js';
import { Tool } from '../../tool.js';
import { WebTool } from '../../tool.web.js';

const paramsSchema = {
briefRequest: pulseInsightBriefRequestSchema,
};

export const getGeneratePulseInsightBriefTool = (
server: WebMcpServer,
): Tool<typeof paramsSchema> => {
const generatePulseInsightBriefTool = new Tool({
): WebTool<typeof paramsSchema> => {
const generatePulseInsightBriefTool = new WebTool({
server,
name: 'generate-pulse-insight-brief',
description: `
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
pulseInsightBundleTypeEnum,
} from '../../../sdks/tableau/types/pulse.js';
import { WebMcpServer } from '../../../server.web.js';
import { Tool } from '../../tool.js';
import { WebTool } from '../../tool.web.js';

const paramsSchema = {
bundleRequest: pulseBundleRequestSchema,
Expand All @@ -18,8 +18,8 @@ const paramsSchema = {

export const getGeneratePulseMetricValueInsightBundleTool = (
server: WebMcpServer,
): Tool<typeof paramsSchema> => {
const generatePulseMetricValueInsightBundleTool = new Tool({
): WebTool<typeof paramsSchema> => {
const generatePulseMetricValueInsightBundleTool = new WebTool({
server,
name: 'generate-pulse-metric-value-insight-bundle',
description: `
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ describe('listAllPulseMetricDefinitionsTool', () => {
});

it('should create a tool instance with correct properties', () => {
const listAllPulseMetricDefinitionsTool = getListAllPulseMetricDefinitionsTool(new WebMcpServer());
const listAllPulseMetricDefinitionsTool = getListAllPulseMetricDefinitionsTool(
new WebMcpServer(),
);
expect(listAllPulseMetricDefinitionsTool.name).toBe('list-all-pulse-metric-definitions');
expect(listAllPulseMetricDefinitionsTool.description).toContain(
'Retrieves a list of all published Pulse Metric Definitions',
Expand Down Expand Up @@ -131,7 +133,9 @@ describe('listAllPulseMetricDefinitionsTool', () => {
async function getToolResult(params: {
view?: 'DEFINITION_VIEW_BASIC' | 'DEFINITION_VIEW_FULL' | 'DEFINITION_VIEW_DEFAULT';
}): Promise<CallToolResult> {
const listAllPulseMetricDefinitionsTool = getListAllPulseMetricDefinitionsTool(new WebMcpServer());
const listAllPulseMetricDefinitionsTool = getListAllPulseMetricDefinitionsTool(
new WebMcpServer(),
);
const callback = await Provider.from(listAllPulseMetricDefinitionsTool.callback);
return await callback(
{ view: params.view, limit: undefined, pageSize: undefined },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
} from '../../../sdks/tableau/types/pulse.js';
import { WebMcpServer } from '../../../server.web.js';
import { pulsePaginate } from '../../../utils/paginate.js';
import { Tool } from '../../tool.js';
import { WebTool } from '../../tool.web.js';
import { constrainPulseDefinitions } from '../constrainPulseDefinitions.js';

const paramsSchema = {
Expand All @@ -20,8 +20,8 @@ const paramsSchema = {

export const getListAllPulseMetricDefinitionsTool = (
server: WebMcpServer,
): Tool<typeof paramsSchema> => {
const listAllPulseMetricDefinitionsTool = new Tool({
): WebTool<typeof paramsSchema> => {
const listAllPulseMetricDefinitionsTool = new WebTool({
server,
name: 'list-all-pulse-metric-definitions',
description: `
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { z } from 'zod';
import { useRestApi } from '../../../restApiInstance.js';
import { pulseMetricDefinitionViewEnum } from '../../../sdks/tableau/types/pulse.js';
import { WebMcpServer } from '../../../server.web.js';
import { Tool } from '../../tool.js';
import { WebTool } from '../../tool.web.js';
import { constrainPulseDefinitions } from '../constrainPulseDefinitions.js';

const paramsSchema = {
Expand All @@ -14,8 +14,8 @@ const paramsSchema = {

export const getListPulseMetricDefinitionsFromDefinitionIdsTool = (
server: WebMcpServer,
): Tool<typeof paramsSchema> => {
const listPulseMetricDefinitionsFromDefinitionIdsTool = new Tool({
): WebTool<typeof paramsSchema> => {
const listPulseMetricDefinitionsFromDefinitionIdsTool = new WebTool({
server,
name: 'list-pulse-metric-definitions-from-definition-ids',
description: `
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import { PulseMetricSubscription } from '../../../sdks/tableau/types/pulse.js';
import { WebMcpServer } from '../../../server.web.js';
import { getRequiredApiScopesForTool } from '../../../server/oauth/scopes.js';
import { getExceptionMessage } from '../../../utils/getExceptionMessage.js';
import { ConstrainedResult, Tool } from '../../tool.js';
import { ConstrainedResult, WebTool } from '../../tool.web.js';

const toolName = 'list-pulse-metric-subscriptions';
const paramsSchema = {};

export const getListPulseMetricSubscriptionsTool = (
server: WebMcpServer,
): Tool<typeof paramsSchema> => {
const listPulseMetricSubscriptionsTool = new Tool({
): WebTool<typeof paramsSchema> => {
const listPulseMetricSubscriptionsTool = new WebTool({
server,
name: toolName,
description: `
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { z } from 'zod';
import { useRestApi } from '../../../restApiInstance.js';
import { PulseMetric } from '../../../sdks/tableau/types/pulse.js';
import { WebMcpServer } from '../../../server.web.js';
import { Tool } from '../../tool.js';
import { WebTool } from '../../tool.web.js';
import { constrainPulseMetrics } from '../constrainPulseMetrics.js';

const paramsSchema = {
Expand All @@ -13,8 +13,8 @@ const paramsSchema = {

export const getListPulseMetricsFromMetricDefinitionIdTool = (
server: WebMcpServer,
): Tool<typeof paramsSchema> => {
const listPulseMetricsFromMetricDefinitionIdTool = new Tool({
): WebTool<typeof paramsSchema> => {
const listPulseMetricsFromMetricDefinitionIdTool = new WebTool({
server,
name: 'list-pulse-metrics-from-metric-definition-id',
description: `
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ describe('listPulseMetricsFromMetricIdsTool', () => {
});

it('should create a tool instance with correct properties', () => {
const listPulseMetricsFromMetricIdsTool = getListPulseMetricsFromMetricIdsTool(new WebMcpServer());
const listPulseMetricsFromMetricIdsTool = getListPulseMetricsFromMetricIdsTool(
new WebMcpServer(),
);
expect(listPulseMetricsFromMetricIdsTool.name).toBe('list-pulse-metrics-from-metric-ids');
expect(listPulseMetricsFromMetricIdsTool.description).toContain(
'Retrieves a list of published Pulse Metrics from a list of metric IDs',
Expand Down Expand Up @@ -106,7 +108,9 @@ describe('listPulseMetricsFromMetricIdsTool', () => {
});

async function getToolResult(params: { metricIds: string[] }): Promise<CallToolResult> {
const listPulseMetricsFromMetricIdsTool = getListPulseMetricsFromMetricIdsTool(new WebMcpServer());
const listPulseMetricsFromMetricIdsTool = getListPulseMetricsFromMetricIdsTool(
new WebMcpServer(),
);
const callback = await Provider.from(listPulseMetricsFromMetricIdsTool.callback);
return await callback(params, getMockRequestHandlerExtra());
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { z } from 'zod';

import { useRestApi } from '../../../restApiInstance.js';
import { WebMcpServer } from '../../../server.web.js';
import { Tool } from '../../tool.js';
import { WebTool } from '../../tool.web.js';
import { constrainPulseMetrics } from '../constrainPulseMetrics.js';

const paramsSchema = {
Expand All @@ -12,8 +12,8 @@ const paramsSchema = {

export const getListPulseMetricsFromMetricIdsTool = (
server: WebMcpServer,
): Tool<typeof paramsSchema> => {
const listPulseMetricsFromMetricIdsTool = new Tool({
): WebTool<typeof paramsSchema> => {
const listPulseMetricsFromMetricIdsTool = new WebTool({
server,
name: 'list-pulse-metrics-from-metric-ids',
description: `
Expand Down
6 changes: 3 additions & 3 deletions src/tools/queryDatasource/queryDatasource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { getResultForTableauVersion } from '../../utils/isTableauVersionAtLeast.
import { Provider } from '../../utils/provider.js';
import { getVizqlDataServiceDisabledError } from '../getVizqlDataServiceDisabledError.js';
import { resourceAccessChecker } from '../resourceAccessChecker.js';
import { Tool, ToolRules } from '../tool.js';
import { ToolRules, WebTool } from '../tool.web.js';
import { getDatasourceCredentials } from './datasourceCredentials.js';
import { queryDatasourceToolDescription20253 } from './descriptions/queryDescription.2025.3.js';
import { queryDatasourceToolDescription20261 } from './descriptions/queryDescription.2026.1.js';
Expand Down Expand Up @@ -52,9 +52,9 @@ type QueryDatasourceResult = QueryOutput & {
export const getQueryDatasourceTool = (
server: WebMcpServer,
productVersion: ProductVersion,
): Tool<typeof paramsSchema> => {
): WebTool<typeof paramsSchema> => {
const rules = getQueryDatasourceRules(productVersion);
const queryDatasourceTool = new Tool({
const queryDatasourceTool = new WebTool({
server,
name: 'query-datasource',
description: new Provider(() =>
Expand Down
2 changes: 1 addition & 1 deletion src/tools/queryDatasource/queryDatasourceValidator.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Query, querySchema } from '../../sdks/tableau/apis/vizqlDataServiceApi.js';
import { ToolRules } from '../tool.js';
import { ToolRules } from '../tool.web.js';
import { validateDatasourceLuid } from '../validateDatasourceLuid.js';
import { validateFields } from './validators/validateFields.js';
import { validateFilters } from './validators/validateFilters.js';
Expand Down
2 changes: 1 addition & 1 deletion src/tools/queryDatasource/validators/validateFilters.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Err, Ok, Result } from 'ts-results-es';

import { Filter, FilterField } from '../../../sdks/tableau/apis/vizqlDataServiceApi.js';
import { ToolRules } from '../../tool.js';
import { ToolRules } from '../../tool.web.js';
import { hasFieldCaptionAndCalculation, hasFunctionAndCalculation } from './validateFields.js';

export function validateFilters(filters: Filter[] | undefined, rules: ToolRules): void {
Expand Down
6 changes: 3 additions & 3 deletions src/tools/resetConsent/resetConsent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { getConfig } from '../../config.js';
import { McpToolError } from '../../errors/mcpToolError.js';
import { WebMcpServer } from '../../server.web.js';
import invariant from '../../utils/invariant.js';
import { Tool } from '../tool.js';
import { WebTool } from '../tool.web.js';

const paramsSchema = {};

Expand All @@ -27,10 +27,10 @@ const paramsSchema = {};
* Important: call this tool BEFORE revoking the access token, since revocation
* invalidates the token required to authenticate the reset consent request.
*/
export const getResetConsentTool = (server: WebMcpServer): Tool<typeof paramsSchema> => {
export const getResetConsentTool = (server: WebMcpServer): WebTool<typeof paramsSchema> => {
const config = getConfig();

const resetConsentTool = new Tool({
const resetConsentTool = new WebTool({
server,
name: 'reset-consent',
description: `Resets saved OAuth consent for the current user on the Tableau authorization server.
Expand Down
6 changes: 3 additions & 3 deletions src/tools/revokeAccessToken/revokeAccessToken.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { getConfig } from '../../config.js';
import { McpToolError } from '../../errors/mcpToolError.js';
import { WebMcpServer } from '../../server.web.js';
import invariant from '../../utils/invariant.js';
import { Tool } from '../tool.js';
import { WebTool } from '../tool.web.js';

const paramsSchema = {};

Expand All @@ -26,10 +26,10 @@ const paramsSchema = {};
* Not supported (returns runtime error):
* - Passthrough: session credentials are managed externally.
*/
export const getRevokeAccessTokenTool = (server: WebMcpServer): Tool<typeof paramsSchema> => {
export const getRevokeAccessTokenTool = (server: WebMcpServer): WebTool<typeof paramsSchema> => {
const config = getConfig();

const revokeAccessTokenTool = new Tool({
const revokeAccessTokenTool = new WebTool({
server,
name: 'revoke-access-token',
description: `Revokes the access token used to authenticate the current session.
Expand Down
Loading