@tableau/mcp-server 1.14.5 → 1.17.8
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.
- package/build/index.js +834 -105
- package/build/index.js.map +4 -4
- package/build/telemetry/tracing.js +1 -1
- package/build/telemetry/tracing.js.map +4 -4
- package/package.json +3 -4
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var Me=Object.create;var z=Object.defineProperty;var xe=Object.getOwnPropertyDescriptor;var De=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,ke=Object.prototype.hasOwnProperty;var Ke=(e,t,i,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of De(t))!ke.call(e,o)&&o!==i&&z(e,o,{get:()=>t[o],enumerable:!(r=xe(t,o))||r.enumerable});return e};var He=(e,t,i)=>(i=e!=null?Me(Ve(e)):{},Ke(t||!e||!e.__esModule?z(i,"default",{value:e,enumerable:!0}):i,e));var oe=He(require("dotenv"));var re=require("path");var c=require("fs"),ee=require("path");var n=require("zod"),at=n.z.record(n.z.string(),n.z.union([n.z.string(),n.z.number(),n.z.boolean(),n.z.undefined()])),je=n.z.enum(["noop","custom"]),Ge=n.z.object({provider:n.z.literal("noop")}),y=n.z.object({module:n.z.string({required_error:'Custom provider requires "module" path'})}).passthrough(),Ye=n.z.object({provider:n.z.literal("custom"),providerConfig:y}),ut=n.z.discriminatedUnion("provider",[Ge,Ye]);function J(e){return je.safeParse(e).success}var We=["list-datasources","list-workbooks","list-views","query-datasource","get-datasource-metadata","get-workbook","get-view-data","get-view-image","list-all-pulse-metric-definitions","list-pulse-metric-definitions-from-definition-ids","list-pulse-metrics-from-metric-definition-id","list-pulse-metrics-from-metric-ids","list-pulse-metric-subscriptions","generate-pulse-metric-value-insight-bundle","generate-pulse-insight-brief","search-content"],qe=["datasource","workbook","view","pulse","content-exploration"],f={datasource:["list-datasources","get-datasource-metadata","query-datasource"],workbook:["list-workbooks","get-workbook"],view:["list-views","get-view-data","get-view-image"],pulse:["list-all-pulse-metric-definitions","list-pulse-metric-definitions-from-definition-ids","list-pulse-metrics-from-metric-definition-id","list-pulse-metrics-from-metric-ids","list-pulse-metric-subscriptions","generate-pulse-metric-value-insight-bundle","generate-pulse-insight-brief"],"content-exploration":["search-content"]};function v(e){return!!We.find(t=>t===e)}function A(e){return!!qe.find(t=>t===e)}var Be=["stdio","http"];function $(e){return!!Be.find(t=>t===e)}function Q(){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")}var Fe=Q(),X=10*60*1e3,N=60*60*1e3,gt=24*60*60*1e3,Z=30*24*60*60*1e3,ze=365.25*24*60*60*1e3,Je=["pat","uat","direct-trust","oauth"];function $e(e){return!!Je.find(t=>t===e)}var P=class{maxResultLimit;maxResultLimits;auth;server;transport;sslKey;sslCert;httpPort;corsOriginConfig;trustProxyConfig;siteName;patName;patValue;jwtUsername;connectedAppClientId;connectedAppSecretId;connectedAppSecretValue;uatTenantId;uatIssuer;uatUsernameClaimName;uatPrivateKey;uatKeyId;jwtAdditionalPayload;datasourceCredentials;defaultLogLevel;disableLogMasking;includeTools;excludeTools;maxRequestTimeoutMs;disableQueryDatasourceValidationRequests;disableMetadataApiRequests;disableSessionManagement;enableServerLogging;serverLogDirectory;boundedContext;tableauServerVersionCheckIntervalInHours;oauth;telemetry;getMaxResultLimit(t){return this.maxResultLimits?.get(t)??this.maxResultLimit}constructor(){let t=et(process.env),{AUTH:i,SERVER:r,SITE_NAME:o,TRANSPORT:u,SSL_KEY:h,SSL_CERT:p,HTTP_PORT_ENV_VAR_NAME:ne,CORS_ORIGIN_CONFIG:se,TRUST_PROXY_CONFIG:ae,PAT_NAME:w,PAT_VALUE:C,JWT_SUB_CLAIM:E,CONNECTED_APP_CLIENT_ID:U,CONNECTED_APP_SECRET_ID:O,CONNECTED_APP_SECRET_VALUE:L,UAT_TENANT_ID:M,UAT_ISSUER:x,UAT_USERNAME_CLAIM_NAME:ue,UAT_USERNAME_CLAIM:D,UAT_PRIVATE_KEY:g,UAT_PRIVATE_KEY_PATH:m,UAT_KEY_ID:le,JWT_ADDITIONAL_PAYLOAD:me,DATASOURCE_CREDENTIALS:de,DEFAULT_LOG_LEVEL:Te,DISABLE_LOG_MASKING:ce,INCLUDE_TOOLS:V,EXCLUDE_TOOLS:k,MAX_REQUEST_TIMEOUT_MS:he,MAX_RESULT_LIMIT:K,MAX_RESULT_LIMITS:H,DISABLE_QUERY_DATASOURCE_VALIDATION_REQUESTS:pe,DISABLE_METADATA_API_REQUESTS:Ee,DISABLE_SESSION_MANAGEMENT:_e,ENABLE_SERVER_LOGGING:fe,SERVER_LOG_DIRECTORY:ve,INCLUDE_PROJECT_IDS:Ae,INCLUDE_DATASOURCE_IDS:Ie,INCLUDE_WORKBOOK_IDS:ge,INCLUDE_TAGS:Se,TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS:Re,DANGEROUSLY_DISABLE_OAUTH:be,OAUTH_ISSUER:_,OAUTH_LOCK_SITE:ye,OAUTH_JWE_PRIVATE_KEY:Ne,OAUTH_JWE_PRIVATE_KEY_PATH:Pe,OAUTH_JWE_PRIVATE_KEY_PASSPHRASE:we,OAUTH_REDIRECT_URI:Ce,OAUTH_CLIENT_ID_SECRET_PAIRS:j,OAUTH_CIMD_DNS_SERVERS:G,OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS:Ue,OAUTH_ACCESS_TOKEN_TIMEOUT_MS:Oe,OAUTH_REFRESH_TOKEN_TIMEOUT_MS:Le,TELEMETRY_PROVIDER:Y,TELEMETRY_PROVIDER_CONFIG:W}=t,S="";if(this.siteName=o??"",this.sslKey=h?.trim()??"",this.sslCert=p?.trim()??"",this.httpPort=d(t[ne?.trim()||"PORT"],{defaultValue:3927,minValue:1,maxValue:65535}),this.corsOriginConfig=Xe(se?.trim()??""),this.trustProxyConfig=Ze(ae?.trim()??""),this.datasourceCredentials=de??"",this.defaultLogLevel=Te??"debug",this.disableLogMasking=ce==="true",this.disableQueryDatasourceValidationRequests=pe==="true",this.disableMetadataApiRequests=Ee==="true",this.disableSessionManagement=_e==="true",this.enableServerLogging=fe==="true",this.serverLogDirectory=ve||(0,ee.join)(Fe,"logs"),this.boundedContext={projectIds:I(Ae),datasourceIds:I(Ie),workbookIds:I(ge),tags:I(Se)},this.boundedContext.projectIds?.size===0)throw new Error("When set, the environment variable INCLUDE_PROJECT_IDS must have at least one value");if(this.boundedContext.datasourceIds?.size===0)throw new Error("When set, the environment variable INCLUDE_DATASOURCE_IDS must have at least one value");if(this.boundedContext.workbookIds?.size===0)throw new Error("When set, the environment variable INCLUDE_WORKBOOK_IDS must have at least one value");if(this.boundedContext.tags?.size===0)throw new Error("When set, the environment variable INCLUDE_TAGS must have at least one value");this.tableauServerVersionCheckIntervalInHours=d(Re,{defaultValue:1,minValue:1,maxValue:24*7});let R=be==="true";this.oauth={enabled:R?!1:!!_,issuer:_??"",redirectUri:Ce||(_?`${_}/Callback`:""),lockSite:ye!=="false",jwePrivateKey:Ne??"",jwePrivateKeyPath:Pe??"",jwePrivateKeyPassphrase:we||void 0,dnsServers:G?G.split(",").map(l=>l.trim()):["1.1.1.1","1.0.0.1"],authzCodeTimeoutMs:d(Ue,{defaultValue:X,minValue:0,maxValue:N}),accessTokenTimeoutMs:d(Oe,{defaultValue:N,minValue:0,maxValue:Z}),refreshTokenTimeoutMs:d(Le,{defaultValue:Z,minValue:0,maxValue:ze}),clientIdSecretPairs:j?j.split(",").reduce((l,a)=>{let[B,F]=a.split(":");return B&&F&&(l[B]=F),l},{}):null};let q=J(Y)?Y:"noop";if(q==="custom"){if(!W)throw new Error('TELEMETRY_PROVIDER_CONFIG is required when TELEMETRY_PROVIDER is "custom"');this.telemetry={provider:"custom",providerConfig:y.parse(JSON.parse(W))}}else this.telemetry={provider:q};if(this.auth=$e(i)?i:this.oauth.enabled?"oauth":"pat",this.transport=$(u)?u:this.oauth.enabled?"http":"stdio",this.transport==="http"&&!R&&!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(R)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(r,"The environment variable SERVER is not set"),Qe(r);if(this.oauth.enabled){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,c.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')}this.maxRequestTimeoutMs=d(he,{defaultValue:X,minValue:5e3,maxValue:N});let b=K?parseInt(K):NaN;if(this.maxResultLimit=isNaN(b)||b<=0?null:b,this.maxResultLimits=H?tt(H):null,this.includeTools=V?V.split(",").flatMap(l=>{let a=l.trim();return v(a)?a:A(a)?f[a]:[]}):[],this.excludeTools=k?k.split(",").flatMap(l=>{let a=l.trim();return v(a)?a:A(a)?f[a]:[]}):[],this.includeTools.length>0&&this.excludeTools.length>0)throw new Error("Cannot include and exclude tools simultaneously");if(this.auth==="pat")s(w,"The environment variable PAT_NAME is not set"),s(C,"The environment variable PAT_VALUE is not set");else if(this.auth==="direct-trust")s(E,"The environment variable JWT_SUB_CLAIM is not set"),s(U,"The environment variable CONNECTED_APP_CLIENT_ID is not set"),s(O,"The environment variable CONNECTED_APP_SECRET_ID is not set"),s(L,"The environment variable CONNECTED_APP_SECRET_VALUE is not set"),S=E??"";else if(this.auth==="uat"){if(s(M,"The environment variable UAT_TENANT_ID is not set"),s(x,"The environment variable UAT_ISSUER is not set"),!D&&!E)throw new Error("One of the environment variables: UAT_USERNAME_CLAIM or JWT_SUB_CLAIM must be set");if(S=D??E??"",!g&&!m)throw new Error("One of the environment variables: UAT_PRIVATE_KEY_PATH or UAT_PRIVATE_KEY must be set");if(g&&m)throw new Error("Only one of the environment variables: UAT_PRIVATE_KEY or UAT_PRIVATE_KEY_PATH must be set");if(m&&process.env.TABLEAU_MCP_TEST!=="true"&&!(0,c.existsSync)(m))throw new Error(`UAT private key path does not exist: ${m}`)}this.server=r??"",this.patName=w??"",this.patValue=C??"",this.jwtUsername=S??"",this.connectedAppClientId=U??"",this.connectedAppSecretId=O??"",this.connectedAppSecretValue=L??"",this.uatTenantId=M??"",this.uatIssuer=x??"",this.uatUsernameClaimName=ue||"email",this.uatPrivateKey=g||(m?(0,c.readFileSync)(m,"utf8"):""),this.uatKeyId=le??"",this.jwtAdditionalPayload=me||"{}"}};function Qe(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 i=t instanceof Error?t.message:String(t);throw new Error(`The environment variable SERVER is not a valid URL: ${e} -- ${i}`)}}function Xe(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(i=>new URL(i).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 Ze(e){return e?e.match(/^true|false$/i)?e.toLowerCase()==="true":e.match(/^\d+$/)?parseInt(e,10):e:null}function I(e){return e===void 0?null:new Set(e.trim().split(",").map(t=>t.trim()).filter(Boolean))}function et(e){return Object.entries(e).reduce((t,[i,r])=>(r?.startsWith("${user_config.")?t[i]="":t[i]=r,t),{})}function tt(e){let t=new Map;return e&&e.split(",").forEach(i=>{let[r,o]=i.split(":"),u=o?parseInt(o):NaN,h=isNaN(u)||u<=0?null:u;v(r)?t.set(r,h):A(r)&&f[r].forEach(p=>{t.has(p)||t.set(p,h)})}),t}function d(e,{defaultValue:t,minValue:i,maxValue:r}={defaultValue:0,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.POSITIVE_INFINITY}){if(!e)return t;let o=parseFloat(e);return isNaN(o)||i!==void 0&&o<i||r!==void 0&&o>r?t:o}var te=()=>new P;var T=class{initialize(){}recordMetric(t,i,r){}};function rt(e){return Object.getOwnPropertyNames(e.prototype).filter(t=>t!=="constructor"&&typeof e.prototype[t]=="function")}function it(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ot(e){if(!it(e))throw new Error("Provider must be an object");let i=rt(T).filter(r=>typeof e[r]!="function");if(i.length>0)throw new Error(`Custom provider missing required methods: ${i.join(", ")}`)}function ie(){let e=te(),t;try{switch(e.telemetry.provider){case"custom":t=nt(e.telemetry.providerConfig);break;case"noop":t=new T;break}return t.initialize(),global.__telemetryProvider=t,t}catch(i){console.error("Failed to initialize telemetry provider:",i),console.warn("Falling back to NoOp telemetry provider");let r=new T;return r.initialize(),global.__telemetryProvider=r,r}}function nt(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 i;t.startsWith(".")||t.startsWith("/")?i=(0,re.resolve)(process.cwd(),t):i=t;try{let r=require(i),o=r.default||r.TelemetryProvider;if(!o)throw new Error(`Module ${t} must export a default class or named export "TelemetryProvider" that implements the TelemetryProvider interface`);let u=new o(e);return ot(u),u}catch(r){let o=`Failed to load custom telemetry provider from "${t}". `;throw r instanceof Error&&"code"in r&&r.code==="MODULE_NOT_FOUND"?o+="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.":o+=`Error: ${r}`,new Error(o)}}oe.default.config();try{ie()}catch(e){console.warn("Failed to initialize telemetry:",e)}
|
|
1
|
+
"use strict";var Ue=Object.create;var V=Object.defineProperty;var Ne=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var we=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Le=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Oe(t))!Me.call(e,o)&&o!==r&&V(e,o,{get:()=>t[o],enumerable:!(i=Ne(t,o))||i.enumerable});return e};var Ve=(e,t,r)=>(r=e!=null?Ue(we(e)):{},Le(t||!e||!e.__esModule?V(r,"default",{value:e,enumerable:!0}):r,e));var W=Ve(require("dotenv"));var G=require("path");var d=require("fs"),Y=require("path");var n=require("zod"),tt=n.z.record(n.z.string(),n.z.union([n.z.string(),n.z.number(),n.z.boolean(),n.z.undefined()])),De=n.z.enum(["noop","custom"]),He=n.z.object({provider:n.z.literal("noop")}),v=n.z.object({module:n.z.string({required_error:'Custom provider requires "module" path'})}).passthrough(),Ke=n.z.object({provider:n.z.literal("custom"),providerConfig:v}),rt=n.z.discriminatedUnion("provider",[He,Ke]);function D(e){return De.safeParse(e).success}var xe=["stdio","http"];function H(e){return!!xe.find(t=>t===e)}function K(){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")}var ke=K(),x=10*60*1e3,S=60*60*1e3,Et=24*60*60*1e3,k=30*24*60*60*1e3,Ye=365.25*24*60*60*1e3,je=["pat","uat","direct-trust","oauth"];function Ge(e){return je.some(t=>t===e)}var f=class{auth;server;transport;sslKey;sslCert;httpPort;corsOriginConfig;trustProxyConfig;siteName;patName;patValue;jwtUsername;connectedAppClientId;connectedAppSecretId;connectedAppSecretValue;uatTenantId;uatIssuer;uatUsernameClaimName;uatPrivateKey;uatKeyId;jwtAdditionalPayload;datasourceCredentials;defaultLogLevel;disableLogMasking;maxRequestTimeoutMs;disableSessionManagement;enableServerLogging;serverLogDirectory;tableauServerVersionCheckIntervalInHours;mcpSiteSettingsCheckIntervalInMinutes;enableMcpSiteSettings;oauth;telemetry;productTelemetryEndpoint;productTelemetryEnabled;isHyperforce;constructor(){let t=$e(process.env),{AUTH:r,SERVER:i,SITE_NAME:o,TRANSPORT:m,SSL_KEY:z,SSL_CERT:$,HTTP_PORT_ENV_VAR_NAME:B,CORS_ORIGIN_CONFIG:J,TRUST_PROXY_CONFIG:q,PAT_NAME:I,PAT_VALUE:P,JWT_SUB_CLAIM:T,CONNECTED_APP_CLIENT_ID:y,CONNECTED_APP_SECRET_ID:R,CONNECTED_APP_SECRET_VALUE:g,UAT_TENANT_ID:b,UAT_ISSUER:C,UAT_USERNAME_CLAIM_NAME:X,UAT_USERNAME_CLAIM:U,UAT_PRIVATE_KEY:_,UAT_PRIVATE_KEY_PATH:a,UAT_KEY_ID:Z,JWT_ADDITIONAL_PAYLOAD:Q,DATASOURCE_CREDENTIALS:ee,DEFAULT_LOG_LEVEL:te,DISABLE_LOG_MASKING:re,MAX_REQUEST_TIMEOUT_MS:ie,DISABLE_SESSION_MANAGEMENT:oe,ENABLE_SERVER_LOGGING:ne,SERVER_LOG_DIRECTORY:se,TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS:ae,MCP_SITE_SETTINGS_CHECK_INTERVAL_IN_MINUTES:ue,ENABLE_MCP_SITE_SETTINGS:le,DANGEROUSLY_DISABLE_OAUTH:me,OAUTH_EMBEDDED_AUTHZ_SERVER:de,OAUTH_ISSUER:E,OAUTH_LOCK_SITE:Te,OAUTH_JWE_PRIVATE_KEY:Ee,OAUTH_JWE_PRIVATE_KEY_PATH:he,OAUTH_JWE_PRIVATE_KEY_PASSPHRASE:_e,OAUTH_RESOURCE_URI:ce,OAUTH_REDIRECT_URI:pe,OAUTH_CLIENT_ID_SECRET_PAIRS:c,OAUTH_CIMD_DNS_SERVERS:N,ADVERTISE_API_SCOPES:Ae,OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS:ve,OAUTH_ACCESS_TOKEN_TIMEOUT_MS:Se,OAUTH_REFRESH_TOKEN_TIMEOUT_MS:fe,OAUTH_DISABLE_SCOPES:Ie,TELEMETRY_PROVIDER:O,TELEMETRY_PROVIDER_CONFIG:w,PRODUCT_TELEMETRY_ENDPOINT:Pe,PRODUCT_TELEMETRY_ENABLED:ye,IS_HYPERFORCE:Re}=t,p="";this.siteName=o??"",this.sslKey=z?.trim()??"",this.sslCert=$?.trim()??"",this.httpPort=u(t[B?.trim()||"PORT"],{defaultValue:3927,minValue:1,maxValue:65535}),this.corsOriginConfig=We(J?.trim()??""),this.trustProxyConfig=ze(q?.trim()??""),this.datasourceCredentials=ee??"",this.defaultLogLevel=te??"debug",this.disableLogMasking=re==="true",this.disableSessionManagement=oe==="true",this.enableServerLogging=ne==="true",this.serverLogDirectory=se||(0,Y.join)(ke,"logs"),this.tableauServerVersionCheckIntervalInHours=u(ae,{defaultValue:1,minValue:1,maxValue:24*7}),this.mcpSiteSettingsCheckIntervalInMinutes=u(ue,{defaultValue:10,minValue:1,maxValue:60*24}),this.enableMcpSiteSettings=le==="true";let A=me==="true",ge=!(Ie==="true"),be=de!=="false";if(this.oauth={enabled:A?!1:!!E,embeddedAuthzServer:be,issuer:E??"",resourceUri:ce??`http://127.0.0.1:${this.httpPort}`,redirectUri:pe||(E?`${E}/Callback`:""),lockSite:Te!=="false",jwePrivateKey:Ee??"",jwePrivateKeyPath:he??"",jwePrivateKeyPassphrase:_e||void 0,dnsServers:N?N.split(",").map(h=>h.trim()):["1.1.1.1","1.0.0.1"],authzCodeTimeoutMs:u(ve,{defaultValue:x,minValue:0,maxValue:S}),accessTokenTimeoutMs:u(Se,{defaultValue:S,minValue:0,maxValue:k}),refreshTokenTimeoutMs:u(fe,{defaultValue:k,minValue:0,maxValue:Ye}),clientIdSecretPairs:c?c.split(",").reduce((h,Ce)=>{let[M,L]=Ce.split(":");return M&&L&&(h[M]=L),h},{}):null,enforceScopes:ge,advertiseApiScopes:Ae==="true"},this.oauth.clientIdSecretPairs&&Object.keys(this.oauth.clientIdSecretPairs).length===0)throw new Error(`OAUTH_CLIENT_ID_SECRET_PAIRS is in an invalid format: ${c}. Should be in the format: clientId:secret`);if((D(O)?O:"noop")==="custom"){if(!w)throw new Error('TELEMETRY_PROVIDER_CONFIG is required when TELEMETRY_PROVIDER is "custom"');this.telemetry={provider:"custom",providerConfig:v.parse(JSON.parse(w))}}else this.telemetry={provider:"noop"};if(this.productTelemetryEndpoint=Pe||"https://prod.telemetry.tableausoftware.com",this.productTelemetryEnabled=ye!=="false",this.isHyperforce=Re==="true",this.auth=Ge(r)?r:this.oauth.enabled?"oauth":"pat",this.transport=H(m)?m:this.oauth.enabled?"http":"stdio",this.transport==="http"&&!A&&!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(A)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(i,"The environment variable SERVER is not set"),Fe(i);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=u(ie,{defaultValue:x,minValue:5e3,maxValue:S}),this.auth==="pat")s(I,"The environment variable PAT_NAME is not set"),s(P,"The environment variable PAT_VALUE is not set");else if(this.auth==="direct-trust")s(T,"The environment variable JWT_SUB_CLAIM is not set"),s(y,"The environment variable CONNECTED_APP_CLIENT_ID is not set"),s(R,"The environment variable CONNECTED_APP_SECRET_ID is not set"),s(g,"The environment variable CONNECTED_APP_SECRET_VALUE is not set"),p=T??"";else if(this.auth==="uat"){if(s(b,"The environment variable UAT_TENANT_ID is not set"),s(C,"The environment variable UAT_ISSUER is not set"),!U&&!T)throw new Error("One of the environment variables: UAT_USERNAME_CLAIM or JWT_SUB_CLAIM must be set");if(p=U??T??"",!_&&!a)throw new Error("One of the environment variables: UAT_PRIVATE_KEY_PATH or UAT_PRIVATE_KEY must be set");if(_&&a)throw new Error("Only one of the environment variables: UAT_PRIVATE_KEY or UAT_PRIVATE_KEY_PATH must be set");if(a&&process.env.TABLEAU_MCP_TEST!=="true"&&!(0,d.existsSync)(a))throw new Error(`UAT private key path does not exist: ${a}`)}this.server=i??"",this.patName=I??"",this.patValue=P??"",this.jwtUsername=p??"",this.connectedAppClientId=y??"",this.connectedAppSecretId=R??"",this.connectedAppSecretValue=g??"",this.uatTenantId=b??"",this.uatIssuer=C??"",this.uatUsernameClaimName=X||"email",this.uatPrivateKey=_||(a?(0,d.readFileSync)(a,"utf8"):""),this.uatKeyId=Z??"",this.jwtAdditionalPayload=Q||"{}"}};function Fe(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 We(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 ze(e){return e?e.match(/^true|false$/i)?e.toLowerCase()==="true":e.match(/^\d+$/)?parseInt(e,10):e:null}function $e(e){return Object.entries(e).reduce((t,[r,i])=>(i?.startsWith("${user_config.")?t[r]="":t[r]=i,t),{})}function u(e,{defaultValue:t,minValue:r,maxValue:i}={defaultValue:0,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.POSITIVE_INFINITY}){if(!e)return t;let o=parseFloat(e);return isNaN(o)||r!==void 0&&o<r||i!==void 0&&o>i?t:o}var j=()=>new f;var l=class{initialize(){}recordMetric(t,r,i){}};function Be(e){return Object.getOwnPropertyNames(e.prototype).filter(t=>t!=="constructor"&&typeof e.prototype[t]=="function")}function Je(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function qe(e){if(!Je(e))throw new Error("Provider must be an object");let r=Be(l).filter(i=>typeof e[i]!="function");if(r.length>0)throw new Error(`Custom provider missing required methods: ${r.join(", ")}`)}function F(){let e=j(),t;try{switch(e.telemetry.provider){case"custom":t=Xe(e.telemetry.providerConfig);break;case"noop":t=new l;break}return t.initialize(),global.__telemetryProvider=t,t}catch(r){console.error("Failed to initialize telemetry provider:",r),console.warn("Falling back to NoOp telemetry provider");let i=new l;return i.initialize(),global.__telemetryProvider=i,i}}function Xe(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,G.resolve)(process.cwd(),t):r=t;try{let i=require(r),o=i.default||i.TelemetryProvider;if(!o)throw new Error(`Module ${t} must export a default class or named export "TelemetryProvider" that implements the TelemetryProvider interface`);let m=new o(e);return qe(m),m}catch(i){let o=`Failed to load custom telemetry provider from "${t}". `;throw i instanceof Error&&"code"in i&&i.code==="MODULE_NOT_FOUND"?o+="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.":o+=`Error: ${i}`,new Error(o)}}W.default.config();try{F()}catch(e){console.warn("Failed to initialize telemetry:",e)}
|
|
2
2
|
//# sourceMappingURL=tracing.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/telemetry/tracing.ts", "../../src/telemetry/init.ts", "../../src/config.ts", "../../src/telemetry/types.ts", "../../src/
|
|
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 { 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 console.error('Failed to initialize telemetry provider:', error);\n console.warn('Falling back to NoOp telemetry provider');\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 { isTelemetryProvider, providerConfigSchema, TelemetryConfig } from './telemetry/types.js';\nimport { isToolGroupName, isToolName, toolGroups, ToolName } from './tools/toolName.js';\nimport { isTransport, TransportName } from './transports.js';\nimport { getDirname } from './utils/getDirname.js';\nimport invariant from './utils/invariant.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.find((type) => type === auth);\n}\n\nexport type BoundedContext = {\n projectIds: Set<string> | null;\n datasourceIds: Set<string> | null;\n workbookIds: Set<string> | null;\n tags: Set<string> | null;\n};\n\nexport class Config {\n private maxResultLimit: number | null;\n private maxResultLimits: Map<ToolName, number | null> | null;\n\n auth: AuthType;\n server: string;\n transport: TransportName;\n sslKey: string;\n sslCert: string;\n httpPort: number;\n corsOriginConfig: CorsOptions['origin'];\n trustProxyConfig: boolean | number | string | null;\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 defaultLogLevel: string;\n disableLogMasking: boolean;\n includeTools: Array<ToolName>;\n excludeTools: Array<ToolName>;\n maxRequestTimeoutMs: number;\n disableQueryDatasourceValidationRequests: boolean;\n disableMetadataApiRequests: boolean;\n disableSessionManagement: boolean;\n enableServerLogging: boolean;\n serverLogDirectory: string;\n boundedContext: BoundedContext;\n tableauServerVersionCheckIntervalInHours: number;\n oauth: {\n enabled: boolean;\n issuer: string;\n redirectUri: 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 };\n telemetry: TelemetryConfig;\n\n getMaxResultLimit(toolName: ToolName): number | null {\n return this.maxResultLimits?.get(toolName) ?? this.maxResultLimit;\n }\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 TRUST_PROXY_CONFIG: trustProxyConfig,\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_LOG_LEVEL: defaultLogLevel,\n DISABLE_LOG_MASKING: disableLogMasking,\n INCLUDE_TOOLS: includeTools,\n EXCLUDE_TOOLS: excludeTools,\n MAX_REQUEST_TIMEOUT_MS: maxRequestTimeoutMs,\n MAX_RESULT_LIMIT: maxResultLimit,\n MAX_RESULT_LIMITS: maxResultLimits,\n DISABLE_QUERY_DATASOURCE_VALIDATION_REQUESTS: disableQueryDatasourceValidationRequests,\n DISABLE_METADATA_API_REQUESTS: disableMetadataApiRequests,\n DISABLE_SESSION_MANAGEMENT: disableSessionManagement,\n ENABLE_SERVER_LOGGING: enableServerLogging,\n SERVER_LOG_DIRECTORY: serverLogDirectory,\n INCLUDE_PROJECT_IDS: includeProjectIds,\n INCLUDE_DATASOURCE_IDS: includeDatasourceIds,\n INCLUDE_WORKBOOK_IDS: includeWorkbookIds,\n INCLUDE_TAGS: includeTags,\n TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS: tableauServerVersionCheckIntervalInHours,\n DANGEROUSLY_DISABLE_OAUTH: disableOauth,\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_REDIRECT_URI: redirectUri,\n OAUTH_CLIENT_ID_SECRET_PAIRS: oauthClientIdSecretPairs,\n OAUTH_CIMD_DNS_SERVERS: dnsServers,\n OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS: authzCodeTimeoutMs,\n OAUTH_ACCESS_TOKEN_TIMEOUT_MS: accessTokenTimeoutMs,\n OAUTH_REFRESH_TOKEN_TIMEOUT_MS: refreshTokenTimeoutMs,\n TELEMETRY_PROVIDER: telemetryProvider,\n TELEMETRY_PROVIDER_CONFIG: telemetryProviderConfig,\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.trustProxyConfig = getTrustProxyConfig(trustProxyConfig?.trim() ?? '');\n this.datasourceCredentials = datasourceCredentials ?? '';\n this.defaultLogLevel = defaultLogLevel ?? 'debug';\n this.disableLogMasking = disableLogMasking === 'true';\n this.disableQueryDatasourceValidationRequests =\n disableQueryDatasourceValidationRequests === 'true';\n this.disableMetadataApiRequests = disableMetadataApiRequests === 'true';\n this.disableSessionManagement = disableSessionManagement === 'true';\n this.enableServerLogging = enableServerLogging === 'true';\n this.serverLogDirectory = serverLogDirectory || join(__dirname, 'logs');\n this.boundedContext = {\n projectIds: createSetFromCommaSeparatedString(includeProjectIds),\n datasourceIds: createSetFromCommaSeparatedString(includeDatasourceIds),\n workbookIds: createSetFromCommaSeparatedString(includeWorkbookIds),\n tags: createSetFromCommaSeparatedString(includeTags),\n };\n\n if (this.boundedContext.projectIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_PROJECT_IDS must have at least one value',\n );\n }\n\n if (this.boundedContext.datasourceIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_DATASOURCE_IDS must have at least one value',\n );\n }\n\n if (this.boundedContext.workbookIds?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_WORKBOOK_IDS must have at least one value',\n );\n }\n\n if (this.boundedContext.tags?.size === 0) {\n throw new Error(\n 'When set, the environment variable INCLUDE_TAGS must have at least one value',\n );\n }\n\n this.tableauServerVersionCheckIntervalInHours = parseNumber(\n tableauServerVersionCheckIntervalInHours,\n {\n defaultValue: 1,\n minValue: 1,\n maxValue: 24 * 7, // 7 days\n },\n );\n\n const disableOauthOverride = disableOauth === 'true';\n this.oauth = {\n enabled: disableOauthOverride ? false : !!oauthIssuer,\n issuer: oauthIssuer ?? '',\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 };\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: parsedProvider,\n };\n }\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 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 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 const maxResultLimitNumber = maxResultLimit ? parseInt(maxResultLimit) : NaN;\n this.maxResultLimit =\n isNaN(maxResultLimitNumber) || maxResultLimitNumber <= 0 ? null : maxResultLimitNumber;\n\n this.maxResultLimits = maxResultLimits ? getMaxResultLimits(maxResultLimits) : null;\n\n this.includeTools = includeTools\n ? includeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n this.excludeTools = excludeTools\n ? excludeTools.split(',').flatMap((s) => {\n const v = s.trim();\n return isToolName(v) ? v : isToolGroupName(v) ? toolGroups[v] : [];\n })\n : [];\n\n if (this.includeTools.length > 0 && this.excludeTools.length > 0) {\n throw new Error('Cannot include and exclude tools simultaneously');\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\nfunction getTrustProxyConfig(trustProxyConfig: string): boolean | number | string | null {\n if (!trustProxyConfig) {\n return null;\n }\n\n if (trustProxyConfig.match(/^true|false$/i)) {\n return trustProxyConfig.toLowerCase() === 'true';\n }\n\n if (trustProxyConfig.match(/^\\d+$/)) {\n return parseInt(trustProxyConfig, 10);\n }\n\n return trustProxyConfig;\n}\n\n// Creates a set from a comma-separated string of values.\n// Returns null if the value is undefined.\nfunction createSetFromCommaSeparatedString(value: string | undefined): Set<string> | null {\n if (value === undefined) {\n return null;\n }\n\n return new Set(\n value\n .trim()\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean),\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}\".\nfunction 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\nfunction getMaxResultLimits(maxResultLimits: string): Map<ToolName, number | null> {\n const map = new Map<ToolName, number | null>();\n if (!maxResultLimits) {\n return map;\n }\n\n maxResultLimits.split(',').forEach((curr) => {\n const [toolName, maxResultLimit] = curr.split(':');\n const maxResultLimitNumber = maxResultLimit ? parseInt(maxResultLimit) : NaN;\n const actualLimit =\n isNaN(maxResultLimitNumber) || maxResultLimitNumber <= 0 ? null : maxResultLimitNumber;\n if (isToolName(toolName)) {\n map.set(toolName, actualLimit);\n } else if (isToolGroupName(toolName)) {\n toolGroups[toolName].forEach((toolName) => {\n if (!map.has(toolName)) {\n // Tool names take precedence over group names\n map.set(toolName, actualLimit);\n }\n });\n }\n });\n\n return map;\n}\n\nfunction 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\nexport const getConfig = (): Config => new Config();\n\nexport const exportedForTesting = {\n Config,\n parseNumber,\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., '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('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/**\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", "export const toolNames = [\n 'list-datasources',\n 'list-workbooks',\n 'list-views',\n 'query-datasource',\n 'get-datasource-metadata',\n 'get-workbook',\n 'get-view-data',\n 'get-view-image',\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n 'generate-pulse-insight-brief',\n 'search-content',\n] as const;\nexport type ToolName = (typeof toolNames)[number];\n\nexport const toolGroupNames = [\n 'datasource',\n 'workbook',\n 'view',\n 'pulse',\n 'content-exploration',\n] as const;\nexport type ToolGroupName = (typeof toolGroupNames)[number];\n\nexport const toolGroups = {\n datasource: ['list-datasources', 'get-datasource-metadata', 'query-datasource'],\n workbook: ['list-workbooks', 'get-workbook'],\n view: ['list-views', 'get-view-data', 'get-view-image'],\n pulse: [\n 'list-all-pulse-metric-definitions',\n 'list-pulse-metric-definitions-from-definition-ids',\n 'list-pulse-metrics-from-metric-definition-id',\n 'list-pulse-metrics-from-metric-ids',\n 'list-pulse-metric-subscriptions',\n 'generate-pulse-metric-value-insight-bundle',\n 'generate-pulse-insight-brief',\n ],\n 'content-exploration': ['search-content'],\n} as const satisfies Record<ToolGroupName, Array<ToolName>>;\n\nexport function isToolName(value: unknown): value is ToolName {\n return !!toolNames.find((name) => name === value);\n}\n\nexport function isToolGroupName(value: unknown): value is ToolGroupName {\n return !!toolGroupNames.find((name) => name === value);\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", "/**\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_dotenv", "import_path", "import_fs", "import_path", "import_zod", "telemetryAttributesSchema", "telemetryProviderSchema", "noopTelemetryConfigSchema", "providerConfigSchema", "customTelemetryConfigSchema", "telemetryConfigSchema", "isTelemetryProvider", "provider", "
|
|
3
|
+
"sources": ["../../src/telemetry/tracing.ts", "../../src/telemetry/init.ts", "../../src/config.ts", "../../src/telemetry/types.ts", "../../src/transports.ts", "../../src/utils/getDirname.ts", "../../src/utils/invariant.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 { 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 console.error('Failed to initialize telemetry provider:', error);\n console.warn('Falling back to NoOp telemetry provider');\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 { 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';\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 trustProxyConfig: boolean | number | string | null;\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 defaultLogLevel: string;\n disableLogMasking: boolean;\n maxRequestTimeoutMs: number;\n disableSessionManagement: boolean;\n enableServerLogging: boolean;\n serverLogDirectory: string;\n tableauServerVersionCheckIntervalInHours: number;\n mcpSiteSettingsCheckIntervalInMinutes: number;\n enableMcpSiteSettings: 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 productTelemetryEndpoint: string;\n productTelemetryEnabled: boolean;\n isHyperforce: 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 TRUST_PROXY_CONFIG: trustProxyConfig,\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_LOG_LEVEL: defaultLogLevel,\n DISABLE_LOG_MASKING: disableLogMasking,\n MAX_REQUEST_TIMEOUT_MS: maxRequestTimeoutMs,\n DISABLE_SESSION_MANAGEMENT: disableSessionManagement,\n ENABLE_SERVER_LOGGING: enableServerLogging,\n SERVER_LOG_DIRECTORY: serverLogDirectory,\n TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS: tableauServerVersionCheckIntervalInHours,\n MCP_SITE_SETTINGS_CHECK_INTERVAL_IN_MINUTES: mcpSiteSettingsCheckIntervalInMinutes,\n ENABLE_MCP_SITE_SETTINGS: enableMcpSiteSettings,\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 PRODUCT_TELEMETRY_ENDPOINT: productTelemetryEndpoint,\n PRODUCT_TELEMETRY_ENABLED: productTelemetryEnabled,\n IS_HYPERFORCE: isHyperforce,\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.trustProxyConfig = getTrustProxyConfig(trustProxyConfig?.trim() ?? '');\n this.datasourceCredentials = datasourceCredentials ?? '';\n this.defaultLogLevel = defaultLogLevel ?? 'debug';\n this.disableLogMasking = disableLogMasking === 'true';\n this.disableSessionManagement = disableSessionManagement === 'true';\n this.enableServerLogging = enableServerLogging === 'true';\n this.serverLogDirectory = serverLogDirectory || 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.mcpSiteSettingsCheckIntervalInMinutes = parseNumber(\n mcpSiteSettingsCheckIntervalInMinutes,\n {\n defaultValue: 10,\n minValue: 1,\n maxValue: 60 * 24, // 24 hours\n },\n );\n\n this.enableMcpSiteSettings = enableMcpSiteSettings === '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.productTelemetryEndpoint =\n productTelemetryEndpoint || 'https://prod.telemetry.tableausoftware.com';\n this.productTelemetryEnabled = productTelemetryEnabled !== 'false';\n this.isHyperforce = isHyperforce === '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\nfunction getTrustProxyConfig(trustProxyConfig: string): boolean | number | string | null {\n if (!trustProxyConfig) {\n return null;\n }\n\n if (trustProxyConfig.match(/^true|false$/i)) {\n return trustProxyConfig.toLowerCase() === 'true';\n }\n\n if (trustProxyConfig.match(/^\\d+$/)) {\n return parseInt(trustProxyConfig, 10);\n }\n\n return trustProxyConfig;\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\nfunction 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\nexport const getConfig = (): Config => new Config();\n\nexport const exportedForTesting = {\n Config,\n parseNumber,\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., '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('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/**\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", "/**\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_dotenv", "import_path", "import_fs", "import_path", "import_zod", "telemetryAttributesSchema", "telemetryProviderSchema", "noopTelemetryConfigSchema", "providerConfigSchema", "customTelemetryConfigSchema", "telemetryConfigSchema", "isTelemetryProvider", "provider", "transports", "isTransport", "transport", "getDirname", "invariant", "condition", "message", "__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", "trustProxyConfig", "patName", "patValue", "jwtSubClaim", "clientId", "secretId", "secretValue", "uatTenantId", "uatIssuer", "uatUsernameClaimName", "uatUsernameClaim", "uatPrivateKey", "uatPrivateKeyPath", "uatKeyId", "jwtAdditionalPayload", "datasourceCredentials", "defaultLogLevel", "disableLogMasking", "maxRequestTimeoutMs", "disableSessionManagement", "enableServerLogging", "serverLogDirectory", "tableauServerVersionCheckIntervalInHours", "mcpSiteSettingsCheckIntervalInMinutes", "enableMcpSiteSettings", "disableOauth", "oauthEmbeddedAuthzServer", "oauthIssuer", "oauthLockSite", "oauthJwePrivateKey", "oauthJwePrivateKeyPath", "oauthJwePrivateKeyPassphrase", "oauthResourceUri", "redirectUri", "oauthClientIdSecretPairs", "dnsServers", "advertiseApiScopes", "authzCodeTimeoutMs", "accessTokenTimeoutMs", "refreshTokenTimeoutMs", "oauthDisableScopes", "telemetryProvider", "telemetryProviderConfig", "productTelemetryEndpoint", "productTelemetryEnabled", "isHyperforce", "jwtUsername", "parseNumber", "getCorsOriginConfig", "getTrustProxyConfig", "disableOauthOverride", "enforceScopes", "embeddedAuthzServer", "ip", "acc", "curr", "secret", "isTelemetryProvider", "providerConfigSchema", "isTransport", "invariant", "validateServer", "prefix", "_", "error", "errorMessage", "origin", "envVars", "key", "value", "defaultValue", "minValue", "maxValue", "number", "getConfig", "NoOpTelemetryProvider", "_name", "_value", "_attributes", "getInstanceMethods", "cls", "name", "isRecord", "obj", "validateTelemetryProvider", "provider", "missingMethods", "NoOpTelemetryProvider", "method", "initializeTelemetry", "config", "getConfig", "provider", "loadCustomProvider", "NoOpTelemetryProvider", "error", "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
|
-
"description": "
|
|
4
|
-
"version": "1.
|
|
3
|
+
"description": "Helping agents see and understand data.",
|
|
4
|
+
"version": "1.17.8",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/tableau/tableau-mcp.git"
|
|
@@ -52,9 +52,8 @@
|
|
|
52
52
|
"docs:start": "npm run start --prefix docs"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
55
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
56
56
|
"@zodios/core": "^10.9.6",
|
|
57
|
-
"axios-retry": "^4.5.0",
|
|
58
57
|
"cors": "^2.8.5",
|
|
59
58
|
"dotenv": "^16.5.0",
|
|
60
59
|
"express": "^5.1.0",
|