@togglhq/mcp 1.12.6 → 1.13.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.
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A local MCP (Model Context Protocol) server that connects to the Toggl 2.0 API. Works with any MCP client including Claude Code and Claude Desktop.
4
4
 
5
+ The server supports MCP `2026-07-28` and keeps compatibility with legacy MCP clients. JSON tool results include `structuredContent` for modern clients and a text fallback for older clients.
6
+
5
7
  ## One-click install
6
8
 
7
9
  [![Install in VS Code](https://img.shields.io/badge/Install_in-VS_Code-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect/mcp/install?name=toggl&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40togglhq%2Fmcp%22%5D%2C%22env%22%3A%7B%7D%7D)
package/build/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as getProductAnalyticsDistinctId, c as resolvePublicSentryDsn, i as captureToolInvocation, l as shutdownProductAnalytics, n as runMcpCli, o as initProductAnalytics, r as PUBLIC_SENTRY_PRIVACY_OPTIONS, s as resolveProductAnalyticsDistinctId } from "./src-DYYXLriL.js";
2
+ import { a as PUBLIC_SENTRY_PRIVACY_OPTIONS, c as initProductAnalytics, d as shutdownProductAnalytics, i as runMcpCli, l as resolveProductAnalyticsDistinctId, o as captureToolInvocation, s as getProductAnalyticsDistinctId, u as resolvePublicSentryDsn } from "./src-Wi0RVSpx.js";
3
3
  import * as Sentry from "@sentry/node";
4
4
  //#region src/analytics-tool-metadata.ts
5
5
  /**
@@ -162,7 +162,7 @@ function wrapServerWithProductAnalytics(server) {
162
162
  }
163
163
  //#endregion
164
164
  //#region src/cli.ts
165
- const packageVersion = "1.12.6";
165
+ const packageVersion = "1.13.0";
166
166
  let sentryEnabled = false;
167
167
  let productAnalyticsEnabled = false;
168
168
  runMcpCli({
package/build/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- //#region ../../node_modules/.pnpm/@modelcontextprotocol+server@2.0.0/node_modules/@modelcontextprotocol/server/dist/types-DUs7mGBv.d.mts
1
+ //#region ../../node_modules/.pnpm/@modelcontextprotocol+server@2.3.0/node_modules/@modelcontextprotocol/server/dist/types-DUs7mGBv.d.mts
2
2
  //#region ../../node_modules/.pnpm/json-schema-typed@8.0.2/node_modules/json-schema-typed/draft_2020_12.d.ts
3
3
  type MaybeReadonlyArray<T> = Array<T> | ReadonlyArray<T>;
4
4
  type ValueOf<T> = T[keyof T];
@@ -3195,7 +3195,7 @@ interface ZodISODateTime extends ZodStringFormat {
3195
3195
  }
3196
3196
  declare const ZodISODateTime: $constructor<ZodISODateTime>;
3197
3197
  //#endregion
3198
- //#region ../../node_modules/.pnpm/@modelcontextprotocol+core@2.0.0/node_modules/@modelcontextprotocol/core/dist/auth-BWdKR39I.d.mts
3198
+ //#region ../../node_modules/.pnpm/@modelcontextprotocol+core@2.3.0/node_modules/@modelcontextprotocol/core/dist/auth-Anm-lwWi.d.mts
3199
3199
  //#region src/types.d.ts
3200
3200
  type JSONValue = string | number | boolean | null | JSONObject | JSONArray;
3201
3201
  type JSONObject = {
@@ -3261,6 +3261,24 @@ declare const NotificationSchema: ZodObject<{
3261
3261
  * and intended for display, logging, and debugging). The getter defers the
3262
3262
  * `ImplementationSchema` reference, which is declared later in this file.
3263
3263
  */
3264
+ declare const ResultMetaObjectSchema: ZodObject<{
3265
+ readonly "io.modelcontextprotocol/serverInfo": ZodCatch<ZodOptional<ZodObject<{
3266
+ version: ZodString;
3267
+ websiteUrl: ZodOptional<ZodString>;
3268
+ description: ZodOptional<ZodString>;
3269
+ icons: ZodOptional<ZodArray<ZodObject<{
3270
+ src: ZodString;
3271
+ mimeType: ZodOptional<ZodString>;
3272
+ sizes: ZodOptional<ZodArray<ZodString>>;
3273
+ theme: ZodOptional<ZodEnum<{
3274
+ light: "light";
3275
+ dark: "dark";
3276
+ }>>;
3277
+ }, $strip>>>;
3278
+ name: ZodString;
3279
+ title: ZodOptional<ZodString>;
3280
+ }, $strip>>>;
3281
+ }, $loose>;
3264
3282
  declare const ResultSchema: ZodObject<{
3265
3283
  /**
3266
3284
  * See [MCP specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/index#general-fields)
@@ -7027,7 +7045,7 @@ declare const ServerNotificationSchema: ZodUnion<readonly [ZodObject<{
7027
7045
  }, $strip>;
7028
7046
  }, $strip>]>;
7029
7047
  //#endregion
7030
- //#region ../../node_modules/.pnpm/@modelcontextprotocol+server@2.0.0/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CLhGwQTn.d.mts
7048
+ //#region ../../node_modules/.pnpm/@modelcontextprotocol+server@2.3.0/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-D4NN8WsG.d.mts
7031
7049
  //#endregion
7032
7050
  //#region ../core-internal/src/errors/sdkErrors.d.ts
7033
7051
  /**
@@ -7153,7 +7171,17 @@ declare class SdkError extends Error {
7153
7171
  * silently matching nothing).
7154
7172
  */
7155
7173
  static isInstance<T$1 extends abstract new (...args: never[]) => unknown>(this: T$1, value: unknown): value is InstanceType<T$1>;
7156
- constructor(code: SdkErrorCode, message: string, data?: unknown | undefined);
7174
+ /**
7175
+ * @param code - Stable string code identifying the failure ({@linkcode SdkErrorCode}).
7176
+ * @param message - Human-readable description.
7177
+ * @param data - Optional structured payload (for example the HTTP status carried by
7178
+ * {@linkcode SdkHttpError}). Opaque to the SDK: a `cause` key inside `data` is not
7179
+ * promoted to `Error.cause`.
7180
+ * @param options - Standard `ErrorOptions`, forwarded to `Error`. Pass the underlying
7181
+ * failure as `{ cause }` so it is reachable through the `Error.cause` chain that
7182
+ * loggers and error trackers walk.
7183
+ */
7184
+ constructor(code: SdkErrorCode, message: string, data?: unknown | undefined, options?: ErrorOptions);
7157
7185
  }
7158
7186
  /**
7159
7187
  * Typed shape for HTTP error data carried by {@linkcode SdkHttpError}.
@@ -7446,6 +7474,18 @@ interface AuthInfo {
7446
7474
  * If set, this MUST match the MCP server's resource identifier (minus hash fragment).
7447
7475
  */
7448
7476
  resource?: URL;
7477
+ /**
7478
+ * URL of the RFC 9728 Protected Resource Metadata document for the
7479
+ * resource server that accepted this token.
7480
+ *
7481
+ * The bearer-auth helpers stamp their configured `resourceMetadataUrl`
7482
+ * here when verification succeeds, so challenge responses built after
7483
+ * authentication (for example per-operation `insufficient_scope` scope
7484
+ * challenges) can advertise the same document as the authentication
7485
+ * gate's own challenges without separate configuration. Verifiers may
7486
+ * also populate it directly; a verifier-set value wins.
7487
+ */
7488
+ resourceMetadataUrl?: string;
7449
7489
  /**
7450
7490
  * Additional data associated with the token.
7451
7491
  * This field should be used for any additional data that needs to be attached to the auth info.
@@ -7504,6 +7544,11 @@ interface MessageExtraInfo {
7504
7544
  */
7505
7545
  closeStandaloneSSEStream?: () => void;
7506
7546
  }
7547
+ /**
7548
+ * The contents of a result's `_meta` field (the 2026-07-28 `ResultMetaObject`):
7549
+ * loose, with the optional self-reported serverInfo key typed when present.
7550
+ */
7551
+ type ResultMetaObject = Infer<typeof ResultMetaObjectSchema>;
7507
7552
  /**
7508
7553
  * {@linkcode CreateMessageRequestParams} without tools - for backwards-compatible overload.
7509
7554
  * Excludes tools/toolChoice to indicate they should not be provided.
@@ -7599,7 +7644,8 @@ type DecodedResult = {
7599
7644
  * discriminated payload to it.
7600
7645
  */
7601
7646
  inputRequests: Record<string, unknown>;
7602
- requestState?: string;
7647
+ requestState?: string; /** Result-level `_meta`, carried through so a manual caller sees it. */
7648
+ _meta?: ResultMetaObject;
7603
7649
  } | {
7604
7650
  kind: 'invalid';
7605
7651
  error: SdkError;
@@ -8236,6 +8282,8 @@ declare abstract class Protocol<ContextT extends BaseContext> {
8236
8282
  private _transport?;
8237
8283
  private _requestMessageId;
8238
8284
  private _requestHandlers;
8285
+ /** Methods registered with an explicit schema; the era gate in `_onrequest` reads it for the Tasks extension names. */
8286
+ private _customSchemaRequestMethods;
8239
8287
  private _requestHandlerAbortControllers;
8240
8288
  private _notificationHandlers;
8241
8289
  private _responseHandlers;
@@ -8634,6 +8682,25 @@ declare class UriTemplate {
8634
8682
  * `StreamableHTTPClientTransport` against a local server URL.
8635
8683
  */
8636
8684
  //#endregion
8685
+ //#region src/server/scopeChallenge.d.ts
8686
+ /** OAuth scopes to request before handling an MCP request. */
8687
+ interface ScopeChallenge {
8688
+ /** The exact, complete scope set to include in the challenge. Each scope must satisfy the OAuth `scope-token` grammar. */
8689
+ scopes: readonly [string, ...string[]];
8690
+ /** Optional human-readable detail satisfying the RFC 6750 `error-description` grammar. */
8691
+ errorDescription?: string;
8692
+ }
8693
+ /** Determines whether an MCP request needs an OAuth scope challenge. */
8694
+ type ScopeChallengeHandler = (context: {
8695
+ request: JSONRPCRequest;
8696
+ authInfo?: AuthInfo;
8697
+ }) => ScopeChallenge | undefined | Promise<ScopeChallenge | undefined>;
8698
+ /**
8699
+ * Creates a handler that requires every supplied scope exactly.
8700
+ *
8701
+ * Requests without authentication are left to the server's authentication gate.
8702
+ */
8703
+ //#endregion
8637
8704
  //#region src/server/server.d.ts
8638
8705
  type ServerOptions = ProtocolOptions & {
8639
8706
  /**
@@ -8775,6 +8842,8 @@ declare class Server extends Protocol<ServerContext> {
8775
8842
  * Initializes this server with the given name and version information.
8776
8843
  */
8777
8844
  constructor(_serverInfo: Implementation, options?: ServerOptions);
8845
+ /** Attaches to the given transport; rejects while this instance is connected to another one. */
8846
+ connect(transport: Transport): Promise<void>;
8778
8847
  /**
8779
8848
  * Registers the built-in `logging/setLevel` request handler.
8780
8849
  *
@@ -9032,6 +9101,16 @@ declare class Server extends Protocol<ServerContext> {
9032
9101
  sendPromptListChanged(): Promise<void>;
9033
9102
  } //#endregion
9034
9103
  //#region src/server/mcp.d.ts
9104
+ /**
9105
+ * Options for {@linkcode McpServer}: everything {@linkcode ServerOptions} accepts, plus `maxToolInputElements`.
9106
+ */
9107
+ type McpServerOptions = ServerOptions & {
9108
+ /**
9109
+ * Largest combined number of array elements and object members a single `tools/call` `arguments` payload may contain.
9110
+ * A number of at least 1; unset or `Infinity` means no limit.
9111
+ */
9112
+ maxToolInputElements?: number;
9113
+ };
9035
9114
  /**
9036
9115
  * High-level MCP server that provides a simpler API for working with resources, tools, and prompts.
9037
9116
  * For advanced usage (like sending notifications or setting custom request handlers), use the underlying
@@ -9050,16 +9129,12 @@ declare class McpServer {
9050
9129
  * The underlying {@linkcode Server} instance, useful for advanced operations like sending notifications.
9051
9130
  */
9052
9131
  readonly server: Server;
9132
+ private readonly _maxToolInputElements;
9053
9133
  private _registeredResources;
9054
9134
  private _registeredResourceTemplates;
9055
9135
  private _registeredTools;
9056
9136
  private _registeredPrompts;
9057
- /**
9058
- * Per-tool JSON-converted `inputSchema`, memoized so the SEP-2243
9059
- * registration-time scan and the pre-dispatch validation step share one
9060
- * conversion instead of paying it twice per request under the
9061
- * per-request-factory `createMcpHandler` model.
9062
- */
9137
+ /** Per-tool JSON-converted `inputSchema`, filled on first use by `toolInputSchemaJson()`. */
9063
9138
  private _toolInputSchemaJson;
9064
9139
  /**
9065
9140
  * The JSON-serialized `inputSchema` of a registered tool, or `undefined`
@@ -9070,7 +9145,7 @@ declare class McpServer {
9070
9145
  * @internal
9071
9146
  */
9072
9147
  toolInputSchemaJson(name: string): Record<string, unknown> | undefined;
9073
- constructor(serverInfo: Implementation, options?: ServerOptions);
9148
+ constructor(serverInfo: Implementation, options?: McpServerOptions);
9074
9149
  /**
9075
9150
  * Attaches to the given transport, starts it, and starts listening for messages.
9076
9151
  *
@@ -9088,6 +9163,8 @@ declare class McpServer {
9088
9163
  * Closes the connection.
9089
9164
  */
9090
9165
  close(): Promise<void>;
9166
+ /** @internal */
9167
+ resolveScopeChallenge: ScopeChallengeHandler;
9091
9168
  private _toolHandlersInitialized;
9092
9169
  private setToolRequestHandlers;
9093
9170
  /**
@@ -9138,9 +9215,11 @@ declare class McpServer {
9138
9215
  */
9139
9216
  registerResource(name: string, uriOrTemplate: string, config: ResourceMetadata & {
9140
9217
  cacheHint?: CacheHint;
9218
+ scopeChallenge?: ScopeChallengeHandler;
9141
9219
  }, readCallback: ReadResourceCallback): RegisteredResource;
9142
9220
  registerResource(name: string, uriOrTemplate: ResourceTemplate, config: ResourceMetadata & {
9143
9221
  cacheHint?: CacheHint;
9222
+ scopeChallenge?: ScopeChallengeHandler;
9144
9223
  }, readCallback: ReadResourceTemplateCallback): RegisteredResourceTemplate;
9145
9224
  private _createRegisteredResource;
9146
9225
  private _createRegisteredResourceTemplate;
@@ -9178,7 +9257,8 @@ declare class McpServer {
9178
9257
  inputSchema?: InputArgs;
9179
9258
  outputSchema?: OutputArgs;
9180
9259
  annotations?: ToolAnnotations;
9181
- icons?: Icon[];
9260
+ icons?: Icon[]; /** Determines whether this tool call needs an OAuth scope challenge. */
9261
+ scopeChallenge?: ScopeChallengeHandler;
9182
9262
  _meta?: Record<string, unknown>;
9183
9263
  }, cb: ToolCallback<InputArgs>): RegisteredTool;
9184
9264
  /** @deprecated Wrap with `z.object({...})` instead. Raw-shape form: `inputSchema`/`outputSchema` may be a plain `{ field: z.string() }` record; it is auto-wrapped with `z.object()`. */
@@ -9189,6 +9269,7 @@ declare class McpServer {
9189
9269
  outputSchema?: OutputArgs;
9190
9270
  annotations?: ToolAnnotations;
9191
9271
  icons?: Icon[];
9272
+ scopeChallenge?: ScopeChallengeHandler;
9192
9273
  _meta?: Record<string, unknown>;
9193
9274
  }, cb: LegacyToolCallback<InputArgs>): RegisteredTool;
9194
9275
  /**
@@ -9217,11 +9298,20 @@ declare class McpServer {
9217
9298
  * );
9218
9299
  * ```
9219
9300
  */
9301
+ registerPrompt(name: string, config: {
9302
+ title?: string;
9303
+ description?: string;
9304
+ argsSchema?: undefined;
9305
+ icons?: Icon[]; /** Determines whether this prompt retrieval needs an OAuth scope challenge. */
9306
+ scopeChallenge?: ScopeChallengeHandler;
9307
+ _meta?: Record<string, unknown>;
9308
+ }, cb: PromptCallback): RegisteredPrompt;
9220
9309
  registerPrompt<Args extends StandardSchemaWithJSON>(name: string, config: {
9221
9310
  title?: string;
9222
9311
  description?: string;
9223
9312
  argsSchema?: Args;
9224
- icons?: Icon[];
9313
+ icons?: Icon[]; /** Determines whether this prompt retrieval needs an OAuth scope challenge. */
9314
+ scopeChallenge?: ScopeChallengeHandler;
9225
9315
  _meta?: Record<string, unknown>;
9226
9316
  }, cb: PromptCallback<Args>): RegisteredPrompt;
9227
9317
  /** @deprecated Wrap with `z.object({...})` instead. Raw-shape form: `argsSchema` may be a plain `{ field: z.string() }` record; it is auto-wrapped with `z.object()`. */
@@ -9230,6 +9320,7 @@ declare class McpServer {
9230
9320
  description?: string;
9231
9321
  argsSchema?: Args;
9232
9322
  icons?: Icon[];
9323
+ scopeChallenge?: ScopeChallengeHandler;
9233
9324
  _meta?: Record<string, unknown>;
9234
9325
  }, cb: LegacyPromptCallback<Args>): RegisteredPrompt;
9235
9326
  /**
@@ -9340,7 +9431,7 @@ type RegisteredTool = {
9340
9431
  outputSchema?: StandardSchemaWithJSON;
9341
9432
  /**
9342
9433
  * @hidden
9343
- * The converted JSON Schema of `outputSchema`, memoised at registration (and on
9434
+ * The converted JSON Schema of `outputSchema`, memoised on first use (and on
9344
9435
  * `update({outputSchema})`) so the `tools/call` handler passes the SAME advertised schema
9345
9436
  * `tools/list` emits to the wire codec's `projectCallToolResult` — the SEP-2106 `{result:…}`
9346
9437
  * wrap predicate follows the schema's root, never the runtime value shape. `undefined` when
@@ -9350,6 +9441,7 @@ type RegisteredTool = {
9350
9441
  annotations?: ToolAnnotations;
9351
9442
  icons?: Icon[];
9352
9443
  execution?: ToolExecution;
9444
+ scopeChallenge?: ScopeChallengeHandler;
9353
9445
  _meta?: Record<string, unknown>;
9354
9446
  handler: AnyToolHandler<StandardSchemaWithJSON | undefined>; /** @hidden */
9355
9447
  executor: ToolExecutor;
@@ -9364,6 +9456,7 @@ type RegisteredTool = {
9364
9456
  outputSchema?: StandardSchemaWithJSON;
9365
9457
  annotations?: ToolAnnotations;
9366
9458
  icons?: Icon[];
9459
+ scopeChallenge?: ScopeChallengeHandler | null;
9367
9460
  _meta?: Record<string, unknown>;
9368
9461
  callback?: ToolCallback<StandardSchemaWithJSON>;
9369
9462
  enabled?: boolean;
@@ -9387,6 +9480,7 @@ type RegisteredResource = {
9387
9480
  title?: string;
9388
9481
  metadata?: ResourceMetadata; /** Cache hint applied to this resource's `resources/read` results on the 2026-07-28 revision. */
9389
9482
  cacheHint?: CacheHint;
9483
+ scopeChallenge?: ScopeChallengeHandler;
9390
9484
  readCallback: ReadResourceCallback;
9391
9485
  enabled: boolean;
9392
9486
  enable(): void;
@@ -9396,6 +9490,7 @@ type RegisteredResource = {
9396
9490
  title?: string;
9397
9491
  uri?: string | null;
9398
9492
  metadata?: ResourceMetadata;
9493
+ scopeChallenge?: ScopeChallengeHandler | null;
9399
9494
  callback?: ReadResourceCallback;
9400
9495
  enabled?: boolean;
9401
9496
  }): void;
@@ -9410,6 +9505,7 @@ type RegisteredResourceTemplate = {
9410
9505
  title?: string;
9411
9506
  metadata?: ResourceMetadata; /** Cache hint applied to this template's `resources/read` results on the 2026-07-28 revision. */
9412
9507
  cacheHint?: CacheHint;
9508
+ scopeChallenge?: ScopeChallengeHandler;
9413
9509
  readCallback: ReadResourceTemplateCallback;
9414
9510
  enabled: boolean;
9415
9511
  enable(): void;
@@ -9419,6 +9515,7 @@ type RegisteredResourceTemplate = {
9419
9515
  title?: string;
9420
9516
  template?: ResourceTemplate;
9421
9517
  metadata?: ResourceMetadata;
9518
+ scopeChallenge?: ScopeChallengeHandler | null;
9422
9519
  callback?: ReadResourceTemplateCallback;
9423
9520
  enabled?: boolean;
9424
9521
  }): void;
@@ -9435,6 +9532,7 @@ type RegisteredPrompt = {
9435
9532
  description?: string;
9436
9533
  argsSchema?: StandardSchemaWithJSON;
9437
9534
  icons?: Icon[];
9535
+ scopeChallenge?: ScopeChallengeHandler;
9438
9536
  _meta?: Record<string, unknown>; /** @hidden */
9439
9537
  handler: PromptHandler;
9440
9538
  enabled: boolean;
@@ -9446,6 +9544,7 @@ type RegisteredPrompt = {
9446
9544
  description?: string;
9447
9545
  argsSchema?: Args;
9448
9546
  icons?: Icon[];
9547
+ scopeChallenge?: ScopeChallengeHandler | null;
9449
9548
  _meta?: Record<string, unknown>;
9450
9549
  callback?: PromptCallback<Args>;
9451
9550
  enabled?: boolean;
@@ -9468,6 +9567,8 @@ type RegisteredPrompt = {
9468
9567
  */
9469
9568
  //#endregion
9470
9569
  //#region src/index.d.ts
9570
+ declare const MCP_CACHE_TTL_MS: number;
9571
+ declare const MCP_MAX_TOOL_INPUT_ELEMENTS = 10000;
9471
9572
  interface McpBootstrapUrls {
9472
9573
  focusApiUrl: string;
9473
9574
  accountsApiUrl: string;
@@ -9481,5 +9582,5 @@ interface McpBootstrapOptions {
9481
9582
  declare function runMcpCli(options?: McpBootstrapOptions): void;
9482
9583
  declare function bootstrapServer(options?: McpBootstrapOptions): void;
9483
9584
  //#endregion
9484
- export { McpBootstrapOptions, McpBootstrapUrls, bootstrapServer, runMcpCli };
9585
+ export { MCP_CACHE_TTL_MS, MCP_MAX_TOOL_INPUT_ELEMENTS, McpBootstrapOptions, McpBootstrapUrls, bootstrapServer, runMcpCli };
9485
9586
  //# sourceMappingURL=index.d.ts.map
package/build/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import { n as runMcpCli, t as bootstrapServer } from "./src-DYYXLriL.js";
3
- export { bootstrapServer, runMcpCli };
2
+ import { i as runMcpCli, n as MCP_MAX_TOOL_INPUT_ELEMENTS, r as bootstrapServer, t as MCP_CACHE_TTL_MS } from "./src-Wi0RVSpx.js";
3
+ export { MCP_CACHE_TTL_MS, MCP_MAX_TOOL_INPUT_ELEMENTS, bootstrapServer, runMcpCli };