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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/mcp-client-header.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@transloadit/node": patch
"@transloadit/mcp-server": patch
---

Allow overriding the Transloadit-Client header and set MCP server requests to its own client name.
7 changes: 7 additions & 0 deletions packages/mcp-server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export type TransloaditMcpServerOptions = {
endpoint?: string
serverName?: string
serverVersion?: string
clientName?: string
}

type LintIssueOutput = {
Expand Down Expand Up @@ -278,11 +279,15 @@ const buildToolError = (
],
})

const getClientName = (options: TransloaditMcpServerOptions): string =>
options.clientName ?? `mcp-server:${packageJson.version}`

const createLintClient = (options: TransloaditMcpServerOptions): Transloadit =>
new Transloadit({
authKey: options.authKey ?? 'mcp',
authSecret: options.authSecret ?? 'mcp',
endpoint: options.endpoint,
clientName: getClientName(options),
})

const getHeaderValue = (headers: HeaderMap | undefined, name: string): string | undefined => {
Expand Down Expand Up @@ -315,6 +320,7 @@ const createLiveClient = (
authKey: options.authKey,
authSecret: options.authSecret,
endpoint: options.endpoint,
clientName: getClientName(options),
}),
}
}
Expand All @@ -333,6 +339,7 @@ const createLiveClient = (
authKey: options.authKey,
authSecret: options.authSecret,
endpoint: options.endpoint,
clientName: getClientName(options),
}),
}
}
Expand Down
6 changes: 5 additions & 1 deletion packages/node/src/Transloadit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ type BaseOptions = {
timeout?: number
gotRetry?: Partial<RetryOptions>
validateResponses?: boolean
clientName?: string
}

export type Options = BaseOptions & (AuthKeySecret | AuthToken)
Expand All @@ -341,6 +342,8 @@ export class Transloadit {

private _gotRetry: Partial<RetryOptions>

private _clientName: string

private _lastUsedAssemblyUrl = ''

private _validateResponses = false
Expand Down Expand Up @@ -369,6 +372,7 @@ export class Transloadit {
this._endpoint = opts.endpoint || 'https://api2.transloadit.com'
this._maxRetries = opts.maxRetries != null ? opts.maxRetries : 5
this._defaultTimeout = opts.timeout != null ? opts.timeout : 60000
this._clientName = opts.clientName?.trim() || `node-sdk:${version}`

// Passed on to got https://github.com/sindresorhus/got/blob/main/documentation/7-retry.md
this._gotRetry = opts.gotRetry != null ? opts.gotRetry : { limit: 0 }
Expand Down Expand Up @@ -1258,7 +1262,7 @@ export class Transloadit {
body: form,
timeout,
headers: {
'Transloadit-Client': `node-sdk:${version}`,
'Transloadit-Client': this._clientName,
'User-Agent': undefined, // Remove got's user-agent
...(this._authToken ? { Authorization: `Bearer ${this._authToken}` } : {}),
...headers,
Expand Down
19 changes: 19 additions & 0 deletions packages/node/test/unit/test-transloadit-client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,25 @@ describe('Transloadit', () => {
expect.objectContaining({ headers: { 'Transloadit-Client': `node-sdk:${version}` } }),
)
})

it('should allow overriding the "Transloadit-Client" header', async () => {
const client = new Transloadit({
authKey: 'foo_key',
authSecret: 'foo_secret',
clientName: 'mcp-server:1.2.3',
})

const get = mockGot('get')

const url = '/some-url'
// @ts-expect-error This tests private internals
await client._remoteJson({ url, method: 'get', isTrustedUrl: true })

expect(get).toHaveBeenCalledWith(
expect.any(String),
expect.objectContaining({ headers: { 'Transloadit-Client': 'mcp-server:1.2.3' } }),
)
})
})

describe('getSignedSmartCDNUrl', () => {
Expand Down
Loading