@tableau/mcp-server 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- "use strict";var He=Object.create;var H=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty;var Ge=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ke(t))!je.call(e,i)&&i!==r&&H(e,i,{get:()=>t[i],enumerable:!(o=Ke(t,i))||o.enumerable});return e};var Fe=(e,t,r)=>(r=e!=null?He(Ye(e)):{},Ge(t||!e||!e.__esModule?H(r,"default",{value:e,enumerable:!0}):r,e));var q=Fe(require("dotenv"));var J=require("path");var d=require("fs"),$=require("path");var Be;var K=()=>Be;var We=["debug","info","notice","warning","error","critical","alert","emergency"],T=Object.fromEntries(We.map((e,t)=>[e,t]));var $e=["fileLogger","appLogger"],Je=new Set($e);function ze(e,t){return T[e]>=T[t]}function qe(e){return e in T}function k(e){let t=e?.trim();return t&&qe(t)?t:"info"}function Y(e){return e?new Set(e.split(",").map(t=>t.trim()).filter(t=>Je.has(t))):new Set(["appLogger"])}function y(e){let t=g();if(ze(e.level,t.logLevel)){if(t.loggers.has("appLogger")){let r=JSON.stringify(e);t.transport==="http"?e.error?console.log(r,e.error):console.log(r):process.stderr.write(r.endsWith(`
1
+ "use strict";var Ke=Object.create;var H=Object.defineProperty;var ke=Object.getOwnPropertyDescriptor;var Ye=Object.getOwnPropertyNames;var je=Object.getPrototypeOf,Ge=Object.prototype.hasOwnProperty;var Fe=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ye(t))!Ge.call(e,i)&&i!==r&&H(e,i,{get:()=>t[i],enumerable:!(o=ke(t,i))||o.enumerable});return e};var We=(e,t,r)=>(r=e!=null?Ke(je(e)):{},Fe(t||!e||!e.__esModule?H(r,"default",{value:e,enumerable:!0}):r,e));var q=We(require("dotenv"));var J=require("path");var d=require("fs"),$=require("path");var Be;var K=()=>Be;var $e=["debug","info","notice","warning","error","critical","alert","emergency"],T=Object.fromEntries($e.map((e,t)=>[e,t]));var Je=["fileLogger","appLogger"],ze=new Set(Je);function qe(e,t){return T[e]>=T[t]}function Qe(e){return e in T}function k(e){let t=e?.trim();return t&&Qe(t)?t:"info"}function Y(e){return e?new Set(e.split(",").map(t=>t.trim()).filter(t=>ze.has(t))):new Set(["appLogger"])}function S(e){let t=E();if(qe(e.level,t.logLevel)){if(t.loggers.has("appLogger")){let r=JSON.stringify(e);t.transport==="http"?e.error?console.log(r,e.error):console.log(r):process.stderr.write(r.endsWith(`
2
2
  `)?r:`${r}
3
- `)}t.loggers.has("fileLogger")&&K()?.log(e)}}var n=require("zod"),bt=n.z.record(n.z.string(),n.z.union([n.z.string(),n.z.number(),n.z.boolean(),n.z.undefined()])),Ze=n.z.enum(["noop","custom"]),Qe=n.z.object({provider:n.z.literal("noop")}),A=n.z.object({module:n.z.string({required_error:'Custom provider requires "module" path'})}).passthrough(),Xe=n.z.object({provider:n.z.literal("custom"),providerConfig:A}),Lt=n.z.discriminatedUnion("provider",[Qe,Xe]);function j(e){return Ze.safeParse(e).success}var et=["stdio","http"];function G(e){return!!et.find(t=>t===e)}function F(){if(typeof __dirname=="string")return __dirname;throw new Error("__dirname is not set")}function s(e,t){if(!e)throw new Error(t||"Invariant Violation")}function a(e,{defaultValue:t,minValue:r,maxValue:o}={defaultValue:0,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.POSITIVE_INFINITY}){if(!e)return t;let i=parseFloat(e);return isNaN(i)||r!==void 0&&i<r||o!==void 0&&i>o?t:i}var tt=F(),B=10*60*1e3,S=60*60*1e3,jt=24*60*60*1e3,W=30*24*60*60*1e3,rt=365.25*24*60*60*1e3,ot=["pat","uat","direct-trust","oauth"];function it(e){return ot.some(t=>t===e)}var I=class{auth;server;transport;sslKey;sslCert;httpPort;corsOriginConfig;siteName;patName;patValue;jwtUsername;connectedAppClientId;connectedAppSecretId;connectedAppSecretValue;uatTenantId;uatIssuer;uatUsernameClaimName;uatPrivateKey;uatKeyId;jwtAdditionalPayload;datasourceCredentials;defaultNotificationLevel;logLevel;disableLogMasking;maxRequestTimeoutMs;disableSessionManagement;loggers;fileLoggerDirectory;tableauServerVersionCheckIntervalInHours;passthroughAuthUserSessionCheckIntervalInMinutes;mcpSiteSettingsCheckIntervalInMinutes;enableMcpSiteSettings;enablePassthroughAuth;oauth;telemetry;latencyMetricName;productTelemetryEndpoint;productTelemetryEnabled;isHyperforce;breakGlassDisableGlobally;constructor(){let t=at(process.env),{AUTH:r,SERVER:o,SITE_NAME:i,TRANSPORT:m,SSL_KEY:Z,SSL_CERT:Q,HTTP_PORT_ENV_VAR_NAME:X,CORS_ORIGIN_CONFIG:ee,PAT_NAME:P,PAT_VALUE:b,JWT_SUB_CLAIM:p,CONNECTED_APP_CLIENT_ID:L,CONNECTED_APP_SECRET_ID:R,CONNECTED_APP_SECRET_VALUE:N,UAT_TENANT_ID:w,UAT_ISSUER:C,UAT_USERNAME_CLAIM_NAME:te,UAT_USERNAME_CLAIM:O,UAT_PRIVATE_KEY:E,UAT_PRIVATE_KEY_PATH:l,UAT_KEY_ID:re,JWT_ADDITIONAL_PAYLOAD:oe,DATASOURCE_CREDENTIALS:ie,DEFAULT_NOTIFICATION_LEVEL:ne,LOG_LEVEL:se,DISABLE_LOG_MASKING:ae,MAX_REQUEST_TIMEOUT_MS:le,DISABLE_SESSION_MANAGEMENT:ue,ENABLED_LOGGERS:me,FILE_LOGGER_DIRECTORY:de,TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS:pe,PASSTHROUGH_AUTH_USER_SESSION_CHECK_INTERVAL_IN_MINUTES:ce,MCP_SITE_SETTINGS_CHECK_INTERVAL_IN_MINUTES:he,ENABLE_MCP_SITE_SETTINGS:Te,ENABLE_PASSTHROUGH_AUTH:ge,DANGEROUSLY_DISABLE_OAUTH:Ee,OAUTH_EMBEDDED_AUTHZ_SERVER:_e,OAUTH_ISSUER:c,OAUTH_LOCK_SITE:fe,OAUTH_JWE_PRIVATE_KEY:ve,OAUTH_JWE_PRIVATE_KEY_PATH:ye,OAUTH_JWE_PRIVATE_KEY_PASSPHRASE:Ae,OAUTH_RESOURCE_URI:Se,OAUTH_REDIRECT_URI:Ie,OAUTH_CLIENT_ID_SECRET_PAIRS:_,OAUTH_CIMD_DNS_SERVERS:U,ADVERTISE_API_SCOPES:Pe,OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS:be,OAUTH_ACCESS_TOKEN_TIMEOUT_MS:Le,OAUTH_REFRESH_TOKEN_TIMEOUT_MS:Re,OAUTH_DISABLE_SCOPES:Ne,TELEMETRY_PROVIDER:M,TELEMETRY_PROVIDER_CONFIG:V,LATENCY_METRIC_NAME:we,PRODUCT_TELEMETRY_ENDPOINT:Ce,PRODUCT_TELEMETRY_ENABLED:Oe,IS_HYPERFORCE:Ue,BREAK_GLASS_DISABLE_GLOBALLY:Me}=t,f="";this.siteName=i??"",this.sslKey=Z?.trim()??"",this.sslCert=Q?.trim()??"",this.httpPort=a(t[X?.trim()||"PORT"],{defaultValue:3927,minValue:1,maxValue:65535}),this.corsOriginConfig=st(ee?.trim()??""),this.datasourceCredentials=ie??"",this.defaultNotificationLevel=ne??"debug",this.logLevel=k(se),this.disableLogMasking=ae==="true",this.disableSessionManagement=ue==="true",this.loggers=Y(me),this.fileLoggerDirectory=de||(0,$.join)(tt,"logs"),this.tableauServerVersionCheckIntervalInHours=a(pe,{defaultValue:1,minValue:1,maxValue:24*7}),this.passthroughAuthUserSessionCheckIntervalInMinutes=a(ce,{defaultValue:10,minValue:0,maxValue:60*24}),this.mcpSiteSettingsCheckIntervalInMinutes=a(he,{defaultValue:10,minValue:1,maxValue:60*24}),this.enableMcpSiteSettings=Te!=="false",this.enablePassthroughAuth=ge==="true";let v=Ee==="true",Ve=!(Ne==="true"),xe=_e!=="false";if(this.oauth={enabled:v?!1:!!c,embeddedAuthzServer:xe,issuer:c??"",resourceUri:Se??`http://127.0.0.1:${this.httpPort}`,redirectUri:Ie||(c?`${c}/Callback`:""),lockSite:fe!=="false",jwePrivateKey:ve??"",jwePrivateKeyPath:ye??"",jwePrivateKeyPassphrase:Ae||void 0,dnsServers:U?U.split(",").map(h=>h.trim()):["1.1.1.1","1.0.0.1"],authzCodeTimeoutMs:a(be,{defaultValue:B,minValue:0,maxValue:S}),accessTokenTimeoutMs:a(Le,{defaultValue:S,minValue:0,maxValue:W}),refreshTokenTimeoutMs:a(Re,{defaultValue:W,minValue:0,maxValue:rt}),clientIdSecretPairs:_?_.split(",").reduce((h,De)=>{let[x,D]=De.split(":");return x&&D&&(h[x]=D),h},{}):null,enforceScopes:Ve,advertiseApiScopes:Pe==="true"},this.oauth.clientIdSecretPairs&&Object.keys(this.oauth.clientIdSecretPairs).length===0)throw new Error(`OAUTH_CLIENT_ID_SECRET_PAIRS is in an invalid format: ${_}. Should be in the format: clientId:secret`);if((j(M)?M:"noop")==="custom"){if(!V)throw new Error('TELEMETRY_PROVIDER_CONFIG is required when TELEMETRY_PROVIDER is "custom"');this.telemetry={provider:"custom",providerConfig:A.parse(JSON.parse(V))}}else this.telemetry={provider:"noop"};if(this.latencyMetricName=we||"http_server_1agg1_request_duration",this.productTelemetryEndpoint=Ce||"https://prod.telemetry.tableausoftware.com",this.productTelemetryEnabled=Oe!=="false",this.isHyperforce=Ue==="true",this.breakGlassDisableGlobally=Me==="true",this.auth=it(r)?r:this.oauth.enabled?"oauth":"pat",this.transport=G(m)?m:this.oauth.enabled?"http":"stdio",this.transport==="http"&&!v&&!this.oauth.issuer)throw new Error('OAUTH_ISSUER must be set when TRANSPORT is "http" unless DANGEROUSLY_DISABLE_OAUTH is "true"');if(this.auth==="oauth"){if(v)throw new Error('When AUTH is "oauth", DANGEROUSLY_DISABLE_OAUTH cannot be "true"');if(!this.oauth.issuer)throw new Error('When AUTH is "oauth", OAUTH_ISSUER must be set')}else s(o,"The environment variable SERVER is not set"),nt(o);if(this.oauth.enabled){if(this.oauth.embeddedAuthzServer){if(s(this.oauth.redirectUri,"The environment variable OAUTH_REDIRECT_URI is not set"),!this.oauth.jwePrivateKey&&!this.oauth.jwePrivateKeyPath)throw new Error("One of the environment variables: OAUTH_JWE_PRIVATE_KEY_PATH or OAUTH_JWE_PRIVATE_KEY must be set");if(this.oauth.jwePrivateKey&&this.oauth.jwePrivateKeyPath)throw new Error("Only one of the environment variables: OAUTH_JWE_PRIVATE_KEY or OAUTH_JWE_PRIVATE_KEY_PATH must be set");if(this.oauth.jwePrivateKeyPath&&process.env.TABLEAU_MCP_TEST!=="true"&&!(0,d.existsSync)(this.oauth.jwePrivateKeyPath))throw new Error(`OAuth JWE private key path does not exist: ${this.oauth.jwePrivateKeyPath}`)}if(this.transport==="stdio")throw new Error('TRANSPORT must be "http" when OAUTH_ISSUER is set')}if(this.maxRequestTimeoutMs=a(le,{defaultValue:B,minValue:5e3,maxValue:S}),this.auth==="pat")s(P,"The environment variable PAT_NAME is not set"),s(b,"The environment variable PAT_VALUE is not set");else if(this.auth==="direct-trust")s(p,"The environment variable JWT_SUB_CLAIM is not set"),s(L,"The environment variable CONNECTED_APP_CLIENT_ID is not set"),s(R,"The environment variable CONNECTED_APP_SECRET_ID is not set"),s(N,"The environment variable CONNECTED_APP_SECRET_VALUE is not set"),f=p??"";else if(this.auth==="uat"){if(s(w,"The environment variable UAT_TENANT_ID is not set"),s(C,"The environment variable UAT_ISSUER is not set"),!O&&!p)throw new Error("One of the environment variables: UAT_USERNAME_CLAIM or JWT_SUB_CLAIM must be set");if(f=O??p??"",!E&&!l)throw new Error("One of the environment variables: UAT_PRIVATE_KEY_PATH or UAT_PRIVATE_KEY must be set");if(E&&l)throw new Error("Only one of the environment variables: UAT_PRIVATE_KEY or UAT_PRIVATE_KEY_PATH must be set");if(l&&process.env.TABLEAU_MCP_TEST!=="true"&&!(0,d.existsSync)(l))throw new Error(`UAT private key path does not exist: ${l}`)}this.server=o??"",this.patName=P??"",this.patValue=b??"",this.jwtUsername=f??"",this.connectedAppClientId=L??"",this.connectedAppSecretId=R??"",this.connectedAppSecretValue=N??"",this.uatTenantId=w??"",this.uatIssuer=C??"",this.uatUsernameClaimName=te||"email",this.uatPrivateKey=E||(l?(0,d.readFileSync)(l,"utf8"):""),this.uatKeyId=re??"",this.jwtAdditionalPayload=oe||"{}"}};function nt(e){if(!["https://","http://"].find(t=>e.startsWith(t)))throw new Error(`The environment variable SERVER must start with "http://" or "https://": ${e}`);try{let t=new URL(e)}catch(t){let r=t instanceof Error?t.message:String(t);throw new Error(`The environment variable SERVER is not a valid URL: ${e} -- ${r}`)}}function st(e){if(!e)return!0;if(e.match(/^true|false$/i))return e.toLowerCase()==="true";if(e==="*")return"*";if(e.startsWith("[")&&e.endsWith("]"))try{return JSON.parse(e).map(r=>new URL(r).origin)}catch{throw new Error(`The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${e}`)}try{return new URL(e).origin}catch{throw new Error(`The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${e}`)}}function at(e){return Object.entries(e).reduce((t,[r,o])=>(o?.startsWith("${user_config.")?t[r]="":t[r]=o,t),{})}var g=()=>new I;var u=class{initialize(){}recordMetric(t,r,o){}recordHistogram(t,r,o){}};function lt(e){return Object.getOwnPropertyNames(e.prototype).filter(t=>t!=="constructor"&&typeof e.prototype[t]=="function")}function ut(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function mt(e){if(!ut(e))throw new Error("Provider must be an object");let r=lt(u).filter(o=>typeof e[o]!="function");if(r.length>0)throw new Error(`Custom provider missing required methods: ${r.join(", ")}`)}function z(){let e=g(),t;try{switch(e.telemetry.provider){case"custom":t=dt(e.telemetry.providerConfig);break;case"noop":t=new u;break}return t.initialize(),global.__telemetryProvider=t,t}catch(r){y({message:"Failed to initialize telemetry provider",level:"error",logger:"telemetry",error:r}),y({message:"Falling back to NoOp telemetry provider",level:"info",logger:"telemetry"});let o=new u;return o.initialize(),global.__telemetryProvider=o,o}}function dt(e){if(!e?.module)throw new Error(`Custom telemetry provider requires "module" in providerConfig. Example: TELEMETRY_PROVIDER_CONFIG='{"module":"./my-telemetry.js"}'`);let t=e.module;if(typeof t!="string")throw new Error('Custom telemetry provider requires "module" to be a string');let r;t.startsWith(".")||t.startsWith("/")?r=(0,J.resolve)(process.cwd(),t):r=t;try{let o=require(r),i=o.default||o.TelemetryProvider;if(!i)throw new Error(`Module ${t} must export a default class or named export "TelemetryProvider" that implements the TelemetryProvider interface`);let m=new i(e);return mt(m),m}catch(o){let i=`Failed to load custom telemetry provider from "${t}". `;throw o instanceof Error&&"code"in o&&o.code==="MODULE_NOT_FOUND"?i+="Module not found. If using a file path, ensure the file exists and the path is correct. If using an npm package, ensure it is installed.":i+=`Error: ${o}`,new Error(i)}}q.default.config();try{z()}catch(e){console.warn("Failed to initialize telemetry:",e)}
3
+ `)}t.loggers.has("fileLogger")&&K()?.log(e)}}var n=require("zod"),Lt=n.z.record(n.z.string(),n.z.union([n.z.string(),n.z.number(),n.z.boolean(),n.z.undefined()])),Ze=n.z.enum(["noop","custom"]),Xe=n.z.object({provider:n.z.literal("noop")}),A=n.z.object({module:n.z.string({required_error:'Custom provider requires "module" path'})}).passthrough(),et=n.z.object({provider:n.z.literal("custom"),providerConfig:A}),Rt=n.z.discriminatedUnion("provider",[Xe,et]);function j(e){return Ze.safeParse(e).success}var tt=["stdio","http"];function G(e){return!!tt.find(t=>t===e)}function F(){if(typeof __dirname=="string")return __dirname;throw new Error("__dirname is not set")}function s(e,t){if(!e)throw new Error(t||"Invariant Violation")}function a(e,{defaultValue:t,minValue:r,maxValue:o}={defaultValue:0,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.POSITIVE_INFINITY}){if(!e)return t;let i=parseFloat(e);return isNaN(i)||r!==void 0&&i<r||o!==void 0&&i>o?t:i}var rt=F(),W=10*60*1e3,y=60*60*1e3,Gt=24*60*60*1e3,B=30*24*60*60*1e3,ot=365.25*24*60*60*1e3,it=["pat","uat","direct-trust","oauth"];function nt(e){return it.some(t=>t===e)}var I=class{auth;server;transport;sslKey;sslCert;httpPort;corsOriginConfig;siteName;patName;patValue;jwtUsername;connectedAppClientId;connectedAppSecretId;connectedAppSecretValue;uatTenantId;uatIssuer;uatUsernameClaimName;uatPrivateKey;uatKeyId;jwtAdditionalPayload;datasourceCredentials;defaultNotificationLevel;logLevel;disableLogMasking;maxRequestTimeoutMs;disableSessionManagement;loggers;fileLoggerDirectory;tableauServerVersionCheckIntervalInHours;passthroughAuthUserSessionCheckIntervalInMinutes;mcpSiteSettingsCheckIntervalInMinutes;enableMcpSiteSettings;allowSitesToConfigureRequestOverrides;enablePassthroughAuth;oauth;telemetry;latencyMetricName;productTelemetryEndpoint;productTelemetryEnabled;isHyperforce;breakGlassDisableGlobally;constructor(){let t=lt(process.env),{AUTH:r,SERVER:o,SITE_NAME:i,TRANSPORT:m,SSL_KEY:Q,SSL_CERT:Z,HTTP_PORT_ENV_VAR_NAME:X,CORS_ORIGIN_CONFIG:ee,PAT_NAME:P,PAT_VALUE:b,JWT_SUB_CLAIM:p,CONNECTED_APP_CLIENT_ID:L,CONNECTED_APP_SECRET_ID:R,CONNECTED_APP_SECRET_VALUE:O,UAT_TENANT_ID:N,UAT_ISSUER:C,UAT_USERNAME_CLAIM_NAME:te,UAT_USERNAME_CLAIM:w,UAT_PRIVATE_KEY:g,UAT_PRIVATE_KEY_PATH:l,UAT_KEY_ID:re,JWT_ADDITIONAL_PAYLOAD:oe,DATASOURCE_CREDENTIALS:ie,DEFAULT_NOTIFICATION_LEVEL:ne,LOG_LEVEL:se,DISABLE_LOG_MASKING:ae,MAX_REQUEST_TIMEOUT_MS:le,DISABLE_SESSION_MANAGEMENT:ue,ENABLED_LOGGERS:me,FILE_LOGGER_DIRECTORY:de,TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS:pe,PASSTHROUGH_AUTH_USER_SESSION_CHECK_INTERVAL_IN_MINUTES:ce,MCP_SITE_SETTINGS_CHECK_INTERVAL_IN_MINUTES:he,ENABLE_MCP_SITE_SETTINGS:Te,ALLOW_SITES_TO_CONFIGURE_REQUEST_OVERRIDES:Ee,ENABLE_PASSTHROUGH_AUTH:ge,DANGEROUSLY_DISABLE_OAUTH:_e,OAUTH_EMBEDDED_AUTHZ_SERVER:fe,OAUTH_ISSUER:c,OAUTH_LOCK_SITE:ve,OAUTH_JWE_PRIVATE_KEY:Se,OAUTH_JWE_PRIVATE_KEY_PATH:Ae,OAUTH_JWE_PRIVATE_KEY_PASSPHRASE:ye,OAUTH_RESOURCE_URI:Ie,OAUTH_REDIRECT_URI:Pe,OAUTH_CLIENT_ID_SECRET_PAIRS:_,OAUTH_CIMD_DNS_SERVERS:U,ADVERTISE_API_SCOPES:be,OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS:Le,OAUTH_ACCESS_TOKEN_TIMEOUT_MS:Re,OAUTH_REFRESH_TOKEN_TIMEOUT_MS:Oe,OAUTH_DISABLE_SCOPES:Ne,TELEMETRY_PROVIDER:M,TELEMETRY_PROVIDER_CONFIG:V,LATENCY_METRIC_NAME:Ce,PRODUCT_TELEMETRY_ENDPOINT:we,PRODUCT_TELEMETRY_ENABLED:Ue,IS_HYPERFORCE:Me,BREAK_GLASS_DISABLE_GLOBALLY:Ve}=t,f="";this.siteName=i??"",this.sslKey=Q?.trim()??"",this.sslCert=Z?.trim()??"",this.httpPort=a(t[X?.trim()||"PORT"],{defaultValue:3927,minValue:1,maxValue:65535}),this.corsOriginConfig=at(ee?.trim()??""),this.datasourceCredentials=ie??"",this.defaultNotificationLevel=ne??"debug",this.logLevel=k(se),this.disableLogMasking=ae==="true",this.disableSessionManagement=ue==="true",this.loggers=Y(me),this.fileLoggerDirectory=de||(0,$.join)(rt,"logs"),this.tableauServerVersionCheckIntervalInHours=a(pe,{defaultValue:1,minValue:1,maxValue:24*7}),this.passthroughAuthUserSessionCheckIntervalInMinutes=a(ce,{defaultValue:10,minValue:0,maxValue:60*24}),this.mcpSiteSettingsCheckIntervalInMinutes=a(he,{defaultValue:10,minValue:1,maxValue:60*24}),this.enableMcpSiteSettings=Te!=="false",this.allowSitesToConfigureRequestOverrides=Ee==="true",this.enablePassthroughAuth=ge==="true";let v=_e==="true",xe=!(Ne==="true"),De=fe!=="false";if(this.allowSitesToConfigureRequestOverrides&&!this.enableMcpSiteSettings)throw new Error('ALLOW_SITES_TO_CONFIGURE_REQUEST_OVERRIDES is "true", but MCP site settings are not enabled.');if(this.oauth={enabled:v?!1:!!c,embeddedAuthzServer:De,issuer:c??"",resourceUri:Ie??`http://127.0.0.1:${this.httpPort}`,redirectUri:Pe||(c?`${c}/Callback`:""),lockSite:ve!=="false",jwePrivateKey:Se??"",jwePrivateKeyPath:Ae??"",jwePrivateKeyPassphrase:ye||void 0,dnsServers:U?U.split(",").map(h=>h.trim()):["1.1.1.1","1.0.0.1"],authzCodeTimeoutMs:a(Le,{defaultValue:W,minValue:0,maxValue:y}),accessTokenTimeoutMs:a(Re,{defaultValue:y,minValue:0,maxValue:B}),refreshTokenTimeoutMs:a(Oe,{defaultValue:B,minValue:0,maxValue:ot}),clientIdSecretPairs:_?_.split(",").reduce((h,He)=>{let[x,D]=He.split(":");return x&&D&&(h[x]=D),h},{}):null,enforceScopes:xe,advertiseApiScopes:be==="true"},this.oauth.clientIdSecretPairs&&Object.keys(this.oauth.clientIdSecretPairs).length===0)throw new Error(`OAUTH_CLIENT_ID_SECRET_PAIRS is in an invalid format: ${_}. Should be in the format: clientId:secret`);if((j(M)?M:"noop")==="custom"){if(!V)throw new Error('TELEMETRY_PROVIDER_CONFIG is required when TELEMETRY_PROVIDER is "custom"');this.telemetry={provider:"custom",providerConfig:A.parse(JSON.parse(V))}}else this.telemetry={provider:"noop"};if(this.latencyMetricName=Ce||"http_server_1agg1_request_duration",this.productTelemetryEndpoint=we||"https://prod.telemetry.tableausoftware.com",this.productTelemetryEnabled=Ue!=="false",this.isHyperforce=Me==="true",this.breakGlassDisableGlobally=Ve==="true",this.auth=nt(r)?r:this.oauth.enabled?"oauth":"pat",this.transport=G(m)?m:this.oauth.enabled?"http":"stdio",this.transport==="http"&&!v&&!this.oauth.issuer)throw new Error('OAUTH_ISSUER must be set when TRANSPORT is "http" unless DANGEROUSLY_DISABLE_OAUTH is "true"');if(this.auth==="oauth"){if(v)throw new Error('When AUTH is "oauth", DANGEROUSLY_DISABLE_OAUTH cannot be "true"');if(!this.oauth.issuer)throw new Error('When AUTH is "oauth", OAUTH_ISSUER must be set')}else s(o,"The environment variable SERVER is not set"),st(o);if(this.oauth.enabled){if(this.oauth.embeddedAuthzServer){if(s(this.oauth.redirectUri,"The environment variable OAUTH_REDIRECT_URI is not set"),!this.oauth.jwePrivateKey&&!this.oauth.jwePrivateKeyPath)throw new Error("One of the environment variables: OAUTH_JWE_PRIVATE_KEY_PATH or OAUTH_JWE_PRIVATE_KEY must be set");if(this.oauth.jwePrivateKey&&this.oauth.jwePrivateKeyPath)throw new Error("Only one of the environment variables: OAUTH_JWE_PRIVATE_KEY or OAUTH_JWE_PRIVATE_KEY_PATH must be set");if(this.oauth.jwePrivateKeyPath&&process.env.TABLEAU_MCP_TEST!=="true"&&!(0,d.existsSync)(this.oauth.jwePrivateKeyPath))throw new Error(`OAuth JWE private key path does not exist: ${this.oauth.jwePrivateKeyPath}`)}if(this.transport==="stdio")throw new Error('TRANSPORT must be "http" when OAUTH_ISSUER is set')}if(this.maxRequestTimeoutMs=a(le,{defaultValue:W,minValue:5e3,maxValue:y}),this.auth==="pat")s(P,"The environment variable PAT_NAME is not set"),s(b,"The environment variable PAT_VALUE is not set");else if(this.auth==="direct-trust")s(p,"The environment variable JWT_SUB_CLAIM is not set"),s(L,"The environment variable CONNECTED_APP_CLIENT_ID is not set"),s(R,"The environment variable CONNECTED_APP_SECRET_ID is not set"),s(O,"The environment variable CONNECTED_APP_SECRET_VALUE is not set"),f=p??"";else if(this.auth==="uat"){if(s(N,"The environment variable UAT_TENANT_ID is not set"),s(C,"The environment variable UAT_ISSUER is not set"),!w&&!p)throw new Error("One of the environment variables: UAT_USERNAME_CLAIM or JWT_SUB_CLAIM must be set");if(f=w??p??"",!g&&!l)throw new Error("One of the environment variables: UAT_PRIVATE_KEY_PATH or UAT_PRIVATE_KEY must be set");if(g&&l)throw new Error("Only one of the environment variables: UAT_PRIVATE_KEY or UAT_PRIVATE_KEY_PATH must be set");if(l&&process.env.TABLEAU_MCP_TEST!=="true"&&!(0,d.existsSync)(l))throw new Error(`UAT private key path does not exist: ${l}`)}this.server=o??"",this.patName=P??"",this.patValue=b??"",this.jwtUsername=f??"",this.connectedAppClientId=L??"",this.connectedAppSecretId=R??"",this.connectedAppSecretValue=O??"",this.uatTenantId=N??"",this.uatIssuer=C??"",this.uatUsernameClaimName=te||"email",this.uatPrivateKey=g||(l?(0,d.readFileSync)(l,"utf8"):""),this.uatKeyId=re??"",this.jwtAdditionalPayload=oe||"{}"}};function st(e){if(!["https://","http://"].find(t=>e.startsWith(t)))throw new Error(`The environment variable SERVER must start with "http://" or "https://": ${e}`);try{let t=new URL(e)}catch(t){let r=t instanceof Error?t.message:String(t);throw new Error(`The environment variable SERVER is not a valid URL: ${e} -- ${r}`)}}function at(e){if(!e)return!0;if(e.match(/^true|false$/i))return e.toLowerCase()==="true";if(e==="*")return"*";if(e.startsWith("[")&&e.endsWith("]"))try{return JSON.parse(e).map(r=>new URL(r).origin)}catch{throw new Error(`The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${e}`)}try{return new URL(e).origin}catch{throw new Error(`The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${e}`)}}function lt(e){return Object.entries(e).reduce((t,[r,o])=>(o?.startsWith("${user_config.")?t[r]="":t[r]=o,t),{})}var E=()=>new I;var u=class{initialize(){}recordMetric(t,r,o){}recordHistogram(t,r,o){}};function ut(e){return Object.getOwnPropertyNames(e.prototype).filter(t=>t!=="constructor"&&typeof e.prototype[t]=="function")}function mt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function dt(e){if(!mt(e))throw new Error("Provider must be an object");let r=ut(u).filter(o=>typeof e[o]!="function");if(r.length>0)throw new Error(`Custom provider missing required methods: ${r.join(", ")}`)}function z(){let e=E(),t;try{switch(e.telemetry.provider){case"custom":t=pt(e.telemetry.providerConfig);break;case"noop":t=new u;break}return t.initialize(),global.__telemetryProvider=t,t}catch(r){S({message:"Failed to initialize telemetry provider",level:"error",logger:"telemetry",error:r}),S({message:"Falling back to NoOp telemetry provider",level:"info",logger:"telemetry"});let o=new u;return o.initialize(),global.__telemetryProvider=o,o}}function pt(e){if(!e?.module)throw new Error(`Custom telemetry provider requires "module" in providerConfig. Example: TELEMETRY_PROVIDER_CONFIG='{"module":"./my-telemetry.js"}'`);let t=e.module;if(typeof t!="string")throw new Error('Custom telemetry provider requires "module" to be a string');let r;t.startsWith(".")||t.startsWith("/")?r=(0,J.resolve)(process.cwd(),t):r=t;try{let o=require(r),i=o.default||o.TelemetryProvider;if(!i)throw new Error(`Module ${t} must export a default class or named export "TelemetryProvider" that implements the TelemetryProvider interface`);let m=new i(e);return dt(m),m}catch(o){let i=`Failed to load custom telemetry provider from "${t}". `;throw o instanceof Error&&"code"in o&&o.code==="MODULE_NOT_FOUND"?i+="Module not found. If using a file path, ensure the file exists and the path is correct. If using an npm package, ensure it is installed.":i+=`Error: ${o}`,new Error(i)}}q.default.config();try{z()}catch(e){console.warn("Failed to initialize telemetry:",e)}
4
4
  //# sourceMappingURL=tracing.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/telemetry/tracing.ts", "../../src/telemetry/init.ts", "../../src/config.ts", "../../src/logging/fileLogger.ts", "../../src/logging/types.ts", "../../src/logging/logger.ts", "../../src/telemetry/types.ts", "../../src/transports.ts", "../../src/utils/getDirname.ts", "../../src/utils/invariant.ts", "../../src/utils/parseNumber.ts", "../../src/telemetry/noop.ts"],
4
- "sourcesContent": ["/**\n * APM agent preload script\n *\n * Use with node -r flag to start APM agent before application code:\n * node -r ./build/telemetry/tracing.js build/index.js\n *\n * Environment variables:\n * - TELEMETRY_PROVIDER=custom - Use custom telemetry provider (default: noop)\n */\n\n// Load .env before anything else\nimport dotenv from 'dotenv';\ndotenv.config();\n\nimport { initializeTelemetry } from './init.js';\n\ntry {\n initializeTelemetry();\n} catch (error) {\n console.warn('Failed to initialize telemetry:', error);\n}\n", "/**\n * Telemetry initialization and provider factory\n */\n\nimport { resolve } from 'path';\n\nimport { getConfig } from '../config.js';\nimport { log } from '../logging/logger.js';\nimport { NoOpTelemetryProvider } from './noop.js';\nimport { TelemetryProvider } from './types.js';\n\n/**\n * Get all instance methods from a class prototype\n */\nfunction getInstanceMethods(cls: new (...args: unknown[]) => unknown): string[] {\n return Object.getOwnPropertyNames(cls.prototype).filter(\n (name) => name !== 'constructor' && typeof cls.prototype[name] === 'function',\n );\n}\n\nfunction isRecord(obj: unknown): obj is Record<string, unknown> {\n return typeof obj === 'object' && obj !== null && !Array.isArray(obj);\n}\n\n/**\n * Validate that a provider implements all required TelemetryProvider methods\n */\nfunction validateTelemetryProvider(provider: unknown): asserts provider is TelemetryProvider {\n if (!isRecord(provider)) {\n throw new Error('Provider must be an object');\n }\n\n const requiredMethods = getInstanceMethods(NoOpTelemetryProvider);\n // Keep only methods that provider doesn't have (i.e., missing or miscategorized methods)\n const missingMethods = requiredMethods.filter((method) => typeof provider[method] !== 'function');\n\n if (missingMethods.length > 0) {\n throw new Error(`Custom provider missing required methods: ${missingMethods.join(', ')}`);\n }\n}\n\n// Use global to share provider across bundles (tracing.js and index.js)\ndeclare global {\n // eslint-disable-next-line no-var\n var __telemetryProvider: TelemetryProvider | undefined;\n}\n\n/**\n * Get the current telemetry provider instance.\n * If not initialized, returns a NoOp provider.\n *\n * @returns The telemetry provider\n */\nexport function getTelemetryProvider(): TelemetryProvider {\n if (!global.__telemetryProvider) {\n // return a NoOp provider for this request if telemetry hasn't been initialized\n return new NoOpTelemetryProvider();\n }\n return global.__telemetryProvider;\n}\n\n/**\n * Initialize the telemetry provider based on configuration.\n *\n * This function should be called early in application startup, before any\n * HTTP requests or other instrumented operations occur.\n *\n * @returns A configured telemetry provider\n *\n * @example\n * function main() {\n * // Initialize telemetry first\n * const telemetry = initializeTelemetry();\n *\n * // Start application...\n * }\n */\nexport function initializeTelemetry(): TelemetryProvider {\n const config = getConfig();\n let provider: TelemetryProvider;\n\n try {\n // Select provider based on configuration\n switch (config.telemetry.provider) {\n case 'custom':\n // Load custom provider from user's filesystem\n provider = loadCustomProvider(config.telemetry.providerConfig);\n break;\n\n case 'noop':\n provider = new NoOpTelemetryProvider();\n break;\n }\n\n // Initialize the provider\n provider.initialize();\n global.__telemetryProvider = provider;\n return provider;\n } catch (error) {\n log({\n message: 'Failed to initialize telemetry provider',\n level: 'error',\n logger: 'telemetry',\n error,\n });\n log({ message: 'Falling back to NoOp telemetry provider', level: 'info', logger: 'telemetry' });\n\n // Fallback to NoOp on error - telemetry failures shouldn't break the application\n const fallbackProvider = new NoOpTelemetryProvider();\n fallbackProvider.initialize();\n global.__telemetryProvider = fallbackProvider;\n return fallbackProvider;\n }\n}\n\n/**\n * Load a custom telemetry provider from user's filesystem or npm package.\n *\n * The custom provider module should export a default class that implements TelemetryProvider.\n *\n * @param config - Provider configuration containing the module path\n * @returns A configured custom telemetry provider\n *\n * @example Custom provider from file\n * TELEMETRY_PROVIDER=custom\n * TELEMETRY_PROVIDER_CONFIG='{\"module\":\"./my-telemetry.js\"}'\n */\nfunction loadCustomProvider(config?: Record<string, unknown>): TelemetryProvider {\n if (!config?.module) {\n throw new Error(\n 'Custom telemetry provider requires \"module\" in providerConfig. ' +\n 'Example: TELEMETRY_PROVIDER_CONFIG=\\'{\"module\":\"./my-telemetry.js\"}\\'',\n );\n }\n\n const modulePath = config.module;\n\n if (typeof modulePath !== 'string') {\n throw new Error('Custom telemetry provider requires \"module\" to be a string');\n }\n\n // Determine if it's a file path or npm package name\n let resolvedPath: string;\n\n if (modulePath.startsWith('.') || modulePath.startsWith('/')) {\n // File path - resolve relative to process working directory (user's project root)\n resolvedPath = resolve(process.cwd(), modulePath);\n } else {\n // npm package name - require as-is\n resolvedPath = modulePath;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports -- Sync load for preload script\n const module = require(resolvedPath);\n\n // Look for default export or named export \"TelemetryProvider\"\n const ProviderClass = module.default || module.TelemetryProvider;\n\n if (!ProviderClass) {\n throw new Error(\n `Module ${modulePath} must export a default class or named export \"TelemetryProvider\" ` +\n 'that implements the TelemetryProvider interface',\n );\n }\n\n // Instantiate the provider with the full config\n const provider = new ProviderClass(config);\n\n // Validate the provider implements TelemetryProvider interface\n validateTelemetryProvider(provider);\n return provider;\n } catch (error) {\n // Provide helpful error message with common issues\n let errorMessage = `Failed to load custom telemetry provider from \"${modulePath}\". `;\n\n if (error instanceof Error && 'code' in error && error.code === 'MODULE_NOT_FOUND') {\n errorMessage +=\n 'Module not found. ' +\n 'If using a file path, ensure the file exists and the path is correct. ' +\n 'If using an npm package, ensure it is installed.';\n } else {\n errorMessage += `Error: ${error}`;\n }\n\n throw new Error(errorMessage);\n }\n}\n", "import { CorsOptions } from 'cors';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\nimport { LoggerType, parseLoggerTypes, parseLogLevel } from './logging/logger.js';\nimport type { LogLevel } from './logging/types.js';\nimport { isTelemetryProvider, providerConfigSchema, TelemetryConfig } from './telemetry/types.js';\nimport { isTransport, TransportName } from './transports.js';\nimport { getDirname } from './utils/getDirname.js';\nimport invariant from './utils/invariant.js';\nimport { parseNumber } from './utils/parseNumber.js';\n\nconst __dirname = getDirname();\n\nexport const TEN_MINUTES_IN_MS = 10 * 60 * 1000;\nexport const ONE_HOUR_IN_MS = 60 * 60 * 1000;\nexport const ONE_DAY_IN_MS = 24 * 60 * 60 * 1000;\nexport const THIRTY_DAYS_IN_MS = 30 * 24 * 60 * 60 * 1000;\nexport const ONE_YEAR_IN_MS = 365.25 * 24 * 60 * 60 * 1000;\n\nconst authTypes = ['pat', 'uat', 'direct-trust', 'oauth'] as const;\ntype AuthType = (typeof authTypes)[number];\n\nfunction isAuthType(auth: unknown): auth is AuthType {\n return authTypes.some((type) => type === auth);\n}\n\nexport class Config {\n auth: AuthType;\n server: string;\n transport: TransportName;\n sslKey: string;\n sslCert: string;\n httpPort: number;\n corsOriginConfig: CorsOptions['origin'];\n siteName: string;\n patName: string;\n patValue: string;\n jwtUsername: string;\n connectedAppClientId: string;\n connectedAppSecretId: string;\n connectedAppSecretValue: string;\n uatTenantId: string;\n uatIssuer: string;\n uatUsernameClaimName: string;\n uatPrivateKey: string;\n uatKeyId: string;\n jwtAdditionalPayload: string;\n datasourceCredentials: string;\n defaultNotificationLevel: string;\n logLevel: LogLevel;\n disableLogMasking: boolean;\n maxRequestTimeoutMs: number;\n disableSessionManagement: boolean;\n loggers: Set<LoggerType>;\n fileLoggerDirectory: string;\n tableauServerVersionCheckIntervalInHours: number;\n passthroughAuthUserSessionCheckIntervalInMinutes: number;\n mcpSiteSettingsCheckIntervalInMinutes: number;\n enableMcpSiteSettings: boolean;\n enablePassthroughAuth: boolean;\n oauth: {\n enabled: boolean;\n embeddedAuthzServer: boolean;\n issuer: string;\n redirectUri: string;\n resourceUri: string;\n lockSite: boolean;\n jwePrivateKey: string;\n jwePrivateKeyPath: string;\n jwePrivateKeyPassphrase: string | undefined;\n authzCodeTimeoutMs: number;\n accessTokenTimeoutMs: number;\n refreshTokenTimeoutMs: number;\n clientIdSecretPairs: Record<string, string> | null;\n dnsServers: string[];\n enforceScopes: boolean;\n advertiseApiScopes: boolean;\n };\n telemetry: TelemetryConfig;\n latencyMetricName: string;\n productTelemetryEndpoint: string;\n productTelemetryEnabled: boolean;\n isHyperforce: boolean;\n breakGlassDisableGlobally: boolean;\n\n constructor() {\n const cleansedVars = removeClaudeMcpBundleUserConfigTemplates(process.env);\n const {\n AUTH: auth,\n SERVER: server,\n SITE_NAME: siteName,\n TRANSPORT: transport,\n SSL_KEY: sslKey,\n SSL_CERT: sslCert,\n HTTP_PORT_ENV_VAR_NAME: httpPortEnvVarName,\n CORS_ORIGIN_CONFIG: corsOriginConfig,\n PAT_NAME: patName,\n PAT_VALUE: patValue,\n JWT_SUB_CLAIM: jwtSubClaim,\n CONNECTED_APP_CLIENT_ID: clientId,\n CONNECTED_APP_SECRET_ID: secretId,\n CONNECTED_APP_SECRET_VALUE: secretValue,\n UAT_TENANT_ID: uatTenantId,\n UAT_ISSUER: uatIssuer,\n UAT_USERNAME_CLAIM_NAME: uatUsernameClaimName,\n UAT_USERNAME_CLAIM: uatUsernameClaim,\n UAT_PRIVATE_KEY: uatPrivateKey,\n UAT_PRIVATE_KEY_PATH: uatPrivateKeyPath,\n UAT_KEY_ID: uatKeyId,\n JWT_ADDITIONAL_PAYLOAD: jwtAdditionalPayload,\n DATASOURCE_CREDENTIALS: datasourceCredentials,\n DEFAULT_NOTIFICATION_LEVEL: defaultNotificationLevel,\n LOG_LEVEL: logLevel,\n DISABLE_LOG_MASKING: disableLogMasking,\n MAX_REQUEST_TIMEOUT_MS: maxRequestTimeoutMs,\n DISABLE_SESSION_MANAGEMENT: disableSessionManagement,\n ENABLED_LOGGERS: logging,\n FILE_LOGGER_DIRECTORY: fileLoggerDirectory,\n TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS: tableauServerVersionCheckIntervalInHours,\n PASSTHROUGH_AUTH_USER_SESSION_CHECK_INTERVAL_IN_MINUTES:\n passthroughAuthUserSessionCheckIntervalInMinutes,\n MCP_SITE_SETTINGS_CHECK_INTERVAL_IN_MINUTES: mcpSiteSettingsCheckIntervalInMinutes,\n ENABLE_MCP_SITE_SETTINGS: enableMcpSiteSettings,\n ENABLE_PASSTHROUGH_AUTH: enablePassthroughAuth,\n DANGEROUSLY_DISABLE_OAUTH: disableOauth,\n OAUTH_EMBEDDED_AUTHZ_SERVER: oauthEmbeddedAuthzServer,\n OAUTH_ISSUER: oauthIssuer,\n OAUTH_LOCK_SITE: oauthLockSite,\n OAUTH_JWE_PRIVATE_KEY: oauthJwePrivateKey,\n OAUTH_JWE_PRIVATE_KEY_PATH: oauthJwePrivateKeyPath,\n OAUTH_JWE_PRIVATE_KEY_PASSPHRASE: oauthJwePrivateKeyPassphrase,\n OAUTH_RESOURCE_URI: oauthResourceUri,\n OAUTH_REDIRECT_URI: redirectUri,\n OAUTH_CLIENT_ID_SECRET_PAIRS: oauthClientIdSecretPairs,\n OAUTH_CIMD_DNS_SERVERS: dnsServers,\n ADVERTISE_API_SCOPES: advertiseApiScopes,\n OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS: authzCodeTimeoutMs,\n OAUTH_ACCESS_TOKEN_TIMEOUT_MS: accessTokenTimeoutMs,\n OAUTH_REFRESH_TOKEN_TIMEOUT_MS: refreshTokenTimeoutMs,\n OAUTH_DISABLE_SCOPES: oauthDisableScopes,\n TELEMETRY_PROVIDER: telemetryProvider,\n TELEMETRY_PROVIDER_CONFIG: telemetryProviderConfig,\n LATENCY_METRIC_NAME: latencyMetricName,\n PRODUCT_TELEMETRY_ENDPOINT: productTelemetryEndpoint,\n PRODUCT_TELEMETRY_ENABLED: productTelemetryEnabled,\n IS_HYPERFORCE: isHyperforce,\n BREAK_GLASS_DISABLE_GLOBALLY: breakGlassDisableGlobally,\n } = cleansedVars;\n\n let jwtUsername = '';\n\n this.siteName = siteName ?? '';\n\n this.sslKey = sslKey?.trim() ?? '';\n this.sslCert = sslCert?.trim() ?? '';\n this.httpPort = parseNumber(cleansedVars[httpPortEnvVarName?.trim() || 'PORT'], {\n defaultValue: 3927,\n minValue: 1,\n maxValue: 65535,\n });\n this.corsOriginConfig = getCorsOriginConfig(corsOriginConfig?.trim() ?? '');\n this.datasourceCredentials = datasourceCredentials ?? '';\n this.defaultNotificationLevel = defaultNotificationLevel ?? 'debug';\n this.logLevel = parseLogLevel(logLevel);\n this.disableLogMasking = disableLogMasking === 'true';\n this.disableSessionManagement = disableSessionManagement === 'true';\n this.loggers = parseLoggerTypes(logging);\n this.fileLoggerDirectory = fileLoggerDirectory || join(__dirname, 'logs');\n\n this.tableauServerVersionCheckIntervalInHours = parseNumber(\n tableauServerVersionCheckIntervalInHours,\n {\n defaultValue: 1,\n minValue: 1,\n maxValue: 24 * 7, // 7 days\n },\n );\n\n this.passthroughAuthUserSessionCheckIntervalInMinutes = parseNumber(\n passthroughAuthUserSessionCheckIntervalInMinutes,\n {\n defaultValue: 10,\n minValue: 0,\n maxValue: 60 * 24, // 24 hours\n },\n );\n\n this.mcpSiteSettingsCheckIntervalInMinutes = parseNumber(\n mcpSiteSettingsCheckIntervalInMinutes,\n {\n defaultValue: 10,\n minValue: 1,\n maxValue: 60 * 24, // 24 hours\n },\n );\n\n this.enableMcpSiteSettings = enableMcpSiteSettings !== 'false';\n this.enablePassthroughAuth = enablePassthroughAuth === 'true';\n const disableOauthOverride = disableOauth === 'true';\n const disableScopes = oauthDisableScopes === 'true';\n const enforceScopes = !disableScopes;\n const embeddedAuthzServer = oauthEmbeddedAuthzServer !== 'false';\n\n this.oauth = {\n enabled: disableOauthOverride ? false : !!oauthIssuer,\n embeddedAuthzServer,\n issuer: oauthIssuer ?? '',\n resourceUri: oauthResourceUri ?? `http://127.0.0.1:${this.httpPort}`,\n redirectUri: redirectUri || (oauthIssuer ? `${oauthIssuer}/Callback` : ''),\n lockSite: oauthLockSite !== 'false', // Site locking is enabled by default\n jwePrivateKey: oauthJwePrivateKey ?? '',\n jwePrivateKeyPath: oauthJwePrivateKeyPath ?? '',\n jwePrivateKeyPassphrase: oauthJwePrivateKeyPassphrase || undefined,\n dnsServers: dnsServers\n ? dnsServers.split(',').map((ip) => ip.trim())\n : ['1.1.1.1', '1.0.0.1' /* Cloudflare public DNS */],\n authzCodeTimeoutMs: parseNumber(authzCodeTimeoutMs, {\n defaultValue: TEN_MINUTES_IN_MS,\n minValue: 0,\n maxValue: ONE_HOUR_IN_MS,\n }),\n accessTokenTimeoutMs: parseNumber(accessTokenTimeoutMs, {\n defaultValue: ONE_HOUR_IN_MS,\n minValue: 0,\n maxValue: THIRTY_DAYS_IN_MS,\n }),\n refreshTokenTimeoutMs: parseNumber(refreshTokenTimeoutMs, {\n defaultValue: THIRTY_DAYS_IN_MS,\n minValue: 0,\n maxValue: ONE_YEAR_IN_MS,\n }),\n clientIdSecretPairs: oauthClientIdSecretPairs\n ? oauthClientIdSecretPairs.split(',').reduce<Record<string, string>>((acc, curr) => {\n const [clientId, secret] = curr.split(':');\n if (clientId && secret) {\n acc[clientId] = secret;\n }\n return acc;\n }, {})\n : null,\n enforceScopes,\n advertiseApiScopes: advertiseApiScopes === 'true',\n };\n\n if (\n this.oauth.clientIdSecretPairs &&\n Object.keys(this.oauth.clientIdSecretPairs).length === 0\n ) {\n throw new Error(\n `OAUTH_CLIENT_ID_SECRET_PAIRS is in an invalid format: ${oauthClientIdSecretPairs}. Should be in the format: clientId:secret`,\n );\n }\n\n const parsedProvider = isTelemetryProvider(telemetryProvider) ? telemetryProvider : 'noop';\n if (parsedProvider === 'custom') {\n if (!telemetryProviderConfig) {\n throw new Error(\n 'TELEMETRY_PROVIDER_CONFIG is required when TELEMETRY_PROVIDER is \"custom\"',\n );\n }\n this.telemetry = {\n provider: 'custom',\n providerConfig: providerConfigSchema.parse(JSON.parse(telemetryProviderConfig)),\n };\n } else {\n this.telemetry = {\n provider: 'noop',\n };\n }\n\n this.latencyMetricName = latencyMetricName || 'http_server_1agg1_request_duration';\n this.productTelemetryEndpoint =\n productTelemetryEndpoint || 'https://prod.telemetry.tableausoftware.com';\n this.productTelemetryEnabled = productTelemetryEnabled !== 'false';\n this.isHyperforce = isHyperforce === 'true';\n this.breakGlassDisableGlobally = breakGlassDisableGlobally === 'true';\n\n this.auth = isAuthType(auth) ? auth : this.oauth.enabled ? 'oauth' : 'pat';\n this.transport = isTransport(transport) ? transport : this.oauth.enabled ? 'http' : 'stdio';\n\n if (this.transport === 'http' && !disableOauthOverride && !this.oauth.issuer) {\n throw new Error(\n 'OAUTH_ISSUER must be set when TRANSPORT is \"http\" unless DANGEROUSLY_DISABLE_OAUTH is \"true\"',\n );\n }\n\n if (this.auth === 'oauth') {\n if (disableOauthOverride) {\n throw new Error('When AUTH is \"oauth\", DANGEROUSLY_DISABLE_OAUTH cannot be \"true\"');\n }\n\n if (!this.oauth.issuer) {\n throw new Error('When AUTH is \"oauth\", OAUTH_ISSUER must be set');\n }\n } else {\n invariant(server, 'The environment variable SERVER is not set');\n validateServer(server);\n }\n\n if (this.oauth.enabled) {\n if (this.oauth.embeddedAuthzServer) {\n invariant(this.oauth.redirectUri, 'The environment variable OAUTH_REDIRECT_URI is not set');\n\n if (!this.oauth.jwePrivateKey && !this.oauth.jwePrivateKeyPath) {\n throw new Error(\n 'One of the environment variables: OAUTH_JWE_PRIVATE_KEY_PATH or OAUTH_JWE_PRIVATE_KEY must be set',\n );\n }\n\n if (this.oauth.jwePrivateKey && this.oauth.jwePrivateKeyPath) {\n throw new Error(\n 'Only one of the environment variables: OAUTH_JWE_PRIVATE_KEY or OAUTH_JWE_PRIVATE_KEY_PATH must be set',\n );\n }\n\n if (\n this.oauth.jwePrivateKeyPath &&\n process.env.TABLEAU_MCP_TEST !== 'true' &&\n !existsSync(this.oauth.jwePrivateKeyPath)\n ) {\n throw new Error(\n `OAuth JWE private key path does not exist: ${this.oauth.jwePrivateKeyPath}`,\n );\n }\n }\n\n if (this.transport === 'stdio') {\n throw new Error('TRANSPORT must be \"http\" when OAUTH_ISSUER is set');\n }\n }\n\n this.maxRequestTimeoutMs = parseNumber(maxRequestTimeoutMs, {\n defaultValue: TEN_MINUTES_IN_MS,\n minValue: 5000,\n maxValue: ONE_HOUR_IN_MS,\n });\n\n if (this.auth === 'pat') {\n invariant(patName, 'The environment variable PAT_NAME is not set');\n invariant(patValue, 'The environment variable PAT_VALUE is not set');\n } else if (this.auth === 'direct-trust') {\n invariant(jwtSubClaim, 'The environment variable JWT_SUB_CLAIM is not set');\n invariant(clientId, 'The environment variable CONNECTED_APP_CLIENT_ID is not set');\n invariant(secretId, 'The environment variable CONNECTED_APP_SECRET_ID is not set');\n invariant(secretValue, 'The environment variable CONNECTED_APP_SECRET_VALUE is not set');\n\n jwtUsername = jwtSubClaim ?? '';\n } else if (this.auth === 'uat') {\n invariant(uatTenantId, 'The environment variable UAT_TENANT_ID is not set');\n invariant(uatIssuer, 'The environment variable UAT_ISSUER is not set');\n\n if (!uatUsernameClaim && !jwtSubClaim) {\n throw new Error(\n 'One of the environment variables: UAT_USERNAME_CLAIM or JWT_SUB_CLAIM must be set',\n );\n }\n\n jwtUsername = uatUsernameClaim ?? jwtSubClaim ?? '';\n\n if (!uatPrivateKey && !uatPrivateKeyPath) {\n throw new Error(\n 'One of the environment variables: UAT_PRIVATE_KEY_PATH or UAT_PRIVATE_KEY must be set',\n );\n }\n\n if (uatPrivateKey && uatPrivateKeyPath) {\n throw new Error(\n 'Only one of the environment variables: UAT_PRIVATE_KEY or UAT_PRIVATE_KEY_PATH must be set',\n );\n }\n\n if (\n uatPrivateKeyPath &&\n process.env.TABLEAU_MCP_TEST !== 'true' &&\n !existsSync(uatPrivateKeyPath)\n ) {\n throw new Error(`UAT private key path does not exist: ${uatPrivateKeyPath}`);\n }\n }\n\n this.server = server ?? '';\n this.patName = patName ?? '';\n this.patValue = patValue ?? '';\n this.jwtUsername = jwtUsername ?? '';\n this.connectedAppClientId = clientId ?? '';\n this.connectedAppSecretId = secretId ?? '';\n this.connectedAppSecretValue = secretValue ?? '';\n this.uatTenantId = uatTenantId ?? '';\n this.uatIssuer = uatIssuer ?? '';\n this.uatUsernameClaimName = uatUsernameClaimName || 'email';\n this.uatPrivateKey =\n uatPrivateKey || (uatPrivateKeyPath ? readFileSync(uatPrivateKeyPath, 'utf8') : '');\n this.uatKeyId = uatKeyId ?? '';\n this.jwtAdditionalPayload = jwtAdditionalPayload || '{}';\n }\n}\n\nfunction validateServer(server: string): void {\n if (!['https://', 'http://'].find((prefix) => server.startsWith(prefix))) {\n throw new Error(\n `The environment variable SERVER must start with \"http://\" or \"https://\": ${server}`,\n );\n }\n\n try {\n const _ = new URL(server);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `The environment variable SERVER is not a valid URL: ${server} -- ${errorMessage}`,\n );\n }\n}\n\nfunction getCorsOriginConfig(corsOriginConfig: string): CorsOptions['origin'] {\n if (!corsOriginConfig) {\n return true;\n }\n\n if (corsOriginConfig.match(/^true|false$/i)) {\n return corsOriginConfig.toLowerCase() === 'true';\n }\n\n if (corsOriginConfig === '*') {\n return '*';\n }\n\n if (corsOriginConfig.startsWith('[') && corsOriginConfig.endsWith(']')) {\n try {\n const origins = JSON.parse(corsOriginConfig) as Array<string>;\n return origins.map((origin) => new URL(origin).origin);\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${corsOriginConfig}`,\n );\n }\n }\n\n try {\n return new URL(corsOriginConfig).origin;\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${corsOriginConfig}`,\n );\n }\n}\n\n// When the user does not provide a site name in the Claude MCP Bundle configuration,\n// Claude doesn't replace its value and sets the site name to \"${user_config.site_name}\".\nexport function removeClaudeMcpBundleUserConfigTemplates(\n envVars: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n return Object.entries(envVars).reduce<Record<string, string | undefined>>((acc, [key, value]) => {\n if (value?.startsWith('${user_config.')) {\n acc[key] = '';\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\nexport const getConfig = (): Config => new Config();\n\nexport const exportedForTesting = {\n Config,\n};\n", "import { appendFile } from 'node:fs/promises';\n\nimport { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport type { LogEntry } from './types.js';\n\nlet _fileLogger: FileLogger | undefined;\n\nexport const setFileLogger = (logger: FileLogger): void => {\n _fileLogger = logger;\n};\n\nexport const getFileLogger = (): FileLogger | undefined => _fileLogger;\n\nexport class FileLogger {\n private readonly _logDirectory: string;\n private readonly _fileMutexes = new Map<string, Promise<void>>();\n\n constructor({ logDirectory }: { logDirectory: string }) {\n this._logDirectory = logDirectory;\n\n if (!existsSync(this._logDirectory)) {\n mkdirSync(this._logDirectory, { recursive: true });\n }\n }\n\n async log(entry: LogEntry): Promise<void> {\n // Create a new log file each hour e.g. 2025-10-15T21-00-00-000Z.log\n const timestamp = new Date().toISOString();\n const filename = `${new Date(new Date().setMinutes(0, 0, 0)).toISOString().replace(/[:.]/g, '-')}.log`;\n const logFilePath = join(this._logDirectory, filename);\n\n // Get or create a mutex for this specific log file\n const mutexKey = logFilePath;\n const currentMutex = this._fileMutexes.get(mutexKey) ?? Promise.resolve();\n\n // Chain the file write operation after the current mutex\n const newMutex = currentMutex.then(async () => {\n try {\n // appendFile will create the file if it doesn't exist\n await appendFile(logFilePath, JSON.stringify({ timestamp, ...entry }) + '\\n');\n } catch (error) {\n process.stderr.write(\n `Failed to write to log file ${logFilePath}: ${getExceptionMessage(error)}\\n`,\n );\n }\n });\n\n this._fileMutexes.set(mutexKey, newMutex);\n\n // Clean up completed mutexes to prevent memory leaks\n newMutex.finally(() => {\n if (this._fileMutexes.get(mutexKey) === newMutex) {\n this._fileMutexes.delete(mutexKey);\n }\n });\n\n // Wait for the file write operation to complete\n await newMutex;\n }\n}\n", "import type { LoggingLevel } from '@modelcontextprotocol/sdk/types.js';\n\nexport type LogLevel = LoggingLevel;\nexport const orderedLogLevels = [\n 'debug',\n 'info',\n 'notice',\n 'warning',\n 'error',\n 'critical',\n 'alert',\n 'emergency',\n] as const;\n\nexport const logLevelSeverity = Object.fromEntries(\n orderedLogLevels.map((level, index) => [level, index]),\n) as Record<LogLevel, number>;\n\nexport type LogEntry = {\n message: string;\n error?: unknown;\n level: LogLevel;\n logger: string | undefined;\n};\n", "import { getConfig } from '../config.js';\nimport { getFileLogger } from './fileLogger.js';\nimport { LogEntry, LogLevel, logLevelSeverity } from './types.js';\n\nexport const loggerTypes = ['fileLogger', 'appLogger'] as const;\nexport type LoggerType = (typeof loggerTypes)[number];\nconst validLoggerTypes = new Set(loggerTypes);\n\nexport function shouldLog(entryLevel: LogLevel, minLevel: LogLevel): boolean {\n return logLevelSeverity[entryLevel] >= logLevelSeverity[minLevel];\n}\n\nfunction isLogLevel(value: string): value is LogLevel {\n return value in logLevelSeverity;\n}\n\nexport function parseLogLevel(value: string | undefined): LogLevel {\n const level = value?.trim();\n if (level && isLogLevel(level)) {\n return level;\n }\n return 'info';\n}\n\nexport function parseLoggerTypes(value: string | undefined): Set<LoggerType> {\n if (!value) {\n return new Set<LoggerType>(['appLogger']);\n }\n return new Set(\n value\n .split(',')\n .map((s) => s.trim())\n .filter((s): s is LoggerType => validLoggerTypes.has(s as LoggerType)),\n );\n}\n\nexport function log(entry: LogEntry): void {\n const config = getConfig();\n if (!shouldLog(entry.level, config.logLevel)) {\n return;\n }\n if (config.loggers.has('appLogger')) {\n const message = JSON.stringify(entry);\n if (config.transport === 'http') {\n if (entry.error) {\n // eslint-disable-next-line no-console -- console.log is intentional here since the transport is not stdio.\n console.log(message, entry.error);\n } else {\n // eslint-disable-next-line no-console -- console.log is intentional here since the transport is not stdio.\n console.log(message);\n }\n } else {\n process.stderr.write(message.endsWith('\\n') ? message : `${message}\\n`);\n }\n }\n if (config.loggers.has('fileLogger')) {\n getFileLogger()?.log(entry);\n }\n}\n", "import { z } from 'zod';\n\n/**\n * Telemetry provider interface for metrics collection.\n */\nexport interface TelemetryProvider {\n /**\n * Initialize the telemetry provider.\n */\n initialize(): void;\n\n /**\n * Record a custom metric with the given name and attributes.\n *\n * @param name - The metric name (e.g., 'apm_mcp_tool_calls')\n * @param value - The metric value (default: 1 for counters)\n * @param attributes - Dimensions/tags for the metric\n *\n * @example\n * ```typescript\n * telemetry.recordMetric('apm_mcp_tool_calls', 1, {\n * tool_name: 'list-pulse-metric-subscriptions',\n * });\n * ```\n */\n recordMetric(name: string, value: number, attributes: TelemetryAttributes): void;\n\n /**\n * Record a histogram observation (e.g., latency) with the given name and attributes.\n *\n * @param name - The metric name (e.g., 'http_server_request_duration')\n * @param value - The observed value (e.g., duration in milliseconds)\n * @param attributes - Dimensions/tags for the metric\n *\n * @example\n * ```typescript\n * telemetry.recordHistogram('apm_mcp_tool_duration', 142.5, {\n * tool_name: 'get-datasource-metadata',\n * success: true,\n * });\n * ```\n */\n recordHistogram(name: string, value: number, attributes: TelemetryAttributes): void;\n}\n\n/**\n * Schema for telemetry attributes.\n * Values can be strings, numbers, booleans, or undefined.\n */\nexport const telemetryAttributesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.undefined()]),\n);\nexport type TelemetryAttributes = z.infer<typeof telemetryAttributesSchema>;\n\n/**\n * Valid telemetry provider names\n */\nexport const telemetryProviderSchema = z.enum(['noop', 'custom']);\nexport type TelemetryProviderType = z.infer<typeof telemetryProviderSchema>;\n\n/**\n * Schema for noop telemetry config (no telemetry)\n */\nexport const noopTelemetryConfigSchema = z.object({\n provider: z.literal('noop'),\n});\n\n/**\n * Schema for custom telemetry provider config.\n * Requires 'module' field, allows additional provider-specific options.\n */\nexport const providerConfigSchema = z\n .object({\n module: z.string({ required_error: 'Custom provider requires \"module\" path' }),\n })\n .passthrough();\n\n/**\n * Schema for custom telemetry config\n *\n * @example\n * ```json\n * {\n * \"provider\": \"custom\",\n * \"providerConfig\": {\n * \"module\": \"./my-otel-provider.js\"\n * }\n * }\n * ```\n */\nexport const customTelemetryConfigSchema = z.object({\n provider: z.literal('custom'),\n providerConfig: providerConfigSchema,\n});\n\n/**\n * Combined telemetry config schema (discriminated union)\n */\nexport const telemetryConfigSchema = z.discriminatedUnion('provider', [\n noopTelemetryConfigSchema,\n customTelemetryConfigSchema,\n]);\n\nexport type TelemetryConfig = z.infer<typeof telemetryConfigSchema>;\n\n/**\n * Type guard for telemetry provider names\n */\nexport function isTelemetryProvider(provider: unknown): provider is TelemetryProviderType {\n return telemetryProviderSchema.safeParse(provider).success;\n}\n", "const transports = ['stdio', 'http'] as const;\nexport type TransportName = (typeof transports)[number];\nexport function isTransport(transport: unknown): transport is TransportName {\n return !!transports.find((t) => t === transport);\n}\n", "export function getDirname(): string {\n if (typeof __dirname === 'string') {\n return __dirname;\n }\n\n throw new Error('__dirname is not set');\n}\n", "export default function invariant(condition: unknown, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message ? message : 'Invariant Violation');\n }\n}\n", "export function parseNumber(\n value: string | undefined,\n {\n defaultValue,\n minValue,\n maxValue,\n }: { defaultValue: number; minValue?: number; maxValue?: number } = {\n defaultValue: 0,\n minValue: Number.NEGATIVE_INFINITY,\n maxValue: Number.POSITIVE_INFINITY,\n },\n): number {\n if (!value) {\n return defaultValue;\n }\n\n const number = parseFloat(value);\n return isNaN(number) ||\n (minValue !== undefined && number < minValue) ||\n (maxValue !== undefined && number > maxValue)\n ? defaultValue\n : number;\n}\n", "/**\n * NoOp telemetry provider - does nothing.\n * This is the default provider when telemetry is disabled.\n *\n * Zero overhead implementation that can be safely used in production\n * when telemetry is not needed.\n */\n\nimport { TelemetryAttributes, TelemetryProvider } from './types.js';\n\nexport class NoOpTelemetryProvider implements TelemetryProvider {\n initialize(): void {\n // No-op\n }\n\n recordMetric(_name: string, _value: number, _attributes: TelemetryAttributes): void {\n // No-op\n }\n\n recordHistogram(_name: string, _value: number, _attributes: TelemetryAttributes): void {\n // No-op\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_dotenv", "import_path", "import_fs", "import_path", "_fileLogger", "getFileLogger", "_fileLogger", "orderedLogLevels", "logLevelSeverity", "level", "index", "loggerTypes", "validLoggerTypes", "shouldLog", "entryLevel", "minLevel", "logLevelSeverity", "isLogLevel", "value", "parseLogLevel", "level", "parseLoggerTypes", "s", "log", "entry", "config", "getConfig", "message", "getFileLogger", "import_zod", "telemetryAttributesSchema", "telemetryProviderSchema", "noopTelemetryConfigSchema", "providerConfigSchema", "customTelemetryConfigSchema", "telemetryConfigSchema", "isTelemetryProvider", "provider", "transports", "isTransport", "transport", "getDirname", "invariant", "condition", "message", "parseNumber", "value", "defaultValue", "minValue", "maxValue", "number", "__dirname", "getDirname", "TEN_MINUTES_IN_MS", "ONE_HOUR_IN_MS", "ONE_DAY_IN_MS", "THIRTY_DAYS_IN_MS", "ONE_YEAR_IN_MS", "authTypes", "isAuthType", "auth", "type", "Config", "cleansedVars", "removeClaudeMcpBundleUserConfigTemplates", "server", "siteName", "transport", "sslKey", "sslCert", "httpPortEnvVarName", "corsOriginConfig", "patName", "patValue", "jwtSubClaim", "clientId", "secretId", "secretValue", "uatTenantId", "uatIssuer", "uatUsernameClaimName", "uatUsernameClaim", "uatPrivateKey", "uatPrivateKeyPath", "uatKeyId", "jwtAdditionalPayload", "datasourceCredentials", "defaultNotificationLevel", "logLevel", "disableLogMasking", "maxRequestTimeoutMs", "disableSessionManagement", "logging", "fileLoggerDirectory", "tableauServerVersionCheckIntervalInHours", "passthroughAuthUserSessionCheckIntervalInMinutes", "mcpSiteSettingsCheckIntervalInMinutes", "enableMcpSiteSettings", "enablePassthroughAuth", "disableOauth", "oauthEmbeddedAuthzServer", "oauthIssuer", "oauthLockSite", "oauthJwePrivateKey", "oauthJwePrivateKeyPath", "oauthJwePrivateKeyPassphrase", "oauthResourceUri", "redirectUri", "oauthClientIdSecretPairs", "dnsServers", "advertiseApiScopes", "authzCodeTimeoutMs", "accessTokenTimeoutMs", "refreshTokenTimeoutMs", "oauthDisableScopes", "telemetryProvider", "telemetryProviderConfig", "latencyMetricName", "productTelemetryEndpoint", "productTelemetryEnabled", "isHyperforce", "breakGlassDisableGlobally", "jwtUsername", "parseNumber", "getCorsOriginConfig", "parseLogLevel", "parseLoggerTypes", "disableOauthOverride", "enforceScopes", "embeddedAuthzServer", "ip", "acc", "curr", "secret", "isTelemetryProvider", "providerConfigSchema", "isTransport", "invariant", "validateServer", "prefix", "_", "error", "errorMessage", "origin", "envVars", "key", "value", "getConfig", "NoOpTelemetryProvider", "_name", "_value", "_attributes", "getInstanceMethods", "cls", "name", "isRecord", "obj", "validateTelemetryProvider", "provider", "missingMethods", "NoOpTelemetryProvider", "method", "initializeTelemetry", "config", "getConfig", "provider", "loadCustomProvider", "NoOpTelemetryProvider", "error", "log", "fallbackProvider", "modulePath", "resolvedPath", "module", "ProviderClass", "validateTelemetryProvider", "errorMessage", "dotenv", "initializeTelemetry", "error"]
4
+ "sourcesContent": ["/**\n * APM agent preload script\n *\n * Use with node -r flag to start APM agent before application code:\n * node -r ./build/telemetry/tracing.js build/index.js\n *\n * Environment variables:\n * - TELEMETRY_PROVIDER=custom - Use custom telemetry provider (default: noop)\n */\n\n// Load .env before anything else\nimport dotenv from 'dotenv';\ndotenv.config();\n\nimport { initializeTelemetry } from './init.js';\n\ntry {\n initializeTelemetry();\n} catch (error) {\n console.warn('Failed to initialize telemetry:', error);\n}\n", "/**\n * Telemetry initialization and provider factory\n */\n\nimport { resolve } from 'path';\n\nimport { getConfig } from '../config.js';\nimport { log } from '../logging/logger.js';\nimport { NoOpTelemetryProvider } from './noop.js';\nimport { TelemetryProvider } from './types.js';\n\n/**\n * Get all instance methods from a class prototype\n */\nfunction getInstanceMethods(cls: new (...args: unknown[]) => unknown): string[] {\n return Object.getOwnPropertyNames(cls.prototype).filter(\n (name) => name !== 'constructor' && typeof cls.prototype[name] === 'function',\n );\n}\n\nfunction isRecord(obj: unknown): obj is Record<string, unknown> {\n return typeof obj === 'object' && obj !== null && !Array.isArray(obj);\n}\n\n/**\n * Validate that a provider implements all required TelemetryProvider methods\n */\nfunction validateTelemetryProvider(provider: unknown): asserts provider is TelemetryProvider {\n if (!isRecord(provider)) {\n throw new Error('Provider must be an object');\n }\n\n const requiredMethods = getInstanceMethods(NoOpTelemetryProvider);\n // Keep only methods that provider doesn't have (i.e., missing or miscategorized methods)\n const missingMethods = requiredMethods.filter((method) => typeof provider[method] !== 'function');\n\n if (missingMethods.length > 0) {\n throw new Error(`Custom provider missing required methods: ${missingMethods.join(', ')}`);\n }\n}\n\n// Use global to share provider across bundles (tracing.js and index.js)\ndeclare global {\n // eslint-disable-next-line no-var\n var __telemetryProvider: TelemetryProvider | undefined;\n}\n\n/**\n * Get the current telemetry provider instance.\n * If not initialized, returns a NoOp provider.\n *\n * @returns The telemetry provider\n */\nexport function getTelemetryProvider(): TelemetryProvider {\n if (!global.__telemetryProvider) {\n // return a NoOp provider for this request if telemetry hasn't been initialized\n return new NoOpTelemetryProvider();\n }\n return global.__telemetryProvider;\n}\n\n/**\n * Initialize the telemetry provider based on configuration.\n *\n * This function should be called early in application startup, before any\n * HTTP requests or other instrumented operations occur.\n *\n * @returns A configured telemetry provider\n *\n * @example\n * function main() {\n * // Initialize telemetry first\n * const telemetry = initializeTelemetry();\n *\n * // Start application...\n * }\n */\nexport function initializeTelemetry(): TelemetryProvider {\n const config = getConfig();\n let provider: TelemetryProvider;\n\n try {\n // Select provider based on configuration\n switch (config.telemetry.provider) {\n case 'custom':\n // Load custom provider from user's filesystem\n provider = loadCustomProvider(config.telemetry.providerConfig);\n break;\n\n case 'noop':\n provider = new NoOpTelemetryProvider();\n break;\n }\n\n // Initialize the provider\n provider.initialize();\n global.__telemetryProvider = provider;\n return provider;\n } catch (error) {\n log({\n message: 'Failed to initialize telemetry provider',\n level: 'error',\n logger: 'telemetry',\n error,\n });\n log({ message: 'Falling back to NoOp telemetry provider', level: 'info', logger: 'telemetry' });\n\n // Fallback to NoOp on error - telemetry failures shouldn't break the application\n const fallbackProvider = new NoOpTelemetryProvider();\n fallbackProvider.initialize();\n global.__telemetryProvider = fallbackProvider;\n return fallbackProvider;\n }\n}\n\n/**\n * Load a custom telemetry provider from user's filesystem or npm package.\n *\n * The custom provider module should export a default class that implements TelemetryProvider.\n *\n * @param config - Provider configuration containing the module path\n * @returns A configured custom telemetry provider\n *\n * @example Custom provider from file\n * TELEMETRY_PROVIDER=custom\n * TELEMETRY_PROVIDER_CONFIG='{\"module\":\"./my-telemetry.js\"}'\n */\nfunction loadCustomProvider(config?: Record<string, unknown>): TelemetryProvider {\n if (!config?.module) {\n throw new Error(\n 'Custom telemetry provider requires \"module\" in providerConfig. ' +\n 'Example: TELEMETRY_PROVIDER_CONFIG=\\'{\"module\":\"./my-telemetry.js\"}\\'',\n );\n }\n\n const modulePath = config.module;\n\n if (typeof modulePath !== 'string') {\n throw new Error('Custom telemetry provider requires \"module\" to be a string');\n }\n\n // Determine if it's a file path or npm package name\n let resolvedPath: string;\n\n if (modulePath.startsWith('.') || modulePath.startsWith('/')) {\n // File path - resolve relative to process working directory (user's project root)\n resolvedPath = resolve(process.cwd(), modulePath);\n } else {\n // npm package name - require as-is\n resolvedPath = modulePath;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports -- Sync load for preload script\n const module = require(resolvedPath);\n\n // Look for default export or named export \"TelemetryProvider\"\n const ProviderClass = module.default || module.TelemetryProvider;\n\n if (!ProviderClass) {\n throw new Error(\n `Module ${modulePath} must export a default class or named export \"TelemetryProvider\" ` +\n 'that implements the TelemetryProvider interface',\n );\n }\n\n // Instantiate the provider with the full config\n const provider = new ProviderClass(config);\n\n // Validate the provider implements TelemetryProvider interface\n validateTelemetryProvider(provider);\n return provider;\n } catch (error) {\n // Provide helpful error message with common issues\n let errorMessage = `Failed to load custom telemetry provider from \"${modulePath}\". `;\n\n if (error instanceof Error && 'code' in error && error.code === 'MODULE_NOT_FOUND') {\n errorMessage +=\n 'Module not found. ' +\n 'If using a file path, ensure the file exists and the path is correct. ' +\n 'If using an npm package, ensure it is installed.';\n } else {\n errorMessage += `Error: ${error}`;\n }\n\n throw new Error(errorMessage);\n }\n}\n", "import { CorsOptions } from 'cors';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\n\nimport { LoggerType, parseLoggerTypes, parseLogLevel } from './logging/logger.js';\nimport type { LogLevel } from './logging/types.js';\nimport { isTelemetryProvider, providerConfigSchema, TelemetryConfig } from './telemetry/types.js';\nimport { isTransport, TransportName } from './transports.js';\nimport { getDirname } from './utils/getDirname.js';\nimport invariant from './utils/invariant.js';\nimport { parseNumber } from './utils/parseNumber.js';\n\nconst __dirname = getDirname();\n\nexport const TEN_MINUTES_IN_MS = 10 * 60 * 1000;\nexport const ONE_HOUR_IN_MS = 60 * 60 * 1000;\nexport const ONE_DAY_IN_MS = 24 * 60 * 60 * 1000;\nexport const THIRTY_DAYS_IN_MS = 30 * 24 * 60 * 60 * 1000;\nexport const ONE_YEAR_IN_MS = 365.25 * 24 * 60 * 60 * 1000;\n\nconst authTypes = ['pat', 'uat', 'direct-trust', 'oauth'] as const;\ntype AuthType = (typeof authTypes)[number];\n\nfunction isAuthType(auth: unknown): auth is AuthType {\n return authTypes.some((type) => type === auth);\n}\n\nexport class Config {\n auth: AuthType;\n server: string;\n transport: TransportName;\n sslKey: string;\n sslCert: string;\n httpPort: number;\n corsOriginConfig: CorsOptions['origin'];\n siteName: string;\n patName: string;\n patValue: string;\n jwtUsername: string;\n connectedAppClientId: string;\n connectedAppSecretId: string;\n connectedAppSecretValue: string;\n uatTenantId: string;\n uatIssuer: string;\n uatUsernameClaimName: string;\n uatPrivateKey: string;\n uatKeyId: string;\n jwtAdditionalPayload: string;\n datasourceCredentials: string;\n defaultNotificationLevel: string;\n logLevel: LogLevel;\n disableLogMasking: boolean;\n maxRequestTimeoutMs: number;\n disableSessionManagement: boolean;\n loggers: Set<LoggerType>;\n fileLoggerDirectory: string;\n tableauServerVersionCheckIntervalInHours: number;\n passthroughAuthUserSessionCheckIntervalInMinutes: number;\n mcpSiteSettingsCheckIntervalInMinutes: number;\n enableMcpSiteSettings: boolean;\n allowSitesToConfigureRequestOverrides: boolean;\n enablePassthroughAuth: boolean;\n oauth: {\n enabled: boolean;\n embeddedAuthzServer: boolean;\n issuer: string;\n redirectUri: string;\n resourceUri: string;\n lockSite: boolean;\n jwePrivateKey: string;\n jwePrivateKeyPath: string;\n jwePrivateKeyPassphrase: string | undefined;\n authzCodeTimeoutMs: number;\n accessTokenTimeoutMs: number;\n refreshTokenTimeoutMs: number;\n clientIdSecretPairs: Record<string, string> | null;\n dnsServers: string[];\n enforceScopes: boolean;\n advertiseApiScopes: boolean;\n };\n telemetry: TelemetryConfig;\n latencyMetricName: string;\n productTelemetryEndpoint: string;\n productTelemetryEnabled: boolean;\n isHyperforce: boolean;\n breakGlassDisableGlobally: boolean;\n\n constructor() {\n const cleansedVars = removeClaudeMcpBundleUserConfigTemplates(process.env);\n const {\n AUTH: auth,\n SERVER: server,\n SITE_NAME: siteName,\n TRANSPORT: transport,\n SSL_KEY: sslKey,\n SSL_CERT: sslCert,\n HTTP_PORT_ENV_VAR_NAME: httpPortEnvVarName,\n CORS_ORIGIN_CONFIG: corsOriginConfig,\n PAT_NAME: patName,\n PAT_VALUE: patValue,\n JWT_SUB_CLAIM: jwtSubClaim,\n CONNECTED_APP_CLIENT_ID: clientId,\n CONNECTED_APP_SECRET_ID: secretId,\n CONNECTED_APP_SECRET_VALUE: secretValue,\n UAT_TENANT_ID: uatTenantId,\n UAT_ISSUER: uatIssuer,\n UAT_USERNAME_CLAIM_NAME: uatUsernameClaimName,\n UAT_USERNAME_CLAIM: uatUsernameClaim,\n UAT_PRIVATE_KEY: uatPrivateKey,\n UAT_PRIVATE_KEY_PATH: uatPrivateKeyPath,\n UAT_KEY_ID: uatKeyId,\n JWT_ADDITIONAL_PAYLOAD: jwtAdditionalPayload,\n DATASOURCE_CREDENTIALS: datasourceCredentials,\n DEFAULT_NOTIFICATION_LEVEL: defaultNotificationLevel,\n LOG_LEVEL: logLevel,\n DISABLE_LOG_MASKING: disableLogMasking,\n MAX_REQUEST_TIMEOUT_MS: maxRequestTimeoutMs,\n DISABLE_SESSION_MANAGEMENT: disableSessionManagement,\n ENABLED_LOGGERS: logging,\n FILE_LOGGER_DIRECTORY: fileLoggerDirectory,\n TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS: tableauServerVersionCheckIntervalInHours,\n PASSTHROUGH_AUTH_USER_SESSION_CHECK_INTERVAL_IN_MINUTES:\n passthroughAuthUserSessionCheckIntervalInMinutes,\n MCP_SITE_SETTINGS_CHECK_INTERVAL_IN_MINUTES: mcpSiteSettingsCheckIntervalInMinutes,\n ENABLE_MCP_SITE_SETTINGS: enableMcpSiteSettings,\n ALLOW_SITES_TO_CONFIGURE_REQUEST_OVERRIDES: allowSitesToConfigureRequestOverrides,\n ENABLE_PASSTHROUGH_AUTH: enablePassthroughAuth,\n DANGEROUSLY_DISABLE_OAUTH: disableOauth,\n OAUTH_EMBEDDED_AUTHZ_SERVER: oauthEmbeddedAuthzServer,\n OAUTH_ISSUER: oauthIssuer,\n OAUTH_LOCK_SITE: oauthLockSite,\n OAUTH_JWE_PRIVATE_KEY: oauthJwePrivateKey,\n OAUTH_JWE_PRIVATE_KEY_PATH: oauthJwePrivateKeyPath,\n OAUTH_JWE_PRIVATE_KEY_PASSPHRASE: oauthJwePrivateKeyPassphrase,\n OAUTH_RESOURCE_URI: oauthResourceUri,\n OAUTH_REDIRECT_URI: redirectUri,\n OAUTH_CLIENT_ID_SECRET_PAIRS: oauthClientIdSecretPairs,\n OAUTH_CIMD_DNS_SERVERS: dnsServers,\n ADVERTISE_API_SCOPES: advertiseApiScopes,\n OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS: authzCodeTimeoutMs,\n OAUTH_ACCESS_TOKEN_TIMEOUT_MS: accessTokenTimeoutMs,\n OAUTH_REFRESH_TOKEN_TIMEOUT_MS: refreshTokenTimeoutMs,\n OAUTH_DISABLE_SCOPES: oauthDisableScopes,\n TELEMETRY_PROVIDER: telemetryProvider,\n TELEMETRY_PROVIDER_CONFIG: telemetryProviderConfig,\n LATENCY_METRIC_NAME: latencyMetricName,\n PRODUCT_TELEMETRY_ENDPOINT: productTelemetryEndpoint,\n PRODUCT_TELEMETRY_ENABLED: productTelemetryEnabled,\n IS_HYPERFORCE: isHyperforce,\n BREAK_GLASS_DISABLE_GLOBALLY: breakGlassDisableGlobally,\n } = cleansedVars;\n\n let jwtUsername = '';\n\n this.siteName = siteName ?? '';\n\n this.sslKey = sslKey?.trim() ?? '';\n this.sslCert = sslCert?.trim() ?? '';\n this.httpPort = parseNumber(cleansedVars[httpPortEnvVarName?.trim() || 'PORT'], {\n defaultValue: 3927,\n minValue: 1,\n maxValue: 65535,\n });\n this.corsOriginConfig = getCorsOriginConfig(corsOriginConfig?.trim() ?? '');\n this.datasourceCredentials = datasourceCredentials ?? '';\n this.defaultNotificationLevel = defaultNotificationLevel ?? 'debug';\n this.logLevel = parseLogLevel(logLevel);\n this.disableLogMasking = disableLogMasking === 'true';\n this.disableSessionManagement = disableSessionManagement === 'true';\n this.loggers = parseLoggerTypes(logging);\n this.fileLoggerDirectory = fileLoggerDirectory || join(__dirname, 'logs');\n\n this.tableauServerVersionCheckIntervalInHours = parseNumber(\n tableauServerVersionCheckIntervalInHours,\n {\n defaultValue: 1,\n minValue: 1,\n maxValue: 24 * 7, // 7 days\n },\n );\n\n this.passthroughAuthUserSessionCheckIntervalInMinutes = parseNumber(\n passthroughAuthUserSessionCheckIntervalInMinutes,\n {\n defaultValue: 10,\n minValue: 0,\n maxValue: 60 * 24, // 24 hours\n },\n );\n\n this.mcpSiteSettingsCheckIntervalInMinutes = parseNumber(\n mcpSiteSettingsCheckIntervalInMinutes,\n {\n defaultValue: 10,\n minValue: 1,\n maxValue: 60 * 24, // 24 hours\n },\n );\n\n this.enableMcpSiteSettings = enableMcpSiteSettings !== 'false';\n this.allowSitesToConfigureRequestOverrides = allowSitesToConfigureRequestOverrides === 'true';\n this.enablePassthroughAuth = enablePassthroughAuth === 'true';\n const disableOauthOverride = disableOauth === 'true';\n const disableScopes = oauthDisableScopes === 'true';\n const enforceScopes = !disableScopes;\n const embeddedAuthzServer = oauthEmbeddedAuthzServer !== 'false';\n\n if (this.allowSitesToConfigureRequestOverrides && !this.enableMcpSiteSettings) {\n throw new Error(\n 'ALLOW_SITES_TO_CONFIGURE_REQUEST_OVERRIDES is \"true\", but MCP site settings are not enabled.',\n );\n }\n\n this.oauth = {\n enabled: disableOauthOverride ? false : !!oauthIssuer,\n embeddedAuthzServer,\n issuer: oauthIssuer ?? '',\n resourceUri: oauthResourceUri ?? `http://127.0.0.1:${this.httpPort}`,\n redirectUri: redirectUri || (oauthIssuer ? `${oauthIssuer}/Callback` : ''),\n lockSite: oauthLockSite !== 'false', // Site locking is enabled by default\n jwePrivateKey: oauthJwePrivateKey ?? '',\n jwePrivateKeyPath: oauthJwePrivateKeyPath ?? '',\n jwePrivateKeyPassphrase: oauthJwePrivateKeyPassphrase || undefined,\n dnsServers: dnsServers\n ? dnsServers.split(',').map((ip) => ip.trim())\n : ['1.1.1.1', '1.0.0.1' /* Cloudflare public DNS */],\n authzCodeTimeoutMs: parseNumber(authzCodeTimeoutMs, {\n defaultValue: TEN_MINUTES_IN_MS,\n minValue: 0,\n maxValue: ONE_HOUR_IN_MS,\n }),\n accessTokenTimeoutMs: parseNumber(accessTokenTimeoutMs, {\n defaultValue: ONE_HOUR_IN_MS,\n minValue: 0,\n maxValue: THIRTY_DAYS_IN_MS,\n }),\n refreshTokenTimeoutMs: parseNumber(refreshTokenTimeoutMs, {\n defaultValue: THIRTY_DAYS_IN_MS,\n minValue: 0,\n maxValue: ONE_YEAR_IN_MS,\n }),\n clientIdSecretPairs: oauthClientIdSecretPairs\n ? oauthClientIdSecretPairs.split(',').reduce<Record<string, string>>((acc, curr) => {\n const [clientId, secret] = curr.split(':');\n if (clientId && secret) {\n acc[clientId] = secret;\n }\n return acc;\n }, {})\n : null,\n enforceScopes,\n advertiseApiScopes: advertiseApiScopes === 'true',\n };\n\n if (\n this.oauth.clientIdSecretPairs &&\n Object.keys(this.oauth.clientIdSecretPairs).length === 0\n ) {\n throw new Error(\n `OAUTH_CLIENT_ID_SECRET_PAIRS is in an invalid format: ${oauthClientIdSecretPairs}. Should be in the format: clientId:secret`,\n );\n }\n\n const parsedProvider = isTelemetryProvider(telemetryProvider) ? telemetryProvider : 'noop';\n if (parsedProvider === 'custom') {\n if (!telemetryProviderConfig) {\n throw new Error(\n 'TELEMETRY_PROVIDER_CONFIG is required when TELEMETRY_PROVIDER is \"custom\"',\n );\n }\n this.telemetry = {\n provider: 'custom',\n providerConfig: providerConfigSchema.parse(JSON.parse(telemetryProviderConfig)),\n };\n } else {\n this.telemetry = {\n provider: 'noop',\n };\n }\n\n this.latencyMetricName = latencyMetricName || 'http_server_1agg1_request_duration';\n this.productTelemetryEndpoint =\n productTelemetryEndpoint || 'https://prod.telemetry.tableausoftware.com';\n this.productTelemetryEnabled = productTelemetryEnabled !== 'false';\n this.isHyperforce = isHyperforce === 'true';\n this.breakGlassDisableGlobally = breakGlassDisableGlobally === 'true';\n\n this.auth = isAuthType(auth) ? auth : this.oauth.enabled ? 'oauth' : 'pat';\n this.transport = isTransport(transport) ? transport : this.oauth.enabled ? 'http' : 'stdio';\n\n if (this.transport === 'http' && !disableOauthOverride && !this.oauth.issuer) {\n throw new Error(\n 'OAUTH_ISSUER must be set when TRANSPORT is \"http\" unless DANGEROUSLY_DISABLE_OAUTH is \"true\"',\n );\n }\n\n if (this.auth === 'oauth') {\n if (disableOauthOverride) {\n throw new Error('When AUTH is \"oauth\", DANGEROUSLY_DISABLE_OAUTH cannot be \"true\"');\n }\n\n if (!this.oauth.issuer) {\n throw new Error('When AUTH is \"oauth\", OAUTH_ISSUER must be set');\n }\n } else {\n invariant(server, 'The environment variable SERVER is not set');\n validateServer(server);\n }\n\n if (this.oauth.enabled) {\n if (this.oauth.embeddedAuthzServer) {\n invariant(this.oauth.redirectUri, 'The environment variable OAUTH_REDIRECT_URI is not set');\n\n if (!this.oauth.jwePrivateKey && !this.oauth.jwePrivateKeyPath) {\n throw new Error(\n 'One of the environment variables: OAUTH_JWE_PRIVATE_KEY_PATH or OAUTH_JWE_PRIVATE_KEY must be set',\n );\n }\n\n if (this.oauth.jwePrivateKey && this.oauth.jwePrivateKeyPath) {\n throw new Error(\n 'Only one of the environment variables: OAUTH_JWE_PRIVATE_KEY or OAUTH_JWE_PRIVATE_KEY_PATH must be set',\n );\n }\n\n if (\n this.oauth.jwePrivateKeyPath &&\n process.env.TABLEAU_MCP_TEST !== 'true' &&\n !existsSync(this.oauth.jwePrivateKeyPath)\n ) {\n throw new Error(\n `OAuth JWE private key path does not exist: ${this.oauth.jwePrivateKeyPath}`,\n );\n }\n }\n\n if (this.transport === 'stdio') {\n throw new Error('TRANSPORT must be \"http\" when OAUTH_ISSUER is set');\n }\n }\n\n this.maxRequestTimeoutMs = parseNumber(maxRequestTimeoutMs, {\n defaultValue: TEN_MINUTES_IN_MS,\n minValue: 5000,\n maxValue: ONE_HOUR_IN_MS,\n });\n\n if (this.auth === 'pat') {\n invariant(patName, 'The environment variable PAT_NAME is not set');\n invariant(patValue, 'The environment variable PAT_VALUE is not set');\n } else if (this.auth === 'direct-trust') {\n invariant(jwtSubClaim, 'The environment variable JWT_SUB_CLAIM is not set');\n invariant(clientId, 'The environment variable CONNECTED_APP_CLIENT_ID is not set');\n invariant(secretId, 'The environment variable CONNECTED_APP_SECRET_ID is not set');\n invariant(secretValue, 'The environment variable CONNECTED_APP_SECRET_VALUE is not set');\n\n jwtUsername = jwtSubClaim ?? '';\n } else if (this.auth === 'uat') {\n invariant(uatTenantId, 'The environment variable UAT_TENANT_ID is not set');\n invariant(uatIssuer, 'The environment variable UAT_ISSUER is not set');\n\n if (!uatUsernameClaim && !jwtSubClaim) {\n throw new Error(\n 'One of the environment variables: UAT_USERNAME_CLAIM or JWT_SUB_CLAIM must be set',\n );\n }\n\n jwtUsername = uatUsernameClaim ?? jwtSubClaim ?? '';\n\n if (!uatPrivateKey && !uatPrivateKeyPath) {\n throw new Error(\n 'One of the environment variables: UAT_PRIVATE_KEY_PATH or UAT_PRIVATE_KEY must be set',\n );\n }\n\n if (uatPrivateKey && uatPrivateKeyPath) {\n throw new Error(\n 'Only one of the environment variables: UAT_PRIVATE_KEY or UAT_PRIVATE_KEY_PATH must be set',\n );\n }\n\n if (\n uatPrivateKeyPath &&\n process.env.TABLEAU_MCP_TEST !== 'true' &&\n !existsSync(uatPrivateKeyPath)\n ) {\n throw new Error(`UAT private key path does not exist: ${uatPrivateKeyPath}`);\n }\n }\n\n this.server = server ?? '';\n this.patName = patName ?? '';\n this.patValue = patValue ?? '';\n this.jwtUsername = jwtUsername ?? '';\n this.connectedAppClientId = clientId ?? '';\n this.connectedAppSecretId = secretId ?? '';\n this.connectedAppSecretValue = secretValue ?? '';\n this.uatTenantId = uatTenantId ?? '';\n this.uatIssuer = uatIssuer ?? '';\n this.uatUsernameClaimName = uatUsernameClaimName || 'email';\n this.uatPrivateKey =\n uatPrivateKey || (uatPrivateKeyPath ? readFileSync(uatPrivateKeyPath, 'utf8') : '');\n this.uatKeyId = uatKeyId ?? '';\n this.jwtAdditionalPayload = jwtAdditionalPayload || '{}';\n }\n}\n\nfunction validateServer(server: string): void {\n if (!['https://', 'http://'].find((prefix) => server.startsWith(prefix))) {\n throw new Error(\n `The environment variable SERVER must start with \"http://\" or \"https://\": ${server}`,\n );\n }\n\n try {\n const _ = new URL(server);\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `The environment variable SERVER is not a valid URL: ${server} -- ${errorMessage}`,\n );\n }\n}\n\nfunction getCorsOriginConfig(corsOriginConfig: string): CorsOptions['origin'] {\n if (!corsOriginConfig) {\n return true;\n }\n\n if (corsOriginConfig.match(/^true|false$/i)) {\n return corsOriginConfig.toLowerCase() === 'true';\n }\n\n if (corsOriginConfig === '*') {\n return '*';\n }\n\n if (corsOriginConfig.startsWith('[') && corsOriginConfig.endsWith(']')) {\n try {\n const origins = JSON.parse(corsOriginConfig) as Array<string>;\n return origins.map((origin) => new URL(origin).origin);\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${corsOriginConfig}`,\n );\n }\n }\n\n try {\n return new URL(corsOriginConfig).origin;\n } catch {\n throw new Error(\n `The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${corsOriginConfig}`,\n );\n }\n}\n\n// When the user does not provide a site name in the Claude MCP Bundle configuration,\n// Claude doesn't replace its value and sets the site name to \"${user_config.site_name}\".\nexport function removeClaudeMcpBundleUserConfigTemplates(\n envVars: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n return Object.entries(envVars).reduce<Record<string, string | undefined>>((acc, [key, value]) => {\n if (value?.startsWith('${user_config.')) {\n acc[key] = '';\n } else {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\nexport const getConfig = (): Config => new Config();\n\nexport const exportedForTesting = {\n Config,\n};\n", "import { appendFile } from 'node:fs/promises';\n\nimport { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nimport { getExceptionMessage } from '../utils/getExceptionMessage.js';\nimport type { LogEntry } from './types.js';\n\nlet _fileLogger: FileLogger | undefined;\n\nexport const setFileLogger = (logger: FileLogger): void => {\n _fileLogger = logger;\n};\n\nexport const getFileLogger = (): FileLogger | undefined => _fileLogger;\n\nexport class FileLogger {\n private readonly _logDirectory: string;\n private readonly _fileMutexes = new Map<string, Promise<void>>();\n\n constructor({ logDirectory }: { logDirectory: string }) {\n this._logDirectory = logDirectory;\n\n if (!existsSync(this._logDirectory)) {\n mkdirSync(this._logDirectory, { recursive: true });\n }\n }\n\n async log(entry: LogEntry): Promise<void> {\n // Create a new log file each hour e.g. 2025-10-15T21-00-00-000Z.log\n const timestamp = new Date().toISOString();\n const filename = `${new Date(new Date().setMinutes(0, 0, 0)).toISOString().replace(/[:.]/g, '-')}.log`;\n const logFilePath = join(this._logDirectory, filename);\n\n // Get or create a mutex for this specific log file\n const mutexKey = logFilePath;\n const currentMutex = this._fileMutexes.get(mutexKey) ?? Promise.resolve();\n\n // Chain the file write operation after the current mutex\n const newMutex = currentMutex.then(async () => {\n try {\n // appendFile will create the file if it doesn't exist\n await appendFile(logFilePath, JSON.stringify({ timestamp, ...entry }) + '\\n');\n } catch (error) {\n process.stderr.write(\n `Failed to write to log file ${logFilePath}: ${getExceptionMessage(error)}\\n`,\n );\n }\n });\n\n this._fileMutexes.set(mutexKey, newMutex);\n\n // Clean up completed mutexes to prevent memory leaks\n newMutex.finally(() => {\n if (this._fileMutexes.get(mutexKey) === newMutex) {\n this._fileMutexes.delete(mutexKey);\n }\n });\n\n // Wait for the file write operation to complete\n await newMutex;\n }\n}\n", "import type { LoggingLevel } from '@modelcontextprotocol/sdk/types.js';\n\nexport type LogLevel = LoggingLevel;\nexport const orderedLogLevels = [\n 'debug',\n 'info',\n 'notice',\n 'warning',\n 'error',\n 'critical',\n 'alert',\n 'emergency',\n] as const;\n\nexport const logLevelSeverity = Object.fromEntries(\n orderedLogLevels.map((level, index) => [level, index]),\n) as Record<LogLevel, number>;\n\nexport type LogEntry = {\n message: string;\n error?: unknown;\n level: LogLevel;\n logger: string | undefined;\n};\n", "import { getConfig } from '../config.js';\nimport { getFileLogger } from './fileLogger.js';\nimport { LogEntry, LogLevel, logLevelSeverity } from './types.js';\n\nexport const loggerTypes = ['fileLogger', 'appLogger'] as const;\nexport type LoggerType = (typeof loggerTypes)[number];\nconst validLoggerTypes = new Set(loggerTypes);\n\nexport function shouldLog(entryLevel: LogLevel, minLevel: LogLevel): boolean {\n return logLevelSeverity[entryLevel] >= logLevelSeverity[minLevel];\n}\n\nfunction isLogLevel(value: string): value is LogLevel {\n return value in logLevelSeverity;\n}\n\nexport function parseLogLevel(value: string | undefined): LogLevel {\n const level = value?.trim();\n if (level && isLogLevel(level)) {\n return level;\n }\n return 'info';\n}\n\nexport function parseLoggerTypes(value: string | undefined): Set<LoggerType> {\n if (!value) {\n return new Set<LoggerType>(['appLogger']);\n }\n return new Set(\n value\n .split(',')\n .map((s) => s.trim())\n .filter((s): s is LoggerType => validLoggerTypes.has(s as LoggerType)),\n );\n}\n\nexport function log(entry: LogEntry): void {\n const config = getConfig();\n if (!shouldLog(entry.level, config.logLevel)) {\n return;\n }\n if (config.loggers.has('appLogger')) {\n const message = JSON.stringify(entry);\n if (config.transport === 'http') {\n if (entry.error) {\n // eslint-disable-next-line no-console -- console.log is intentional here since the transport is not stdio.\n console.log(message, entry.error);\n } else {\n // eslint-disable-next-line no-console -- console.log is intentional here since the transport is not stdio.\n console.log(message);\n }\n } else {\n process.stderr.write(message.endsWith('\\n') ? message : `${message}\\n`);\n }\n }\n if (config.loggers.has('fileLogger')) {\n getFileLogger()?.log(entry);\n }\n}\n", "import { z } from 'zod';\n\n/**\n * Telemetry provider interface for metrics collection.\n */\nexport interface TelemetryProvider {\n /**\n * Initialize the telemetry provider.\n */\n initialize(): void;\n\n /**\n * Record a custom metric with the given name and attributes.\n *\n * @param name - The metric name (e.g., 'apm_mcp_tool_calls')\n * @param value - The metric value (default: 1 for counters)\n * @param attributes - Dimensions/tags for the metric\n *\n * @example\n * ```typescript\n * telemetry.recordMetric('apm_mcp_tool_calls', 1, {\n * tool_name: 'list-pulse-metric-subscriptions',\n * });\n * ```\n */\n recordMetric(name: string, value: number, attributes: TelemetryAttributes): void;\n\n /**\n * Record a histogram observation (e.g., latency) with the given name and attributes.\n *\n * @param name - The metric name (e.g., 'http_server_request_duration')\n * @param value - The observed value (e.g., duration in milliseconds)\n * @param attributes - Dimensions/tags for the metric\n *\n * @example\n * ```typescript\n * telemetry.recordHistogram('apm_mcp_tool_duration', 142.5, {\n * tool_name: 'get-datasource-metadata',\n * success: true,\n * });\n * ```\n */\n recordHistogram(name: string, value: number, attributes: TelemetryAttributes): void;\n}\n\n/**\n * Schema for telemetry attributes.\n * Values can be strings, numbers, booleans, or undefined.\n */\nexport const telemetryAttributesSchema = z.record(\n z.string(),\n z.union([z.string(), z.number(), z.boolean(), z.undefined()]),\n);\nexport type TelemetryAttributes = z.infer<typeof telemetryAttributesSchema>;\n\n/**\n * Valid telemetry provider names\n */\nexport const telemetryProviderSchema = z.enum(['noop', 'custom']);\nexport type TelemetryProviderType = z.infer<typeof telemetryProviderSchema>;\n\n/**\n * Schema for noop telemetry config (no telemetry)\n */\nexport const noopTelemetryConfigSchema = z.object({\n provider: z.literal('noop'),\n});\n\n/**\n * Schema for custom telemetry provider config.\n * Requires 'module' field, allows additional provider-specific options.\n */\nexport const providerConfigSchema = z\n .object({\n module: z.string({ required_error: 'Custom provider requires \"module\" path' }),\n })\n .passthrough();\n\n/**\n * Schema for custom telemetry config\n *\n * @example\n * ```json\n * {\n * \"provider\": \"custom\",\n * \"providerConfig\": {\n * \"module\": \"./my-otel-provider.js\"\n * }\n * }\n * ```\n */\nexport const customTelemetryConfigSchema = z.object({\n provider: z.literal('custom'),\n providerConfig: providerConfigSchema,\n});\n\n/**\n * Combined telemetry config schema (discriminated union)\n */\nexport const telemetryConfigSchema = z.discriminatedUnion('provider', [\n noopTelemetryConfigSchema,\n customTelemetryConfigSchema,\n]);\n\nexport type TelemetryConfig = z.infer<typeof telemetryConfigSchema>;\n\n/**\n * Type guard for telemetry provider names\n */\nexport function isTelemetryProvider(provider: unknown): provider is TelemetryProviderType {\n return telemetryProviderSchema.safeParse(provider).success;\n}\n", "const transports = ['stdio', 'http'] as const;\nexport type TransportName = (typeof transports)[number];\nexport function isTransport(transport: unknown): transport is TransportName {\n return !!transports.find((t) => t === transport);\n}\n", "export function getDirname(): string {\n if (typeof __dirname === 'string') {\n return __dirname;\n }\n\n throw new Error('__dirname is not set');\n}\n", "export default function invariant(condition: unknown, message?: string): asserts condition {\n if (!condition) {\n throw new Error(message ? message : 'Invariant Violation');\n }\n}\n", "export function parseNumber(\n value: string | undefined,\n {\n defaultValue,\n minValue,\n maxValue,\n }: { defaultValue: number; minValue?: number; maxValue?: number } = {\n defaultValue: 0,\n minValue: Number.NEGATIVE_INFINITY,\n maxValue: Number.POSITIVE_INFINITY,\n },\n): number {\n if (!value) {\n return defaultValue;\n }\n\n const number = parseFloat(value);\n return isNaN(number) ||\n (minValue !== undefined && number < minValue) ||\n (maxValue !== undefined && number > maxValue)\n ? defaultValue\n : number;\n}\n", "/**\n * NoOp telemetry provider - does nothing.\n * This is the default provider when telemetry is disabled.\n *\n * Zero overhead implementation that can be safely used in production\n * when telemetry is not needed.\n */\n\nimport { TelemetryAttributes, TelemetryProvider } from './types.js';\n\nexport class NoOpTelemetryProvider implements TelemetryProvider {\n initialize(): void {\n // No-op\n }\n\n recordMetric(_name: string, _value: number, _attributes: TelemetryAttributes): void {\n // No-op\n }\n\n recordHistogram(_name: string, _value: number, _attributes: TelemetryAttributes): void {\n // No-op\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_dotenv", "import_path", "import_fs", "import_path", "_fileLogger", "getFileLogger", "_fileLogger", "orderedLogLevels", "logLevelSeverity", "level", "index", "loggerTypes", "validLoggerTypes", "shouldLog", "entryLevel", "minLevel", "logLevelSeverity", "isLogLevel", "value", "parseLogLevel", "level", "parseLoggerTypes", "s", "log", "entry", "config", "getConfig", "message", "getFileLogger", "import_zod", "telemetryAttributesSchema", "telemetryProviderSchema", "noopTelemetryConfigSchema", "providerConfigSchema", "customTelemetryConfigSchema", "telemetryConfigSchema", "isTelemetryProvider", "provider", "transports", "isTransport", "transport", "getDirname", "invariant", "condition", "message", "parseNumber", "value", "defaultValue", "minValue", "maxValue", "number", "__dirname", "getDirname", "TEN_MINUTES_IN_MS", "ONE_HOUR_IN_MS", "ONE_DAY_IN_MS", "THIRTY_DAYS_IN_MS", "ONE_YEAR_IN_MS", "authTypes", "isAuthType", "auth", "type", "Config", "cleansedVars", "removeClaudeMcpBundleUserConfigTemplates", "server", "siteName", "transport", "sslKey", "sslCert", "httpPortEnvVarName", "corsOriginConfig", "patName", "patValue", "jwtSubClaim", "clientId", "secretId", "secretValue", "uatTenantId", "uatIssuer", "uatUsernameClaimName", "uatUsernameClaim", "uatPrivateKey", "uatPrivateKeyPath", "uatKeyId", "jwtAdditionalPayload", "datasourceCredentials", "defaultNotificationLevel", "logLevel", "disableLogMasking", "maxRequestTimeoutMs", "disableSessionManagement", "logging", "fileLoggerDirectory", "tableauServerVersionCheckIntervalInHours", "passthroughAuthUserSessionCheckIntervalInMinutes", "mcpSiteSettingsCheckIntervalInMinutes", "enableMcpSiteSettings", "allowSitesToConfigureRequestOverrides", "enablePassthroughAuth", "disableOauth", "oauthEmbeddedAuthzServer", "oauthIssuer", "oauthLockSite", "oauthJwePrivateKey", "oauthJwePrivateKeyPath", "oauthJwePrivateKeyPassphrase", "oauthResourceUri", "redirectUri", "oauthClientIdSecretPairs", "dnsServers", "advertiseApiScopes", "authzCodeTimeoutMs", "accessTokenTimeoutMs", "refreshTokenTimeoutMs", "oauthDisableScopes", "telemetryProvider", "telemetryProviderConfig", "latencyMetricName", "productTelemetryEndpoint", "productTelemetryEnabled", "isHyperforce", "breakGlassDisableGlobally", "jwtUsername", "parseNumber", "getCorsOriginConfig", "parseLogLevel", "parseLoggerTypes", "disableOauthOverride", "enforceScopes", "embeddedAuthzServer", "ip", "acc", "curr", "secret", "isTelemetryProvider", "providerConfigSchema", "isTransport", "invariant", "validateServer", "prefix", "_", "error", "errorMessage", "origin", "envVars", "key", "value", "getConfig", "NoOpTelemetryProvider", "_name", "_value", "_attributes", "getInstanceMethods", "cls", "name", "isRecord", "obj", "validateTelemetryProvider", "provider", "missingMethods", "NoOpTelemetryProvider", "method", "initializeTelemetry", "config", "getConfig", "provider", "loadCustomProvider", "NoOpTelemetryProvider", "error", "log", "fallbackProvider", "modulePath", "resolvedPath", "module", "ProviderClass", "validateTelemetryProvider", "errorMessage", "dotenv", "initializeTelemetry", "error"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tableau/mcp-server",
3
3
  "description": "Helping agents see and understand data.",
4
- "version": "2.0.0",
4
+ "version": "2.1.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/tableau/tableau-mcp.git"