SpyBara
Go Premium Account
2026
31 Oct 2025, 00:04
12 May 2026, 16:02 12 May 2026, 14:59 12 May 2026, 01:59 12 May 2026, 00:01 11 May 2026, 23:00 11 May 2026, 21:57 11 May 2026, 20:02 11 May 2026, 18:59 11 May 2026, 18:00 11 May 2026, 15:00 10 May 2026, 23:03 10 May 2026, 17:00 10 May 2026, 04:02 9 May 2026, 04:57 9 May 2026, 04:01 9 May 2026, 03:01 8 May 2026, 22:00 8 May 2026, 19:00 8 May 2026, 18:00 8 May 2026, 16:57 8 May 2026, 07:02 8 May 2026, 06:02 8 May 2026, 03:01 8 May 2026, 02:03 8 May 2026, 01:02 8 May 2026, 00:02 7 May 2026, 22:59 7 May 2026, 21:57 7 May 2026, 17:08 5 May 2026, 23:00 5 May 2026, 21:00 5 May 2026, 17:00 5 May 2026, 15:59 5 May 2026, 14:57 5 May 2026, 00:02 4 May 2026, 22:58 4 May 2026, 22:01 4 May 2026, 18:58 4 May 2026, 15:35 4 May 2026, 06:55 4 May 2026, 04:18 2 May 2026, 18:14 2 May 2026, 04:05 2 May 2026, 00:19 1 May 2026, 18:19 1 May 2026, 04:22 1 May 2026, 00:20 29 Apr 2026, 21:21 29 Apr 2026, 15:36 29 Apr 2026, 09:39 29 Apr 2026, 04:11 29 Apr 2026, 00:20 28 Apr 2026, 21:21 28 Apr 2026, 18:28 28 Apr 2026, 15:45 28 Apr 2026, 06:49 27 Apr 2026, 21:20 27 Apr 2026, 18:23 26 Apr 2026, 04:08 25 Apr 2026, 21:10 24 Apr 2026, 18:11 24 Apr 2026, 06:34 24 Apr 2026, 00:17 23 Apr 2026, 18:19 23 Apr 2026, 04:04 23 Apr 2026, 00:17 22 Apr 2026, 21:15 22 Apr 2026, 04:00 22 Apr 2026, 00:13 21 Apr 2026, 21:14 21 Apr 2026, 09:30 21 Apr 2026, 04:01 20 Apr 2026, 21:14 20 Apr 2026, 18:16 18 Apr 2026, 18:09 18 Apr 2026, 00:13 17 Apr 2026, 21:13 17 Apr 2026, 18:14 17 Apr 2026, 00:15 16 Apr 2026, 21:13 16 Apr 2026, 18:21 16 Apr 2026, 15:30 16 Apr 2026, 04:02 16 Apr 2026, 00:16 15 Apr 2026, 18:20 15 Apr 2026, 15:24 15 Apr 2026, 09:29 15 Apr 2026, 04:00 14 Apr 2026, 21:14 14 Apr 2026, 18:21 14 Apr 2026, 06:32 14 Apr 2026, 04:00 14 Apr 2026, 00:16 13 Apr 2026, 21:14 13 Apr 2026, 18:21 11 Apr 2026, 00:11 10 Apr 2026, 21:09 10 Apr 2026, 18:13 10 Apr 2026, 06:32 10 Apr 2026, 00:12 9 Apr 2026, 21:14 9 Apr 2026, 18:17 9 Apr 2026, 15:29 9 Apr 2026, 03:55 9 Apr 2026, 00:09 8 Apr 2026, 21:13 8 Apr 2026, 18:21 8 Apr 2026, 15:27 8 Apr 2026, 00:12 7 Apr 2026, 21:14 4 Apr 2026, 18:05 4 Apr 2026, 03:46 4 Apr 2026, 00:09 3 Apr 2026, 21:07 3 Apr 2026, 18:08 3 Apr 2026, 03:54 3 Apr 2026, 00:11 2 Apr 2026, 21:08 2 Apr 2026, 18:12 2 Apr 2026, 09:19 2 Apr 2026, 06:21 2 Apr 2026, 03:53 1 Apr 2026, 21:12 1 Apr 2026, 18:13 1 Apr 2026, 04:00 1 Apr 2026, 00:11 31 Mar 2026, 21:09 31 Mar 2026, 06:24 31 Mar 2026, 03:56 31 Mar 2026, 00:11 30 Mar 2026, 21:13 30 Mar 2026, 18:15 28 Mar 2026, 18:04 28 Mar 2026, 15:06 27 Mar 2026, 21:09 27 Mar 2026, 18:14 27 Mar 2026, 15:15 27 Mar 2026, 06:21 27 Mar 2026, 03:56 27 Mar 2026, 00:10 26 Mar 2026, 21:07 26 Mar 2026, 18:16 26 Mar 2026, 15:25 26 Mar 2026, 06:21 26 Mar 2026, 03:55 26 Mar 2026, 00:10 25 Mar 2026, 21:08 25 Mar 2026, 18:15 25 Mar 2026, 06:18 25 Mar 2026, 03:47 25 Mar 2026, 00:08 24 Mar 2026, 18:15 24 Mar 2026, 00:07 23 Mar 2026, 21:08 23 Mar 2026, 18:13 23 Mar 2026, 00:09 22 Mar 2026, 18:04 22 Mar 2026, 00:07 21 Mar 2026, 18:03 21 Mar 2026, 00:07 20 Mar 2026, 21:05 20 Mar 2026, 18:08 20 Mar 2026, 15:13 20 Mar 2026, 03:45 20 Mar 2026, 00:08 19 Mar 2026, 06:17 19 Mar 2026, 00:08 18 Mar 2026, 18:16 18 Mar 2026, 12:11 18 Mar 2026, 09:15 18 Mar 2026, 03:50 18 Mar 2026, 00:09 17 Mar 2026, 21:10 17 Mar 2026, 18:15 17 Mar 2026, 03:46 17 Mar 2026, 00:08 16 Mar 2026, 21:10 16 Mar 2026, 18:15 14 Mar 2026, 03:44 14 Mar 2026, 00:08 13 Mar 2026, 21:07 13 Mar 2026, 18:07 13 Mar 2026, 06:12 12 Mar 2026, 21:07 12 Mar 2026, 18:12 12 Mar 2026, 00:07 11 Mar 2026, 03:43 11 Mar 2026, 00:05 10 Mar 2026, 03:43 10 Mar 2026, 00:05 9 Mar 2026, 21:06 7 Mar 2026, 03:37 7 Mar 2026, 00:07 6 Mar 2026, 06:10 6 Mar 2026, 03:44 6 Mar 2026, 00:12 5 Mar 2026, 06:12 5 Mar 2026, 03:45 5 Mar 2026, 00:07 4 Mar 2026, 21:06 4 Mar 2026, 18:09 4 Mar 2026, 09:09 1 Mar 2026, 06:10 1 Mar 2026, 03:49 28 Feb 2026, 21:01 28 Feb 2026, 00:05 27 Feb 2026, 21:05 27 Feb 2026, 18:07 27 Feb 2026, 09:11 27 Feb 2026, 06:13 27 Feb 2026, 00:08 26 Feb 2026, 21:08 26 Feb 2026, 18:12 26 Feb 2026, 09:14 26 Feb 2026, 06:17 26 Feb 2026, 00:07 25 Feb 2026, 03:47 25 Feb 2026, 00:09 24 Feb 2026, 21:08 24 Feb 2026, 18:15 23 Feb 2026, 21:13 21 Feb 2026, 18:03 21 Feb 2026, 06:08 20 Feb 2026, 21:03 20 Feb 2026, 06:14 20 Feb 2026, 00:07 19 Feb 2026, 21:06 19 Feb 2026, 03:48 19 Feb 2026, 00:08 18 Feb 2026, 03:48 17 Feb 2026, 21:08 17 Feb 2026, 00:08 16 Feb 2026, 21:05 14 Feb 2026, 03:44 13 Feb 2026, 21:09 12 Feb 2026, 00:06 11 Feb 2026, 21:10 11 Feb 2026, 00:11 10 Feb 2026, 21:13 10 Feb 2026, 03:56 10 Feb 2026, 00:11 9 Feb 2026, 15:17 9 Feb 2026, 00:08 7 Feb 2026, 21:05 7 Feb 2026, 18:03 7 Feb 2026, 03:43 6 Feb 2026, 21:06 6 Feb 2026, 00:05 5 Feb 2026, 21:06 5 Feb 2026, 18:13 5 Feb 2026, 03:46 5 Feb 2026, 00:07 4 Feb 2026, 21:07 4 Feb 2026, 18:11 4 Feb 2026, 03:45 4 Feb 2026, 00:06 3 Feb 2026, 21:08 3 Feb 2026, 18:14 3 Feb 2026, 09:10 3 Feb 2026, 03:46 1 Feb 2026, 21:03 1 Feb 2026, 18:02 31 Jan 2026, 03:42 31 Jan 2026, 00:06 30 Jan 2026, 18:07 30 Jan 2026, 00:06 29 Jan 2026, 21:03 28 Jan 2026, 15:06 28 Jan 2026, 03:30 28 Jan 2026, 00:05 27 Jan 2026, 21:01 27 Jan 2026, 18:03 27 Jan 2026, 06:02 26 Jan 2026, 21:03 25 Jan 2026, 03:34 24 Jan 2026, 03:29 23 Jan 2026, 21:01 23 Jan 2026, 18:02 23 Jan 2026, 00:05 22 Jan 2026, 21:03 22 Jan 2026, 15:05 22 Jan 2026, 03:31 22 Jan 2026, 00:05 21 Jan 2026, 21:05 21 Jan 2026, 06:02 21 Jan 2026, 03:30 21 Jan 2026, 00:05 20 Jan 2026, 21:03 20 Jan 2026, 18:03 20 Jan 2026, 15:05 20 Jan 2026, 03:30 19 Jan 2026, 21:01 19 Jan 2026, 00:05 16 Jan 2026, 21:01 16 Jan 2026, 18:02 16 Jan 2026, 15:02 16 Jan 2026, 00:05 14 Jan 2026, 06:02 14 Jan 2026, 00:05 12 Jan 2026, 21:02 12 Jan 2026, 18:02 12 Jan 2026, 00:05 11 Jan 2026, 18:02 11 Jan 2026, 03:31 11 Jan 2026, 00:06 10 Jan 2026, 21:01 10 Jan 2026, 03:29 10 Jan 2026, 00:04 9 Jan 2026, 21:01 9 Jan 2026, 00:04 8 Jan 2026, 21:02 8 Jan 2026, 06:02 8 Jan 2026, 03:29 8 Jan 2026, 00:05 7 Jan 2026, 21:01 7 Jan 2026, 18:02 7 Jan 2026, 09:05 7 Jan 2026, 06:02 7 Jan 2026, 03:30 7 Jan 2026, 00:04 6 Jan 2026, 21:01 6 Jan 2026, 03:29 6 Jan 2026, 00:05 3 Jan 2026, 18:02 27 Dec 2025, 06:02 27 Dec 2025, 03:28 23 Dec 2025, 18:02 20 Dec 2025, 00:04 19 Dec 2025, 21:01 19 Dec 2025, 18:02 19 Dec 2025, 00:05 18 Dec 2025, 21:01 18 Dec 2025, 18:02 18 Dec 2025, 15:02 17 Dec 2025, 15:02 17 Dec 2025, 03:27 16 Dec 2025, 21:01 16 Dec 2025, 18:02 16 Dec 2025, 00:05 15 Dec 2025, 21:01 15 Dec 2025, 18:02 13 Dec 2025, 06:02 12 Dec 2025, 21:01 12 Dec 2025, 00:05 11 Dec 2025, 21:02 11 Dec 2025, 18:01 11 Dec 2025, 06:02 10 Dec 2025, 09:03 9 Dec 2025, 18:01 9 Dec 2025, 06:02 9 Dec 2025, 03:25 8 Dec 2025, 21:01 8 Dec 2025, 06:02 8 Dec 2025, 00:05 6 Dec 2025, 18:02 5 Dec 2025, 00:04 4 Dec 2025, 21:02 4 Dec 2025, 18:02 4 Dec 2025, 06:02 4 Dec 2025, 03:26 3 Dec 2025, 00:04 2 Dec 2025, 21:01 2 Dec 2025, 00:04 1 Dec 2025, 03:31 27 Nov 2025, 06:02 27 Nov 2025, 03:20 26 Nov 2025, 00:04 25 Nov 2025, 03:22 24 Nov 2025, 21:01 21 Nov 2025, 00:04 20 Nov 2025, 18:02 20 Nov 2025, 06:02 20 Nov 2025, 03:20 19 Nov 2025, 03:21 19 Nov 2025, 00:05 18 Nov 2025, 18:02 18 Nov 2025, 09:02 18 Nov 2025, 03:21 17 Nov 2025, 03:24 17 Nov 2025, 00:04 16 Nov 2025, 00:04 14 Nov 2025, 21:26 6 Nov 2025, 18:02 6 Nov 2025, 15:02 6 Nov 2025, 12:02 6 Nov 2025, 06:01 6 Nov 2025, 03:22 4 Nov 2025, 18:02 4 Nov 2025, 03:19 4 Nov 2025, 00:04 3 Nov 2025, 21:01 3 Nov 2025, 12:03 3 Nov 2025, 09:02 3 Nov 2025, 06:02 3 Nov 2025, 03:24 3 Nov 2025, 00:04 2 Nov 2025, 18:01 2 Nov 2025, 12:02 2 Nov 2025, 09:01 1 Nov 2025, 21:01 31 Oct 2025, 00:04 30 Oct 2025, 18:02 29 Oct 2025, 21:02 28 Oct 2025, 18:02 27 Oct 2025, 18:02 24 Oct 2025, 21:01 23 Oct 2025, 21:02 23 Oct 2025, 09:02 23 Oct 2025, 06:02 23 Oct 2025, 00:04 21 Oct 2025, 00:04 20 Oct 2025, 21:02 20 Oct 2025, 15:12 20 Oct 2025, 00:05 17 Oct 2025, 18:01 17 Oct 2025, 12:03 16 Oct 2025, 18:02 16 Oct 2025, 00:05 15 Oct 2025, 18:02 13 Oct 2025, 21:01 12 Oct 2025, 18:01
26 Feb 2026, 00:07
12 May 2026, 16:02 12 May 2026, 14:59 12 May 2026, 01:59 12 May 2026, 00:01 11 May 2026, 23:00 11 May 2026, 21:57 11 May 2026, 20:02 11 May 2026, 18:59 11 May 2026, 18:00 11 May 2026, 15:00 10 May 2026, 23:03 10 May 2026, 17:00 10 May 2026, 04:02 9 May 2026, 04:57 9 May 2026, 04:01 9 May 2026, 03:01 8 May 2026, 22:00 8 May 2026, 19:00 8 May 2026, 18:00 8 May 2026, 16:57 8 May 2026, 07:02 8 May 2026, 06:02 8 May 2026, 03:01 8 May 2026, 02:03 8 May 2026, 01:02 8 May 2026, 00:02 7 May 2026, 22:59 7 May 2026, 21:57 7 May 2026, 17:08 5 May 2026, 23:00 5 May 2026, 21:00 5 May 2026, 17:00 5 May 2026, 15:59 5 May 2026, 14:57 5 May 2026, 00:02 4 May 2026, 22:58 4 May 2026, 22:01 4 May 2026, 18:58 4 May 2026, 15:35 4 May 2026, 06:55 4 May 2026, 04:18 2 May 2026, 18:14 2 May 2026, 04:05 2 May 2026, 00:19 1 May 2026, 18:19 1 May 2026, 04:22 1 May 2026, 00:20 29 Apr 2026, 21:21 29 Apr 2026, 15:36 29 Apr 2026, 09:39 29 Apr 2026, 04:11 29 Apr 2026, 00:20 28 Apr 2026, 21:21 28 Apr 2026, 18:28 28 Apr 2026, 15:45 28 Apr 2026, 06:49 27 Apr 2026, 21:20 27 Apr 2026, 18:23 26 Apr 2026, 04:08 25 Apr 2026, 21:10 24 Apr 2026, 18:11 24 Apr 2026, 06:34 24 Apr 2026, 00:17 23 Apr 2026, 18:19 23 Apr 2026, 04:04 23 Apr 2026, 00:17 22 Apr 2026, 21:15 22 Apr 2026, 04:00 22 Apr 2026, 00:13 21 Apr 2026, 21:14 21 Apr 2026, 09:30 21 Apr 2026, 04:01 20 Apr 2026, 21:14 20 Apr 2026, 18:16 18 Apr 2026, 18:09 18 Apr 2026, 00:13 17 Apr 2026, 21:13 17 Apr 2026, 18:14 17 Apr 2026, 00:15 16 Apr 2026, 21:13 16 Apr 2026, 18:21 16 Apr 2026, 15:30 16 Apr 2026, 04:02 16 Apr 2026, 00:16 15 Apr 2026, 18:20 15 Apr 2026, 15:24 15 Apr 2026, 09:29 15 Apr 2026, 04:00 14 Apr 2026, 21:14 14 Apr 2026, 18:21 14 Apr 2026, 06:32 14 Apr 2026, 04:00 14 Apr 2026, 00:16 13 Apr 2026, 21:14 13 Apr 2026, 18:21 11 Apr 2026, 00:11 10 Apr 2026, 21:09 10 Apr 2026, 18:13 10 Apr 2026, 06:32 10 Apr 2026, 00:12 9 Apr 2026, 21:14 9 Apr 2026, 18:17 9 Apr 2026, 15:29 9 Apr 2026, 03:55 9 Apr 2026, 00:09 8 Apr 2026, 21:13 8 Apr 2026, 18:21 8 Apr 2026, 15:27 8 Apr 2026, 00:12 7 Apr 2026, 21:14 4 Apr 2026, 18:05 4 Apr 2026, 03:46 4 Apr 2026, 00:09 3 Apr 2026, 21:07 3 Apr 2026, 18:08 3 Apr 2026, 03:54 3 Apr 2026, 00:11 2 Apr 2026, 21:08 2 Apr 2026, 18:12 2 Apr 2026, 09:19 2 Apr 2026, 06:21 2 Apr 2026, 03:53 1 Apr 2026, 21:12 1 Apr 2026, 18:13 1 Apr 2026, 04:00 1 Apr 2026, 00:11 31 Mar 2026, 21:09 31 Mar 2026, 06:24 31 Mar 2026, 03:56 31 Mar 2026, 00:11 30 Mar 2026, 21:13 30 Mar 2026, 18:15 28 Mar 2026, 18:04 28 Mar 2026, 15:06 27 Mar 2026, 21:09 27 Mar 2026, 18:14 27 Mar 2026, 15:15 27 Mar 2026, 06:21 27 Mar 2026, 03:56 27 Mar 2026, 00:10 26 Mar 2026, 21:07 26 Mar 2026, 18:16 26 Mar 2026, 15:25 26 Mar 2026, 06:21 26 Mar 2026, 03:55 26 Mar 2026, 00:10 25 Mar 2026, 21:08 25 Mar 2026, 18:15 25 Mar 2026, 06:18 25 Mar 2026, 03:47 25 Mar 2026, 00:08 24 Mar 2026, 18:15 24 Mar 2026, 00:07 23 Mar 2026, 21:08 23 Mar 2026, 18:13 23 Mar 2026, 00:09 22 Mar 2026, 18:04 22 Mar 2026, 00:07 21 Mar 2026, 18:03 21 Mar 2026, 00:07 20 Mar 2026, 21:05 20 Mar 2026, 18:08 20 Mar 2026, 15:13 20 Mar 2026, 03:45 20 Mar 2026, 00:08 19 Mar 2026, 06:17 19 Mar 2026, 00:08 18 Mar 2026, 18:16 18 Mar 2026, 12:11 18 Mar 2026, 09:15 18 Mar 2026, 03:50 18 Mar 2026, 00:09 17 Mar 2026, 21:10 17 Mar 2026, 18:15 17 Mar 2026, 03:46 17 Mar 2026, 00:08 16 Mar 2026, 21:10 16 Mar 2026, 18:15 14 Mar 2026, 03:44 14 Mar 2026, 00:08 13 Mar 2026, 21:07 13 Mar 2026, 18:07 13 Mar 2026, 06:12 12 Mar 2026, 21:07 12 Mar 2026, 18:12 12 Mar 2026, 00:07 11 Mar 2026, 03:43 11 Mar 2026, 00:05 10 Mar 2026, 03:43 10 Mar 2026, 00:05 9 Mar 2026, 21:06 7 Mar 2026, 03:37 7 Mar 2026, 00:07 6 Mar 2026, 06:10 6 Mar 2026, 03:44 6 Mar 2026, 00:12 5 Mar 2026, 06:12 5 Mar 2026, 03:45 5 Mar 2026, 00:07 4 Mar 2026, 21:06 4 Mar 2026, 18:09 4 Mar 2026, 09:09 1 Mar 2026, 06:10 1 Mar 2026, 03:49 28 Feb 2026, 21:01 28 Feb 2026, 00:05 27 Feb 2026, 21:05 27 Feb 2026, 18:07 27 Feb 2026, 09:11 27 Feb 2026, 06:13 27 Feb 2026, 00:08 26 Feb 2026, 21:08 26 Feb 2026, 18:12 26 Feb 2026, 09:14 26 Feb 2026, 06:17 26 Feb 2026, 00:07 25 Feb 2026, 03:47 25 Feb 2026, 00:09 24 Feb 2026, 21:08 24 Feb 2026, 18:15 23 Feb 2026, 21:13 21 Feb 2026, 18:03 21 Feb 2026, 06:08 20 Feb 2026, 21:03 20 Feb 2026, 06:14 20 Feb 2026, 00:07 19 Feb 2026, 21:06 19 Feb 2026, 03:48 19 Feb 2026, 00:08 18 Feb 2026, 03:48 17 Feb 2026, 21:08 17 Feb 2026, 00:08 16 Feb 2026, 21:05 14 Feb 2026, 03:44 13 Feb 2026, 21:09 12 Feb 2026, 00:06 11 Feb 2026, 21:10 11 Feb 2026, 00:11 10 Feb 2026, 21:13 10 Feb 2026, 03:56 10 Feb 2026, 00:11 9 Feb 2026, 15:17 9 Feb 2026, 00:08 7 Feb 2026, 21:05 7 Feb 2026, 18:03 7 Feb 2026, 03:43 6 Feb 2026, 21:06 6 Feb 2026, 00:05 5 Feb 2026, 21:06 5 Feb 2026, 18:13 5 Feb 2026, 03:46 5 Feb 2026, 00:07 4 Feb 2026, 21:07 4 Feb 2026, 18:11 4 Feb 2026, 03:45 4 Feb 2026, 00:06 3 Feb 2026, 21:08 3 Feb 2026, 18:14 3 Feb 2026, 09:10 3 Feb 2026, 03:46 1 Feb 2026, 21:03 1 Feb 2026, 18:02 31 Jan 2026, 03:42 31 Jan 2026, 00:06 30 Jan 2026, 18:07 30 Jan 2026, 00:06 29 Jan 2026, 21:03 28 Jan 2026, 15:06 28 Jan 2026, 03:30 28 Jan 2026, 00:05 27 Jan 2026, 21:01 27 Jan 2026, 18:03 27 Jan 2026, 06:02 26 Jan 2026, 21:03 25 Jan 2026, 03:34 24 Jan 2026, 03:29 23 Jan 2026, 21:01 23 Jan 2026, 18:02 23 Jan 2026, 00:05 22 Jan 2026, 21:03 22 Jan 2026, 15:05 22 Jan 2026, 03:31 22 Jan 2026, 00:05 21 Jan 2026, 21:05 21 Jan 2026, 06:02 21 Jan 2026, 03:30 21 Jan 2026, 00:05 20 Jan 2026, 21:03 20 Jan 2026, 18:03 20 Jan 2026, 15:05 20 Jan 2026, 03:30 19 Jan 2026, 21:01 19 Jan 2026, 00:05 16 Jan 2026, 21:01 16 Jan 2026, 18:02 16 Jan 2026, 15:02 16 Jan 2026, 00:05 14 Jan 2026, 06:02 14 Jan 2026, 00:05 12 Jan 2026, 21:02 12 Jan 2026, 18:02 12 Jan 2026, 00:05 11 Jan 2026, 18:02 11 Jan 2026, 03:31 11 Jan 2026, 00:06 10 Jan 2026, 21:01 10 Jan 2026, 03:29 10 Jan 2026, 00:04 9 Jan 2026, 21:01 9 Jan 2026, 00:04 8 Jan 2026, 21:02 8 Jan 2026, 06:02 8 Jan 2026, 03:29 8 Jan 2026, 00:05 7 Jan 2026, 21:01 7 Jan 2026, 18:02 7 Jan 2026, 09:05 7 Jan 2026, 06:02 7 Jan 2026, 03:30 7 Jan 2026, 00:04 6 Jan 2026, 21:01 6 Jan 2026, 03:29 6 Jan 2026, 00:05 3 Jan 2026, 18:02 27 Dec 2025, 06:02 27 Dec 2025, 03:28 23 Dec 2025, 18:02 20 Dec 2025, 00:04 19 Dec 2025, 21:01 19 Dec 2025, 18:02 19 Dec 2025, 00:05 18 Dec 2025, 21:01 18 Dec 2025, 18:02 18 Dec 2025, 15:02 17 Dec 2025, 15:02 17 Dec 2025, 03:27 16 Dec 2025, 21:01 16 Dec 2025, 18:02 16 Dec 2025, 00:05 15 Dec 2025, 21:01 15 Dec 2025, 18:02 13 Dec 2025, 06:02 12 Dec 2025, 21:01 12 Dec 2025, 00:05 11 Dec 2025, 21:02 11 Dec 2025, 18:01 11 Dec 2025, 06:02 10 Dec 2025, 09:03 9 Dec 2025, 18:01 9 Dec 2025, 06:02 9 Dec 2025, 03:25 8 Dec 2025, 21:01 8 Dec 2025, 06:02 8 Dec 2025, 00:05 6 Dec 2025, 18:02 5 Dec 2025, 00:04 4 Dec 2025, 21:02 4 Dec 2025, 18:02 4 Dec 2025, 06:02 4 Dec 2025, 03:26 3 Dec 2025, 00:04 2 Dec 2025, 21:01 2 Dec 2025, 00:04 1 Dec 2025, 03:31 27 Nov 2025, 06:02 27 Nov 2025, 03:20 26 Nov 2025, 00:04 25 Nov 2025, 03:22 24 Nov 2025, 21:01 21 Nov 2025, 00:04 20 Nov 2025, 18:02 20 Nov 2025, 06:02 20 Nov 2025, 03:20 19 Nov 2025, 03:21 19 Nov 2025, 00:05 18 Nov 2025, 18:02 18 Nov 2025, 09:02 18 Nov 2025, 03:21 17 Nov 2025, 03:24 17 Nov 2025, 00:04 16 Nov 2025, 00:04 14 Nov 2025, 21:26 6 Nov 2025, 18:02 6 Nov 2025, 15:02 6 Nov 2025, 12:02 6 Nov 2025, 06:01 6 Nov 2025, 03:22 4 Nov 2025, 18:02 4 Nov 2025, 03:19 4 Nov 2025, 00:04 3 Nov 2025, 21:01 3 Nov 2025, 12:03 3 Nov 2025, 09:02 3 Nov 2025, 06:02 3 Nov 2025, 03:24 3 Nov 2025, 00:04 2 Nov 2025, 18:01 2 Nov 2025, 12:02 2 Nov 2025, 09:01 1 Nov 2025, 21:01 31 Oct 2025, 00:04 30 Oct 2025, 18:02 29 Oct 2025, 21:02 28 Oct 2025, 18:02 27 Oct 2025, 18:02 24 Oct 2025, 21:01 23 Oct 2025, 21:02 23 Oct 2025, 09:02 23 Oct 2025, 06:02 23 Oct 2025, 00:04 21 Oct 2025, 00:04 20 Oct 2025, 21:02 20 Oct 2025, 15:12 20 Oct 2025, 00:05 17 Oct 2025, 18:01 17 Oct 2025, 12:03 16 Oct 2025, 18:02 16 Oct 2025, 00:05 15 Oct 2025, 18:02 13 Oct 2025, 21:01 12 Oct 2025, 18:01
Sun 1 18:02 Sun 1 21:03 Tue 3 03:46 Tue 3 09:10 Tue 3 18:14 Tue 3 21:08 Wed 4 00:06 Wed 4 03:45 Wed 4 18:11 Wed 4 21:07 Thu 5 00:07 Thu 5 03:46 Thu 5 18:13 Thu 5 21:06 Fri 6 00:05 Fri 6 21:06 Sat 7 03:43 Sat 7 18:03 Sat 7 21:05 Mon 9 00:08 Mon 9 15:17 Tue 10 00:11 Tue 10 03:56 Tue 10 21:13 Wed 11 00:11 Wed 11 21:10 Thu 12 00:06 Fri 13 21:09 Sat 14 03:44 Mon 16 21:05 Tue 17 00:08 Tue 17 21:08 Wed 18 03:48 Thu 19 00:08 Thu 19 03:48 Thu 19 21:06 Fri 20 00:07 Fri 20 06:14 Fri 20 21:03 Sat 21 06:08 Sat 21 18:03 Mon 23 21:13 Tue 24 18:15 Tue 24 21:08 Wed 25 00:09 Wed 25 03:47 Thu 26 00:07 Thu 26 06:17 Thu 26 09:14 Thu 26 18:12 Thu 26 21:08 Fri 27 00:08 Fri 27 06:13 Fri 27 09:11 Fri 27 18:07 Fri 27 21:05 Sat 28 00:05 Sat 28 21:01

agent-teams.md +399 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Orchestrate teams of Claude Code sessions

6 

7> Coordinate multiple Claude Code instances working together as a team, with shared tasks, inter-agent messaging, and centralized management.

8 

9<Warning>

10 Agent teams are experimental and disabled by default. Enable them by adding `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` to your [settings.json](/en/settings) or environment. Agent teams have [known limitations](#limitations) around session resumption, task coordination, and shutdown behavior.

11</Warning>

12 

13Agent teams let you coordinate multiple Claude Code instances working together. One session acts as the team lead, coordinating work, assigning tasks, and synthesizing results. Teammates work independently, each in its own context window, and communicate directly with each other.

14 

15Unlike [subagents](/en/sub-agents), which run within a single session and can only report back to the main agent, you can also interact with individual teammates directly without going through the lead.

16 

17This page covers:

18 

19* [When to use agent teams](#when-to-use-agent-teams), including best use cases and how they compare with subagents

20* [Starting a team](#start-your-first-agent-team)

21* [Controlling teammates](#control-your-agent-team), including display modes, task assignment, and delegation

22* [Best practices for parallel work](#best-practices)

23 

24## When to use agent teams

25 

26Agent teams are most effective for tasks where parallel exploration adds real value. See [use case examples](#use-case-examples) for full scenarios. The strongest use cases are:

27 

28* **Research and review**: multiple teammates can investigate different aspects of a problem simultaneously, then share and challenge each other's findings

29* **New modules or features**: teammates can each own a separate piece without stepping on each other

30* **Debugging with competing hypotheses**: teammates test different theories in parallel and converge on the answer faster

31* **Cross-layer coordination**: changes that span frontend, backend, and tests, each owned by a different teammate

32 

33Agent teams add coordination overhead and use significantly more tokens than a single session. They work best when teammates can operate independently. For sequential tasks, same-file edits, or work with many dependencies, a single session or [subagents](/en/sub-agents) are more effective.

34 

35### Compare with subagents

36 

37Both agent teams and [subagents](/en/sub-agents) let you parallelize work, but they operate differently. Choose based on whether your workers need to communicate with each other:

38 

39<Frame caption="Subagents only report results back to the main agent and never talk to each other. In agent teams, teammates share a task list, claim work, and communicate directly with each other.">

40 <img src="https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-light.png?fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=2f8db9b4f3705dd3ab931fbe2d96e42a" className="dark:hidden" alt="Diagram comparing subagent and agent team architectures. Subagents are spawned by the main agent, do work, and report results back. Agent teams coordinate through a shared task list, with teammates communicating directly with each other." data-og-width="4245" width="4245" data-og-height="1615" height="1615" data-path="images/subagents-vs-agent-teams-light.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-light.png?w=280&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=a2cfe413c2084b477be40ac8723d9d40 280w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-light.png?w=560&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=c642c09a4c211b10b35eee7d7d0d149f 560w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-light.png?w=840&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=40d286f77c8a4075346b4fcaa2b36248 840w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-light.png?w=1100&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=923986caa23c0ef2c27d7e45f4dce6d1 1100w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-light.png?w=1650&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=17a730a070db6d71d029a98b074c68e8 1650w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-light.png?w=2500&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=e402533fc9e8b5e8d26a835cc4aa1742 2500w" />

41 

42 <img src="https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-dark.png?fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=d573a037540f2ada6a9ae7d8285b46fd" className="hidden dark:block" alt="Diagram comparing subagent and agent team architectures. Subagents are spawned by the main agent, do work, and report results back. Agent teams coordinate through a shared task list, with teammates communicating directly with each other." data-og-width="4245" width="4245" data-og-height="1615" height="1615" data-path="images/subagents-vs-agent-teams-dark.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-dark.png?w=280&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=06ca5b18b232855acc488357d8d01fa7 280w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-dark.png?w=560&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=3d34daee83994781eb74b74d1ed511c4 560w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-dark.png?w=840&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=82ea35ac837de7d674002de69689b9cf 840w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-dark.png?w=1100&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=3653085214a9fc65d1f589044894a296 1100w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-dark.png?w=1650&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=8e74b42694e428570e876d34f29e6ad6 1650w, https://mintcdn.com/claude-code/nsvRFSDNfpSU5nT7/images/subagents-vs-agent-teams-dark.png?w=2500&fit=max&auto=format&n=nsvRFSDNfpSU5nT7&q=85&s=3be00c56c6a0dcccbe15640020be0128 2500w" />

43</Frame>

44 

45| | Subagents | Agent teams |

46| :---------------- | :----------------------------------------------- | :-------------------------------------------------- |

47| **Context** | Own context window; results return to the caller | Own context window; fully independent |

48| **Communication** | Report results back to the main agent only | Teammates message each other directly |

49| **Coordination** | Main agent manages all work | Shared task list with self-coordination |

50| **Best for** | Focused tasks where only the result matters | Complex work requiring discussion and collaboration |

51| **Token cost** | Lower: results summarized back to main context | Higher: each teammate is a separate Claude instance |

52 

53Use subagents when you need quick, focused workers that report back. Use agent teams when teammates need to share findings, challenge each other, and coordinate on their own.

54 

55## Enable agent teams

56 

57Agent teams are disabled by default. Enable them by setting the `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` environment variable to `1`, either in your shell environment or through [settings.json](/en/settings):

58 

59```json settings.json theme={null}

60{

61 "env": {

62 "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"

63 }

64}

65```

66 

67## Start your first agent team

68 

69After enabling agent teams, tell Claude to create an agent team and describe the task and the team structure you want in natural language. Claude creates the team, spawns teammates, and coordinates work based on your prompt.

70 

71This example works well because the three roles are independent and can explore the problem without waiting on each other:

72 

73```

74I'm designing a CLI tool that helps developers track TODO comments across

75their codebase. Create an agent team to explore this from different angles: one

76teammate on UX, one on technical architecture, one playing devil's advocate.

77```

78 

79From there, Claude creates a team with a [shared task list](/en/interactive-mode#task-list), spawns teammates for each perspective, has them explore the problem, synthesizes findings, and attempts to [clean up the team](#clean-up-the-team) when finished.

80 

81The lead's terminal lists all teammates and what they're working on. Use Shift+Down to cycle through teammates and message them directly. After the last teammate, Shift+Down wraps back to the lead.

82 

83If you want each teammate in its own split pane, see [Choose a display mode](#choose-a-display-mode).

84 

85## Control your agent team

86 

87Tell the lead what you want in natural language. It handles team coordination, task assignment, and delegation based on your instructions.

88 

89### Choose a display mode

90 

91Agent teams support two display modes:

92 

93* **In-process**: all teammates run inside your main terminal. Use Shift+Down to cycle through teammates and type to message them directly. Works in any terminal, no extra setup required.

94* **Split panes**: each teammate gets its own pane. You can see everyone's output at once and click into a pane to interact directly. Requires tmux, or iTerm2.

95 

96<Note>

97 `tmux` has known limitations on certain operating systems and traditionally works best on macOS. Using `tmux -CC` in iTerm2 is the suggested entrypoint into `tmux`.

98</Note>

99 

100The default is `"auto"`, which uses split panes if you're already running inside a tmux session, and in-process otherwise. The `"tmux"` setting enables split-pane mode and auto-detects whether to use tmux or iTerm2 based on your terminal. To override, set `teammateMode` in your [settings.json](/en/settings):

101 

102```json theme={null}

103{

104 "teammateMode": "in-process"

105}

106```

107 

108To force in-process mode for a single session, pass it as a flag:

109 

110```bash theme={null}

111claude --teammate-mode in-process

112```

113 

114Split-pane mode requires either [tmux](https://github.com/tmux/tmux/wiki) or iTerm2 with the [`it2` CLI](https://github.com/mkusaka/it2). To install manually:

115 

116* **tmux**: install through your system's package manager. See the [tmux wiki](https://github.com/tmux/tmux/wiki/Installing) for platform-specific instructions.

117* **iTerm2**: install the [`it2` CLI](https://github.com/mkusaka/it2), then enable the Python API in **iTerm2 → Settings → General → Magic → Enable Python API**.

118 

119### Specify teammates and models

120 

121Claude decides the number of teammates to spawn based on your task, or you can specify exactly what you want:

122 

123```

124Create a team with 4 teammates to refactor these modules in parallel.

125Use Sonnet for each teammate.

126```

127 

128### Require plan approval for teammates

129 

130For complex or risky tasks, you can require teammates to plan before implementing. The teammate works in read-only plan mode until the lead approves their approach:

131 

132```

133Spawn an architect teammate to refactor the authentication module.

134Require plan approval before they make any changes.

135```

136 

137When a teammate finishes planning, it sends a plan approval request to the lead. The lead reviews the plan and either approves it or rejects it with feedback. If rejected, the teammate stays in plan mode, revises based on the feedback, and resubmits. Once approved, the teammate exits plan mode and begins implementation.

138 

139The lead makes approval decisions autonomously. To influence the lead's judgment, give it criteria in your prompt, such as "only approve plans that include test coverage" or "reject plans that modify the database schema."

140 

141### Talk to teammates directly

142 

143Each teammate is a full, independent Claude Code session. You can message any teammate directly to give additional instructions, ask follow-up questions, or redirect their approach.

144 

145* **In-process mode**: use Shift+Down to cycle through teammates, then type to send them a message. Press Enter to view a teammate's session, then Escape to interrupt their current turn. Press Ctrl+T to toggle the task list.

146* **Split-pane mode**: click into a teammate's pane to interact with their session directly. Each teammate has a full view of their own terminal.

147 

148### Assign and claim tasks

149 

150The shared task list coordinates work across the team. The lead creates tasks and teammates work through them. Tasks have three states: pending, in progress, and completed. Tasks can also depend on other tasks: a pending task with unresolved dependencies cannot be claimed until those dependencies are completed.

151 

152The lead can assign tasks explicitly, or teammates can self-claim:

153 

154* **Lead assigns**: tell the lead which task to give to which teammate

155* **Self-claim**: after finishing a task, a teammate picks up the next unassigned, unblocked task on its own

156 

157Task claiming uses file locking to prevent race conditions when multiple teammates try to claim the same task simultaneously.

158 

159### Shut down teammates

160 

161To gracefully end a teammate's session:

162 

163```

164Ask the researcher teammate to shut down

165```

166 

167The lead sends a shutdown request. The teammate can approve, exiting gracefully, or reject with an explanation.

168 

169### Clean up the team

170 

171When you're done, ask the lead to clean up:

172 

173```

174Clean up the team

175```

176 

177This removes the shared team resources. When the lead runs cleanup, it checks for active teammates and fails if any are still running, so shut them down first.

178 

179<Warning>

180 Always use the lead to clean up. Teammates should not run cleanup because their team context may not resolve correctly, potentially leaving resources in an inconsistent state.

181</Warning>

182 

183### Enforce quality gates with hooks

184 

185Use [hooks](/en/hooks) to enforce rules when teammates finish work or tasks complete:

186 

187* [`TeammateIdle`](/en/hooks#teammateidle): runs when a teammate is about to go idle. Exit with code 2 to send feedback and keep the teammate working.

188* [`TaskCompleted`](/en/hooks#taskcompleted): runs when a task is being marked complete. Exit with code 2 to prevent completion and send feedback.

189 

190## How agent teams work

191 

192This section covers the architecture and mechanics behind agent teams. If you want to start using them, see [Control your agent team](#control-your-agent-team) above.

193 

194### How Claude starts agent teams

195 

196There are two ways agent teams get started:

197 

198* **You request a team**: give Claude a task that benefits from parallel work and explicitly ask for an agent team. Claude creates one based on your instructions.

199* **Claude proposes a team**: if Claude determines your task would benefit from parallel work, it may suggest creating a team. You confirm before it proceeds.

200 

201In both cases, you stay in control. Claude won't create a team without your approval.

202 

203### Architecture

204 

205An agent team consists of:

206 

207| Component | Role |

208| :------------ | :----------------------------------------------------------------------------------------- |

209| **Team lead** | The main Claude Code session that creates the team, spawns teammates, and coordinates work |

210| **Teammates** | Separate Claude Code instances that each work on assigned tasks |

211| **Task list** | Shared list of work items that teammates claim and complete |

212| **Mailbox** | Messaging system for communication between agents |

213 

214See [Choose a display mode](#choose-a-display-mode) for display configuration options. Teammate messages arrive at the lead automatically.

215 

216The system manages task dependencies automatically. When a teammate completes a task that other tasks depend on, blocked tasks unblock without manual intervention.

217 

218Teams and tasks are stored locally:

219 

220* **Team config**: `~/.claude/teams/{team-name}/config.json`

221* **Task list**: `~/.claude/tasks/{team-name}/`

222 

223The team config contains a `members` array with each teammate's name, agent ID, and agent type. Teammates can read this file to discover other team members.

224 

225### Permissions

226 

227Teammates start with the lead's permission settings. If the lead runs with `--dangerously-skip-permissions`, all teammates do too. After spawning, you can change individual teammate modes, but you can't set per-teammate modes at spawn time.

228 

229### Context and communication

230 

231Each teammate has its own context window. When spawned, a teammate loads the same project context as a regular session: CLAUDE.md, MCP servers, and skills. It also receives the spawn prompt from the lead. The lead's conversation history does not carry over.

232 

233**How teammates share information:**

234 

235* **Automatic message delivery**: when teammates send messages, they're delivered automatically to recipients. The lead doesn't need to poll for updates.

236* **Idle notifications**: when a teammate finishes and stops, they automatically notify the lead.

237* **Shared task list**: all agents can see task status and claim available work.

238 

239**Teammate messaging:**

240 

241* **message**: send a message to one specific teammate

242* **broadcast**: send to all teammates simultaneously. Use sparingly, as costs scale with team size.

243 

244### Token usage

245 

246Agent teams use significantly more tokens than a single session. Each teammate has its own context window, and token usage scales with the number of active teammates. For research, review, and new feature work, the extra tokens are usually worthwhile. For routine tasks, a single session is more cost-effective. See [agent team token costs](/en/costs#agent-team-token-costs) for usage guidance.

247 

248## Use case examples

249 

250These examples show how agent teams handle tasks where parallel exploration adds value.

251 

252### Run a parallel code review

253 

254A single reviewer tends to gravitate toward one type of issue at a time. Splitting review criteria into independent domains means security, performance, and test coverage all get thorough attention simultaneously. The prompt assigns each teammate a distinct lens so they don't overlap:

255 

256```

257Create an agent team to review PR #142. Spawn three reviewers:

258- One focused on security implications

259- One checking performance impact

260- One validating test coverage

261Have them each review and report findings.

262```

263 

264Each reviewer works from the same PR but applies a different filter. The lead synthesizes findings across all three after they finish.

265 

266### Investigate with competing hypotheses

267 

268When the root cause is unclear, a single agent tends to find one plausible explanation and stop looking. The prompt fights this by making teammates explicitly adversarial: each one's job is not only to investigate its own theory but to challenge the others'.

269 

270```

271Users report the app exits after one message instead of staying connected.

272Spawn 5 agent teammates to investigate different hypotheses. Have them talk to

273each other to try to disprove each other's theories, like a scientific

274debate. Update the findings doc with whatever consensus emerges.

275```

276 

277The debate structure is the key mechanism here. Sequential investigation suffers from anchoring: once one theory is explored, subsequent investigation is biased toward it.

278 

279With multiple independent investigators actively trying to disprove each other, the theory that survives is much more likely to be the actual root cause.

280 

281## Best practices

282 

283### Give teammates enough context

284 

285Teammates load project context automatically, including CLAUDE.md, MCP servers, and skills, but they don't inherit the lead's conversation history. See [Context and communication](#context-and-communication) for details. Include task-specific details in the spawn prompt:

286 

287```

288Spawn a security reviewer teammate with the prompt: "Review the authentication module

289at src/auth/ for security vulnerabilities. Focus on token handling, session

290management, and input validation. The app uses JWT tokens stored in

291httpOnly cookies. Report any issues with severity ratings."

292```

293 

294### Choose an appropriate team size

295 

296There's no hard limit on the number of teammates, but practical constraints apply:

297 

298* **Token costs scale linearly**: each teammate has its own context window and consumes tokens independently. See [agent team token costs](/en/costs#agent-team-token-costs) for details.

299* **Coordination overhead increases**: more teammates means more communication, task coordination, and potential for conflicts

300* **Diminishing returns**: beyond a certain point, additional teammates don't speed up work proportionally

301 

302Start with 3-5 teammates for most workflows. This balances parallel work with manageable coordination. The examples in this guide use 3-5 teammates because that range works well across different task types.

303 

304Having 5-6 [tasks](/en/agent-teams#architecture) per teammate keeps everyone productive without excessive context switching. If you have 15 independent tasks, 3 teammates is a good starting point.

305 

306Scale up only when the work genuinely benefits from having teammates work simultaneously. Three focused teammates often outperform five scattered ones.

307 

308### Size tasks appropriately

309 

310* **Too small**: coordination overhead exceeds the benefit

311* **Too large**: teammates work too long without check-ins, increasing risk of wasted effort

312* **Just right**: self-contained units that produce a clear deliverable, such as a function, a test file, or a review

313 

314<Tip>

315 The lead breaks work into tasks and assigns them to teammates automatically. If it isn't creating enough tasks, ask it to split the work into smaller pieces. Having 5-6 tasks per teammate keeps everyone productive and lets the lead reassign work if someone gets stuck.

316</Tip>

317 

318### Wait for teammates to finish

319 

320Sometimes the lead starts implementing tasks itself instead of waiting for teammates. If you notice this:

321 

322```

323Wait for your teammates to complete their tasks before proceeding

324```

325 

326### Start with research and review

327 

328If you're new to agent teams, start with tasks that have clear boundaries and don't require writing code: reviewing a PR, researching a library, or investigating a bug. These tasks show the value of parallel exploration without the coordination challenges that come with parallel implementation.

329 

330### Avoid file conflicts

331 

332Two teammates editing the same file leads to overwrites. Break the work so each teammate owns a different set of files.

333 

334### Monitor and steer

335 

336Check in on teammates' progress, redirect approaches that aren't working, and synthesize findings as they come in. Letting a team run unattended for too long increases the risk of wasted effort.

337 

338## Troubleshooting

339 

340### Teammates not appearing

341 

342If teammates aren't appearing after you ask Claude to create a team:

343 

344* In in-process mode, teammates may already be running but not visible. Press Shift+Down to cycle through active teammates.

345* Check that the task you gave Claude was complex enough to warrant a team. Claude decides whether to spawn teammates based on the task.

346* If you explicitly requested split panes, ensure tmux is installed and available in your PATH:

347 ```bash theme={null}

348 which tmux

349 ```

350* For iTerm2, verify the `it2` CLI is installed and the Python API is enabled in iTerm2 preferences.

351 

352### Too many permission prompts

353 

354Teammate permission requests bubble up to the lead, which can create friction. Pre-approve common operations in your [permission settings](/en/permissions) before spawning teammates to reduce interruptions.

355 

356### Teammates stopping on errors

357 

358Teammates may stop after encountering errors instead of recovering. Check their output using Shift+Down in in-process mode or by clicking the pane in split mode, then either:

359 

360* Give them additional instructions directly

361* Spawn a replacement teammate to continue the work

362 

363### Lead shuts down before work is done

364 

365The lead may decide the team is finished before all tasks are actually complete. If this happens, tell it to keep going. You can also tell the lead to wait for teammates to finish before proceeding if it starts doing work instead of delegating.

366 

367### Orphaned tmux sessions

368 

369If a tmux session persists after the team ends, it may not have been fully cleaned up. List sessions and kill the one created by the team:

370 

371```bash theme={null}

372tmux ls

373tmux kill-session -t <session-name>

374```

375 

376## Limitations

377 

378Agent teams are experimental. Current limitations to be aware of:

379 

380* **No session resumption with in-process teammates**: `/resume` and `/rewind` do not restore in-process teammates. After resuming a session, the lead may attempt to message teammates that no longer exist. If this happens, tell the lead to spawn new teammates.

381* **Task status can lag**: teammates sometimes fail to mark tasks as completed, which blocks dependent tasks. If a task appears stuck, check whether the work is actually done and update the task status manually or tell the lead to nudge the teammate.

382* **Shutdown can be slow**: teammates finish their current request or tool call before shutting down, which can take time.

383* **One team per session**: a lead can only manage one team at a time. Clean up the current team before starting a new one.

384* **No nested teams**: teammates cannot spawn their own teams or teammates. Only the lead can manage the team.

385* **Lead is fixed**: the session that creates the team is the lead for its lifetime. You can't promote a teammate to lead or transfer leadership.

386* **Permissions set at spawn**: all teammates start with the lead's permission mode. You can change individual teammate modes after spawning, but you can't set per-teammate modes at spawn time.

387* **Split panes require tmux or iTerm2**: the default in-process mode works in any terminal. Split-pane mode isn't supported in VS Code's integrated terminal, Windows Terminal, or Ghostty.

388 

389<Tip>

390 **`CLAUDE.md` works normally**: teammates read `CLAUDE.md` files from their working directory. Use this to provide project-specific guidance to all teammates.

391</Tip>

392 

393## Next steps

394 

395Explore related approaches for parallel work and delegation:

396 

397* **Lightweight delegation**: [subagents](/en/sub-agents) spawn helper agents for research or verification within your session, better for tasks that don't need inter-agent coordination

398* **Manual parallel sessions**: [Git worktrees](/en/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) let you run multiple Claude Code sessions yourself without automated team coordination

399* **Compare approaches**: see the [subagent vs agent team](/en/features-overview#compare-similar-features) comparison for a side-by-side breakdown

amazon-bedrock.md +58 −36

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Claude Code on Amazon Bedrock5# Claude Code on Amazon Bedrock

2 6 

3> Learn about configuring Claude Code through Amazon Bedrock, including setup, IAM configuration, and troubleshooting.7> Learn about configuring Claude Code through Amazon Bedrock, including setup, IAM configuration, and troubleshooting.


7Before configuring Claude Code with Bedrock, ensure you have:11Before configuring Claude Code with Bedrock, ensure you have:

8 12 

9* An AWS account with Bedrock access enabled13* An AWS account with Bedrock access enabled

10* Access to desired Claude models (e.g., Claude Sonnet 4.5) in Bedrock14* Access to desired Claude models (for example, Claude Sonnet 4.6) in Bedrock

11* AWS CLI installed and configured (optional - only needed if you don't have another mechanism for getting credentials)15* AWS CLI installed and configured (optional - only needed if you don't have another mechanism for getting credentials)

12* Appropriate IAM permissions16* Appropriate IAM permissions

13 17 

18<Note>

19 If you are deploying Claude Code to multiple users, [pin your model versions](#4-pin-model-versions) to prevent breakage when Anthropic releases new models.

20</Note>

21 

14## Setup22## Setup

15 23 

16### 1. Submit use case details24### 1. Submit use case details


48export AWS_PROFILE=your-profile-name56export AWS_PROFILE=your-profile-name

49```57```

50 58 

51**Option D: Bedrock API keys**59**Option D: AWS Management Console credentials**

60 

61```bash theme={null}

62aws login

63```

64 

65[Learn more](https://docs.aws.amazon.com/signin/latest/userguide/command-line-sign-in.html) about `aws login`.

66 

67**Option E: Bedrock API keys**

52 68 

53```bash theme={null}69```bash theme={null}

54export AWS_BEARER_TOKEN_BEDROCK=your-bedrock-api-key70export AWS_BEARER_TOKEN_BEDROCK=your-bedrock-api-key


58 74 

59#### Advanced credential configuration75#### Advanced credential configuration

60 76 

61Claude Code supports automatic credential refresh for AWS SSO and corporate identity providers. Add these settings to your Claude Code settings file (see [Settings](/en/docs/claude-code/settings) for file locations).77Claude Code supports automatic credential refresh for AWS SSO and corporate identity providers. Add these settings to your Claude Code settings file (see [Settings](/en/settings) for file locations).

62 78 

63When Claude Code detects that your AWS credentials are expired (either locally based on their timestamp or when Bedrock returns a credential error), it will automatically run your configured `awsAuthRefresh` and/or `awsCredentialExport` commands to obtain new credentials before retrying the request.79When Claude Code detects that your AWS credentials are expired (either locally based on their timestamp or when Bedrock returns a credential error), it will automatically run your configured `awsAuthRefresh` and/or `awsCredentialExport` commands to obtain new credentials before retrying the request.

64 80 


75 91 

76##### Configuration settings explained92##### Configuration settings explained

77 93 

78**`awsAuthRefresh`**: Use this for commands that modify the `.aws` directory (e.g., updating credentials, SSO cache, or config files). Output is shown to the user (but user input is not supported), making it suitable for browser-based authentication flows where the CLI displays a code to enter in the browser.94**`awsAuthRefresh`**: Use this for commands that modify the `.aws` directory, such as updating credentials, SSO cache, or config files. The command's output is displayed to the user, but interactive input isn't supported. This works well for browser-based SSO flows where the CLI displays a URL or code and you complete authentication in the browser.

79 95 

80**`awsCredentialExport`**: Only use this if you cannot modify `.aws` and must directly return credentials. Output is captured silently (not shown to the user). The command must output JSON in this format:96**`awsCredentialExport`**: Only use this if you can't modify `.aws` and must directly return credentials. Output is captured silently and not shown to the user. The command must output JSON in this format:

81 97 

82```json theme={null}98```json theme={null}

83{99{


106 122 

107* `AWS_REGION` is a required environment variable. Claude Code does not read from the `.aws` config file for this setting.123* `AWS_REGION` is a required environment variable. Claude Code does not read from the `.aws` config file for this setting.

108* When using Bedrock, the `/login` and `/logout` commands are disabled since authentication is handled through AWS credentials.124* When using Bedrock, the `/login` and `/logout` commands are disabled since authentication is handled through AWS credentials.

109* You can use settings files for environment variables like `AWS_PROFILE` that you don't want to leak to other processes. See [Settings](/en/docs/claude-code/settings) for more information.125* You can use settings files for environment variables like `AWS_PROFILE` that you don't want to leak to other processes. See [Settings](/en/settings) for more information.

126 

127### 4. Pin model versions

110 128 

111### 4. Model configuration129<Warning>

130 Pin specific model versions for every deployment. If you use model aliases (`sonnet`, `opus`, `haiku`) without pinning, Claude Code may attempt to use a newer model version that isn't available in your Bedrock account, breaking existing users when Anthropic releases updates.

131</Warning>

112 132 

113Claude Code uses these default models for Bedrock:133Set these environment variables to specific Bedrock model IDs:

134 

135```bash theme={null}

136export ANTHROPIC_DEFAULT_OPUS_MODEL='us.anthropic.claude-opus-4-6-v1'

137export ANTHROPIC_DEFAULT_SONNET_MODEL='us.anthropic.claude-sonnet-4-6'

138export ANTHROPIC_DEFAULT_HAIKU_MODEL='us.anthropic.claude-haiku-4-5-20251001-v1:0'

139```

140 

141These variables use cross-region inference profile IDs (with the `us.` prefix). If you use a different region prefix or application inference profiles, adjust accordingly. For current and legacy model IDs, see [Models overview](https://platform.claude.com/docs/en/about-claude/models/overview). See [Model configuration](/en/model-config#pin-models-for-third-party-deployments) for the full list of environment variables.

142 

143Claude Code uses these default models when no pinning variables are set:

114 144 

115| Model type | Default value |145| Model type | Default value |

116| :--------------- | :------------------------------------------------- |146| :--------------- | :-------------------------------------------- |

117| Primary model | `global.anthropic.claude-sonnet-4-5-20250929-v1:0` |147| Primary model | `global.anthropic.claude-sonnet-4-6` |

118| Small/fast model | `us.anthropic.claude-haiku-4-5-20251001-v1:0` |148| Small/fast model | `us.anthropic.claude-haiku-4-5-20251001-v1:0` |

119 149 

120<Note>150To customize models further, use one of these methods:

121 For Bedrock users, Claude Code will not automatically upgrade from Haiku 3.5 to Haiku 4.5. To manually switch to a newer Haiku model, set the `ANTHROPIC_DEFAULT_HAIKU_MODEL` environment variable to the full model name (e.g., `us.anthropic.claude-haiku-4-5-20251001-v1:0`).

122</Note>

123 

124To customize models, use one of these methods:

125 151 

126```bash theme={null}152```bash theme={null}

127# Using inference profile ID153# Using inference profile ID

128export ANTHROPIC_MODEL='global.anthropic.claude-sonnet-4-5-20250929-v1:0'154export ANTHROPIC_MODEL='global.anthropic.claude-sonnet-4-6'

129export ANTHROPIC_SMALL_FAST_MODEL='us.anthropic.claude-haiku-4-5-20251001-v1:0'155export ANTHROPIC_SMALL_FAST_MODEL='us.anthropic.claude-haiku-4-5-20251001-v1:0'

130 156 

131# Using application inference profile ARN157# Using application inference profile ARN


135export DISABLE_PROMPT_CACHING=1161export DISABLE_PROMPT_CACHING=1

136```162```

137 163 

138<Note>164<Note>[Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) may not be available in all regions.</Note>

139 [Prompt caching](/en/docs/build-with-claude/prompt-caching) may not be available in all regions

140</Note>

141 

142### 5. Output token configuration

143 

144When using Claude Code with Amazon Bedrock, we recommend the following token settings:

145 

146```bash theme={null}

147# Recommended output token settings for Bedrock

148export CLAUDE_CODE_MAX_OUTPUT_TOKENS=4096

149export MAX_THINKING_TOKENS=1024

150```

151 

152**Why these values:**

153 

154* **`CLAUDE_CODE_MAX_OUTPUT_TOKENS=4096`**: Bedrock's burndown throttling logic sets a minimum of 4096 tokens as the max\_token penalty. Setting this lower won't reduce costs but may cut off long tool uses, causing the Claude Code agent loop to fail persistently. Claude Code typically uses less than 4096 output tokens without extended thinking, but may need this headroom for tasks involving significant file creation or Write tool usage.

155 

156* **`MAX_THINKING_TOKENS=1024`**: This provides space for extended thinking without cutting off tool use responses, while still maintaining focused reasoning chains. This balance helps prevent trajectory changes that aren't always helpful for coding tasks specifically.

157 165 

158## IAM configuration166## IAM configuration

159 167 


200For details, see [Bedrock IAM documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/security-iam.html).208For details, see [Bedrock IAM documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/security-iam.html).

201 209 

202<Note>210<Note>

203 We recommend creating a dedicated AWS account for Claude Code to simplify cost tracking and access control.211 Create a dedicated AWS account for Claude Code to simplify cost tracking and access control.

204</Note>212</Note>

205 213 

214## AWS Guardrails

215 

216[Amazon Bedrock Guardrails](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails.html) let you implement content filtering for Claude Code. Create a Guardrail in the [Amazon Bedrock console](https://console.aws.amazon.com/bedrock/), publish a version, then add the Guardrail headers to your [settings file](/en/settings). Enable Cross-Region inference on your Guardrail if you're using cross-region inference profiles.

217 

218Example configuration:

219 

220```json theme={null}

221{

222 "env": {

223 "ANTHROPIC_CUSTOM_HEADERS": "X-Amzn-Bedrock-GuardrailIdentifier: your-guardrail-id\nX-Amzn-Bedrock-GuardrailVersion: 1"

224 }

225}

226```

227 

206## Troubleshooting228## Troubleshooting

207 229 

208If you encounter region issues:230If you encounter region issues:

analytics.md +182 −45

Details

1# Analytics1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> View detailed usage insights and productivity metrics for your organization's Claude Code deployment.5# Track team usage with analytics

4 6 

5Claude Code provides an analytics dashboard that helps organizations understand developer usage patterns, track productivity metrics, and optimize their Claude Code adoption.7> View Claude Code usage metrics, track adoption, and measure engineering velocity in the analytics dashboard.

8 

9Claude Code provides analytics dashboards to help organizations understand developer usage patterns, track contribution metrics, and measure how Claude Code impacts engineering velocity. Access the dashboard for your plan:

10 

11| Plan | Dashboard URL | Includes | Read more |

12| ----------------------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------- |

13| Claude for Teams / Enterprise | [claude.ai/analytics/claude-code](https://claude.ai/analytics/claude-code) | Usage metrics, contribution metrics with GitHub integration, leaderboard, data export | [Details](#access-analytics-for-teams-and-enterprise) |

14| API (Claude Console) | [platform.claude.com/claude-code](https://platform.claude.com/claude-code) | Usage metrics, spend tracking, team insights | [Details](#access-analytics-for-api-customers) |

15 

16## Access analytics for Teams and Enterprise

17 

18Navigate to [claude.ai/analytics/claude-code](https://claude.ai/analytics/claude-code). Admins and Owners can view the dashboard.

19 

20The Teams and Enterprise dashboard includes:

21 

22* **Usage metrics**: lines of code accepted, suggestion accept rate, daily active users and sessions

23* **Contribution metrics**: PRs and lines of code shipped with Claude Code assistance, with [GitHub integration](#enable-contribution-metrics)

24* **Leaderboard**: top contributors ranked by Claude Code usage

25* **Data export**: download contribution data as CSV for custom reporting

26 

27### Enable contribution metrics

6 28 

7<Note>29<Note>

8 Analytics are currently available only for organizations using Claude Code with the Claude API through the Claude Console.30 Contribution metrics are in public beta and available on Claude for Teams and Claude for Enterprise plans. These metrics only cover users within your claude.ai organization. Usage through the Claude Console API or third-party integrations is not included.

9</Note>31</Note>

10 32 

11## Access analytics33Usage and adoption data is available for all Claude for Teams and Claude for Enterprise accounts. Contribution metrics require additional setup to connect your GitHub organization.

34 

35You need the Owner role to configure analytics settings. A GitHub admin must install the GitHub app.

36 

37<Warning>

38 Contribution metrics are not available for organizations with [Zero Data Retention](/en/data-usage#data-retention) enabled. The analytics dashboard will show usage metrics only.

39</Warning>

40 

41<Steps>

42 <Step title="Install the GitHub app">

43 A GitHub admin installs the Claude GitHub app on your organization's GitHub account at [github.com/apps/claude](https://github.com/apps/claude).

44 </Step>

45 

46 <Step title="Enable Claude Code analytics">

47 A Claude Owner navigates to [claude.ai/admin-settings/claude-code](https://claude.ai/admin-settings/claude-code) and enables the Claude Code analytics feature.

48 </Step>

49 

50 <Step title="Enable GitHub analytics">

51 On the same page, enable the "GitHub analytics" toggle.

52 </Step>

53 

54 <Step title="Authenticate with GitHub">

55 Complete the GitHub authentication flow and select which GitHub organizations to include in the analysis.

56 </Step>

57</Steps>

12 58 

13Navigate to the analytics dashboard at [console.anthropic.com/claude-code](https://console.anthropic.com/claude-code).59Data typically appears within 24 hours after enabling, with daily updates. If no data appears, you may see one of these messages:

14 60 

15### Required roles61* **"GitHub app required"**: install the GitHub app to view contribution metrics

62* **"Data processing in progress"**: check back in a few days and confirm the GitHub app is installed if data doesn't appear

16 63 

17* **Primary Owner**64Contribution metrics support GitHub Cloud and GitHub Enterprise Server.

18* **Owner**65 

19* **Billing**66### Review summary metrics

20* **Admin**

21* **Developer**

22 67 

23<Note>68<Note>

24 Users with **User**, **Claude Code User** or **Membership Admin** roles cannot access analytics.69 These metrics are deliberately conservative and represent an underestimate of Claude Code's actual impact. Only lines and PRs where there is high confidence in Claude Code's involvement are counted.

25</Note>70</Note>

26 71 

27## Available metrics72The dashboard displays these summary metrics at the top:

73 

74* **PRs with CC**: total count of merged pull requests that contain at least one line of code written with Claude Code

75* **Lines of code with CC**: total lines of code across all merged PRs that were written with Claude Code assistance. Only "effective lines" are counted: lines with more than 3 characters after normalization, excluding empty lines and lines with only brackets or trivial punctuation.

76* **PRs with Claude Code (%)**: percentage of all merged PRs that contain Claude Code-assisted code

77* **Suggestion accept rate**: percentage of times users accept Claude Code's code editing suggestions, including Edit, Write, and NotebookEdit tool usage

78* **Lines of code accepted**: total lines of code written by Claude Code that users have accepted in their sessions. This excludes rejected suggestions and does not track subsequent deletions.

79 

80### Explore the charts

81 

82The dashboard includes several charts to visualize trends over time.

83 

84#### Track adoption

85 

86The Adoption chart shows daily usage trends:

87 

88* **users**: daily active users

89* **sessions**: number of active Claude Code sessions per day

90 

91#### Measure PRs per user

92 

93This chart displays individual developer activity over time:

94 

95* **PRs per user**: total number of PRs merged per day divided by daily active users

96* **users**: daily active users

97 

98Use this to understand how individual productivity changes as Claude Code adoption increases.

99 

100#### View pull requests breakdown

101 

102The Pull requests chart shows a daily breakdown of merged PRs:

28 103 

29### Lines of code accepted104* **PRs with CC**: pull requests containing Claude Code-assisted code

105* **PRs without CC**: pull requests without Claude Code-assisted code

30 106 

31Total lines of code written by Claude Code that users have accepted in their sessions.107Toggle to **Lines of code** view to see the same breakdown by lines of code rather than PR count.

32 108 

33* Excludes rejected code suggestions109#### Find top contributors

34* Doesn't track subsequent deletions

35 110 

36### Suggestion accept rate111The Leaderboard shows the top 10 users ranked by contribution volume. Toggle between:

37 112 

38Percentage of times users accept code editing tool usage, including:113* **Pull requests**: shows PRs with Claude Code vs All PRs for each user

114* **Lines of code**: shows lines with Claude Code vs All lines for each user

39 115 

40* Edit116Click **Export all users** to download complete contribution data for all users as a CSV file. The export includes all users, not just the top 10 displayed.

41* Write

42* NotebookEdit

43 117 

44### Activity118### PR attribution

45 119 

46**users**: Number of active users in a given day (number on left Y-axis)120When contribution metrics are enabled, Claude Code analyzes merged pull requests to determine which code was written with Claude Code assistance. This is done by matching Claude Code session activity against the code in each PR.

47 121 

48**sessions**: Number of active sessions in a given day (number on right Y-axis)122#### Tagging criteria

49 123 

50### Spend124PRs are tagged as "with Claude Code" if they contain at least one line of code written during a Claude Code session. The system uses conservative matching: only code where there is high confidence in Claude Code's involvement is counted as assisted.

51 125 

52**users**: Number of active users in a given day (number on left Y-axis)126#### Attribution process

53 127 

54**spend**: Total dollars spent in a given day (number on right Y-axis)128When a pull request is merged:

55 129 

56### Team insights1301. Added lines are extracted from the PR diff

1312. Claude Code sessions that edited matching files within a time window are identified

1323. PR lines are matched against Claude Code output using multiple strategies

1334. Metrics are calculated for AI-assisted lines and total lines

57 134 

58**Members**: All users who have authenticated to Claude Code135Before comparison, lines are normalized: whitespace is trimmed, multiple spaces are collapsed, quotes are standardized, and text is converted to lowercase.

59 136 

60* API key users are displayed by **API key identifier**137Merged pull requests containing Claude Code-assisted lines are labeled as `claude-code-assisted` in GitHub.

61* OAuth users are displayed by **email address**

62 138 

63**Spend this month:** Per-user total spend for the current month.139#### Time window

64 140 

65**Lines this month:** Per-user total of accepted code lines for the current month.141Sessions from 21 days before to 2 days after the PR merge date are considered for attribution matching.

66 142 

67## Using analytics effectively143#### Excluded files

68 144 

69### Monitor adoption145Certain files are automatically excluded from analysis because they are auto-generated:

70 146 

71Track team member status to identify:147* Lock files: package-lock.json, yarn.lock, Cargo.lock, and similar

148* Generated code: Protobuf outputs, build artifacts, minified files

149* Build directories: dist/, build/, node\_modules/, target/

150* Test fixtures: snapshots, cassettes, mock data

151* Lines over 1,000 characters, which are likely minified or generated

152 

153#### Attribution notes

154 

155Keep these additional details in mind when interpreting attribution data:

156 

157* Code substantially rewritten by developers, with more than 20% difference, is not attributed to Claude Code

158* Sessions outside the 21-day window are not considered

159* The algorithm does not consider the PR source or destination branch when performing attribution

160 

161### Get the most from analytics

162 

163Use contribution metrics to demonstrate ROI, identify adoption patterns, and find team members who can help others get started.

164 

165#### Monitor adoption

166 

167Track the Adoption chart and user counts to identify:

72 168 

73* Active users who can share best practices169* Active users who can share best practices

74* Overall adoption trends across your organization170* Overall adoption trends across your organization

171* Dips in usage that may indicate friction or issues

172 

173#### Measure ROI

174 

175Contribution metrics help answer "Is this tool worth the investment?" with data from your own codebase:

176 

177* Track changes in PRs per user over time as adoption increases

178* Compare PRs and lines of code shipped with vs. without Claude Code

179* Use alongside [DORA metrics](https://dora.dev/), sprint velocity, or other engineering KPIs to understand changes from adopting Claude Code

180 

181#### Identify power users

182 

183The Leaderboard helps you find team members with high Claude Code adoption who can:

184 

185* Share prompting techniques and workflows with the team

186* Provide feedback on what's working well

187* Help onboard new users

75 188 

76### Measure productivity189#### Access data programmatically

77 190 

78Tool acceptance rates and code metrics help you:191To query this data through GitHub, search for PRs labeled with `claude-code-assisted`.

79 192 

80* Understand developer satisfaction with Claude Code suggestions193## Access analytics for API customers

81* Track code generation effectiveness194 

82* Identify opportunities for training or process improvements195API customers using the Claude Console can access analytics at [platform.claude.com/claude-code](https://platform.claude.com/claude-code). You need the UsageView permission to access the dashboard, which is granted to Developer, Billing, Admin, Owner, and Primary Owner roles.

196 

197<Note>

198 Contribution metrics with GitHub integration are not currently available for API customers. The Console dashboard shows usage and spend metrics only.

199</Note>

200 

201The Console dashboard displays:

202 

203* **Lines of code accepted**: total lines of code written by Claude Code that users have accepted in their sessions. This excludes rejected suggestions and does not track subsequent deletions.

204* **Suggestion accept rate**: percentage of times users accept code editing tool usage, including Edit, Write, and NotebookEdit tools.

205* **Activity**: daily active users and sessions shown on a chart.

206* **Spend**: daily API costs in dollars alongside user count.

207 

208### View team insights

209 

210The team insights table shows per-user metrics:

211 

212* **Members**: all users who have authenticated to Claude Code. API key users display by key identifier, OAuth users display by email address.

213* **Spend this month**: per-user total API costs for the current month.

214* **Lines this month**: per-user total of accepted code lines for the current month.

215 

216<Note>

217 Spend figures in the Console dashboard are estimates for analytics purposes. For actual costs, refer to your billing page.

218</Note>

83 219 

84## Related resources220## Related resources

85 221 

86* [Monitoring usage with OpenTelemetry](/en/docs/claude-code/monitoring-usage) for custom metrics and alerting222* [Monitoring with OpenTelemetry](/en/monitoring-usage): export real-time metrics and events to your observability stack

87* [Identity and access management](/en/docs/claude-code/iam) for role configuration223* [Manage costs effectively](/en/costs): set spend limits and optimize token usage

224* [Permissions](/en/permissions): configure roles and permissions

authentication.md +117 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Authentication

6 

7> Log in to Claude Code and configure authentication for individuals, teams, and organizations.

8 

9Claude Code supports multiple authentication methods depending on your setup. Individual users can log in with a Claude.ai account, while teams can use Claude for Teams or Enterprise, the Claude Console, or a cloud provider like Amazon Bedrock, Google Vertex AI, or Microsoft Foundry.

10 

11## Log in to Claude Code

12 

13After [installing Claude Code](/en/setup#install-claude-code), run `claude` in your terminal. On first launch, Claude Code opens a browser window for you to log in.

14 

15If the browser doesn't open automatically, press `c` to copy the login URL to your clipboard, then paste it into your browser.

16 

17You can authenticate with any of these account types:

18 

19* **Claude Pro or Max subscription**: log in with your Claude.ai account. Subscribe at [claude.com/pricing](https://claude.com/pricing).

20* **Claude for Teams or Enterprise**: log in with the Claude.ai account your team admin invited you to.

21* **Claude Console**: log in with your Console credentials. Your admin must have [invited you](#claude-console-authentication) first.

22* **Cloud providers**: if your organization uses [Amazon Bedrock](/en/amazon-bedrock), [Google Vertex AI](/en/google-vertex-ai), or [Microsoft Foundry](/en/microsoft-foundry), set the required environment variables before running `claude`. No browser login is needed.

23 

24To log out and re-authenticate, type `/logout` at the Claude Code prompt.

25 

26If you're having trouble logging in, see [authentication troubleshooting](/en/troubleshooting#authentication-issues).

27 

28## Set up team authentication

29 

30For teams and organizations, you can configure Claude Code access in one of these ways:

31 

32* [Claude for Teams or Enterprise](#claude-for-teams-or-enterprise), recommended for most teams

33* [Claude Console](#claude-console-authentication)

34* [Amazon Bedrock](/en/amazon-bedrock)

35* [Google Vertex AI](/en/google-vertex-ai)

36* [Microsoft Foundry](/en/microsoft-foundry)

37 

38### Claude for Teams or Enterprise

39 

40[Claude for Teams](https://claude.com/pricing#team-&-enterprise) and [Claude for Enterprise](https://anthropic.com/contact-sales) provide the best experience for organizations using Claude Code. Team members get access to both Claude Code and Claude on the web with centralized billing and team management.

41 

42* **Claude for Teams**: self-service plan with collaboration features, admin tools, and billing management. Best for smaller teams.

43* **Claude for Enterprise**: adds SSO, domain capture, role-based permissions, compliance API, and managed policy settings for organization-wide Claude Code configurations. Best for larger organizations with security and compliance requirements.

44 

45<Steps>

46 <Step title="Subscribe">

47 Subscribe to [Claude for Teams](https://claude.com/pricing#team-&-enterprise) or contact sales for [Claude for Enterprise](https://anthropic.com/contact-sales).

48 </Step>

49 

50 <Step title="Invite team members">

51 Invite team members from the admin dashboard.

52 </Step>

53 

54 <Step title="Install and log in">

55 Team members install Claude Code and log in with their Claude.ai accounts.

56 </Step>

57</Steps>

58 

59### Claude Console authentication

60 

61For organizations that prefer API-based billing, you can set up access through the Claude Console.

62 

63<Steps>

64 <Step title="Create or use a Console account">

65 Use your existing Claude Console account or create a new one.

66 </Step>

67 

68 <Step title="Add users">

69 You can add users through either method:

70 

71 * Bulk invite users from within the Console: Settings -> Members -> Invite

72 * [Set up SSO](https://support.claude.com/en/articles/13132885-setting-up-single-sign-on-sso)

73 </Step>

74 

75 <Step title="Assign roles">

76 When inviting users, assign one of:

77 

78 * **Claude Code** role: users can only create Claude Code API keys

79 * **Developer** role: users can create any kind of API key

80 </Step>

81 

82 <Step title="Users complete setup">

83 Each invited user needs to:

84 

85 * Accept the Console invite

86 * [Check system requirements](/en/setup#system-requirements)

87 * [Install Claude Code](/en/setup#install-claude-code)

88 * Log in with Console account credentials

89 </Step>

90</Steps>

91 

92### Cloud provider authentication

93 

94For teams using Amazon Bedrock, Google Vertex AI, or Microsoft Foundry:

95 

96<Steps>

97 <Step title="Follow provider setup">

98 Follow the [Bedrock docs](/en/amazon-bedrock), [Vertex docs](/en/google-vertex-ai), or [Microsoft Foundry docs](/en/microsoft-foundry).

99 </Step>

100 

101 <Step title="Distribute configuration">

102 Distribute the environment variables and instructions for generating cloud credentials to your users. Read more about how to [manage configuration here](/en/settings).

103 </Step>

104 

105 <Step title="Install Claude Code">

106 Users can [install Claude Code](/en/setup#install-claude-code).

107 </Step>

108</Steps>

109 

110## Credential management

111 

112Claude Code securely manages your authentication credentials:

113 

114* **Storage location**: on macOS, credentials are stored in the encrypted macOS Keychain.

115* **Supported authentication types**: Claude.ai credentials, Claude API credentials, Azure Auth, Bedrock Auth, and Vertex Auth.

116* **Custom credential scripts**: the [`apiKeyHelper`](/en/settings#available-settings) setting can be configured to run a shell script that returns an API key.

117* **Refresh intervals**: by default, `apiKeyHelper` is called after 5 minutes or on HTTP 401 response. Set `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` environment variable for custom refresh intervals.

best-practices.md +599 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Best Practices for Claude Code

6 

7> Tips and patterns for getting the most out of Claude Code, from configuring your environment to scaling across parallel sessions.

8 

9Claude Code is an agentic coding environment. Unlike a chatbot that answers questions and waits, Claude Code can read your files, run commands, make changes, and autonomously work through problems while you watch, redirect, or step away entirely.

10 

11This changes how you work. Instead of writing code yourself and asking Claude to review it, you describe what you want and Claude figures out how to build it. Claude explores, plans, and implements.

12 

13But this autonomy still comes with a learning curve. Claude works within certain constraints you need to understand.

14 

15This guide covers patterns that have proven effective across Anthropic's internal teams and for engineers using Claude Code across various codebases, languages, and environments. For how the agentic loop works under the hood, see [How Claude Code works](/en/how-claude-code-works).

16 

17***

18 

19Most best practices are based on one constraint: Claude's context window fills up fast, and performance degrades as it fills.

20 

21Claude's context window holds your entire conversation, including every message, every file Claude reads, and every command output. However, this can fill up fast. A single debugging session or codebase exploration might generate and consume tens of thousands of tokens.

22 

23This matters since LLM performance degrades as context fills. When the context window is getting full, Claude may start "forgetting" earlier instructions or making more mistakes. The context window is the most important resource to manage. Track context usage continuously with a [custom status line](/en/statusline), and see [Reduce token usage](/en/costs#reduce-token-usage) for strategies on reducing token usage.

24 

25***

26 

27## Give Claude a way to verify its work

28 

29<Tip>

30 Include tests, screenshots, or expected outputs so Claude can check itself. This is the single highest-leverage thing you can do.

31</Tip>

32 

33Claude performs dramatically better when it can verify its own work, like run tests, compare screenshots, and validate outputs.

34 

35Without clear success criteria, it might produce something that looks right but actually doesn't work. You become the only feedback loop, and every mistake requires your attention.

36 

37| Strategy | Before | After |

38| ------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

39| **Provide verification criteria** | *"implement a function that validates email addresses"* | *"write a validateEmail function. example test cases: [user@example.com](mailto:user@example.com) is true, invalid is false, [user@.com](mailto:user@.com) is false. run the tests after implementing"* |

40| **Verify UI changes visually** | *"make the dashboard look better"* | *"\[paste screenshot] implement this design. take a screenshot of the result and compare it to the original. list differences and fix them"* |

41| **Address root causes, not symptoms** | *"the build is failing"* | *"the build fails with this error: \[paste error]. fix it and verify the build succeeds. address the root cause, don't suppress the error"* |

42 

43UI changes can be verified using the [Claude in Chrome extension](/en/chrome). It opens new tabs in your browser, tests the UI, and iterates until the code works.

44 

45Your verification can also be a test suite, a linter, or a Bash command that checks output. Invest in making your verification rock-solid.

46 

47***

48 

49## Explore first, then plan, then code

50 

51<Tip>

52 Separate research and planning from implementation to avoid solving the wrong problem.

53</Tip>

54 

55Letting Claude jump straight to coding can produce code that solves the wrong problem. Use [Plan Mode](/en/common-workflows#use-plan-mode-for-safe-code-analysis) to separate exploration from execution.

56 

57The recommended workflow has four phases:

58 

59<Steps>

60 <Step title="Explore">

61 Enter Plan Mode. Claude reads files and answers questions without making changes.

62 

63 ```txt claude (Plan Mode) theme={null}

64 read /src/auth and understand how we handle sessions and login.

65 also look at how we manage environment variables for secrets.

66 ```

67 </Step>

68 

69 <Step title="Plan">

70 Ask Claude to create a detailed implementation plan.

71 

72 ```txt claude (Plan Mode) theme={null}

73 I want to add Google OAuth. What files need to change?

74 What's the session flow? Create a plan.

75 ```

76 

77 Press `Ctrl+G` to open the plan in your text editor for direct editing before Claude proceeds.

78 </Step>

79 

80 <Step title="Implement">

81 Switch back to Normal Mode and let Claude code, verifying against its plan.

82 

83 ```txt claude (Normal Mode) theme={null}

84 implement the OAuth flow from your plan. write tests for the

85 callback handler, run the test suite and fix any failures.

86 ```

87 </Step>

88 

89 <Step title="Commit">

90 Ask Claude to commit with a descriptive message and create a PR.

91 

92 ```txt claude (Normal Mode) theme={null}

93 commit with a descriptive message and open a PR

94 ```

95 </Step>

96</Steps>

97 

98<Callout>

99 Plan Mode is useful, but also adds overhead.

100 

101 For tasks where the scope is clear and the fix is small (like fixing a typo, adding a log line, or renaming a variable) ask Claude to do it directly.

102 

103 Planning is most useful when you're uncertain about the approach, when the change modifies multiple files, or when you're unfamiliar with the code being modified. If you could describe the diff in one sentence, skip the plan.

104</Callout>

105 

106***

107 

108## Provide specific context in your prompts

109 

110<Tip>

111 The more precise your instructions, the fewer corrections you'll need.

112</Tip>

113 

114Claude can infer intent, but it can't read your mind. Reference specific files, mention constraints, and point to example patterns.

115 

116| Strategy | Before | After |

117| ------------------------------------------------------------------------------------------------ | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

118| **Scope the task.** Specify which file, what scenario, and testing preferences. | *"add tests for foo.py"* | *"write a test for foo.py covering the edge case where the user is logged out. avoid mocks."* |

119| **Point to sources.** Direct Claude to the source that can answer a question. | *"why does ExecutionFactory have such a weird api?"* | *"look through ExecutionFactory's git history and summarize how its api came to be"* |

120| **Reference existing patterns.** Point Claude to patterns in your codebase. | *"add a calendar widget"* | *"look at how existing widgets are implemented on the home page to understand the patterns. HotDogWidget.php is a good example. follow the pattern to implement a new calendar widget that lets the user select a month and paginate forwards/backwards to pick a year. build from scratch without libraries other than the ones already used in the codebase."* |

121| **Describe the symptom.** Provide the symptom, the likely location, and what "fixed" looks like. | *"fix the login bug"* | *"users report that login fails after session timeout. check the auth flow in src/auth/, especially token refresh. write a failing test that reproduces the issue, then fix it"* |

122 

123Vague prompts can be useful when you're exploring and can afford to course-correct. A prompt like `"what would you improve in this file?"` can surface things you wouldn't have thought to ask about.

124 

125### Provide rich content

126 

127<Tip>

128 Use `@` to reference files, paste screenshots/images, or pipe data directly.

129</Tip>

130 

131You can provide rich data to Claude in several ways:

132 

133* **Reference files with `@`** instead of describing where code lives. Claude reads the file before responding.

134* **Paste images directly**. Copy/paste or drag and drop images into the prompt.

135* **Give URLs** for documentation and API references. Use `/permissions` to allowlist frequently-used domains.

136* **Pipe in data** by running `cat error.log | claude` to send file contents directly.

137* **Let Claude fetch what it needs**. Tell Claude to pull context itself using Bash commands, MCP tools, or by reading files.

138 

139***

140 

141## Configure your environment

142 

143A few setup steps make Claude Code significantly more effective across all your sessions. For a full overview of extension features and when to use each one, see [Extend Claude Code](/en/features-overview).

144 

145### Write an effective CLAUDE.md

146 

147<Tip>

148 Run `/init` to generate a starter CLAUDE.md file based on your current project structure, then refine over time.

149</Tip>

150 

151CLAUDE.md is a special file that Claude reads at the start of every conversation. Include Bash commands, code style, and workflow rules. This gives Claude persistent context **it can't infer from code alone**.

152 

153The `/init` command analyzes your codebase to detect build systems, test frameworks, and code patterns, giving you a solid foundation to refine.

154 

155There's no required format for CLAUDE.md files, but keep it short and human-readable. For example:

156 

157```markdown CLAUDE.md theme={null}

158# Code style

159- Use ES modules (import/export) syntax, not CommonJS (require)

160- Destructure imports when possible (eg. import { foo } from 'bar')

161 

162# Workflow

163- Be sure to typecheck when you're done making a series of code changes

164- Prefer running single tests, and not the whole test suite, for performance

165```

166 

167CLAUDE.md is loaded every session, so only include things that apply broadly. For domain knowledge or workflows that are only relevant sometimes, use [skills](/en/skills) instead. Claude loads them on demand without bloating every conversation.

168 

169Keep it concise. For each line, ask: *"Would removing this cause Claude to make mistakes?"* If not, cut it. Bloated CLAUDE.md files cause Claude to ignore your actual instructions!

170 

171| ✅ Include | ❌ Exclude |

172| ---------------------------------------------------- | -------------------------------------------------- |

173| Bash commands Claude can't guess | Anything Claude can figure out by reading code |

174| Code style rules that differ from defaults | Standard language conventions Claude already knows |

175| Testing instructions and preferred test runners | Detailed API documentation (link to docs instead) |

176| Repository etiquette (branch naming, PR conventions) | Information that changes frequently |

177| Architectural decisions specific to your project | Long explanations or tutorials |

178| Developer environment quirks (required env vars) | File-by-file descriptions of the codebase |

179| Common gotchas or non-obvious behaviors | Self-evident practices like "write clean code" |

180 

181If Claude keeps doing something you don't want despite having a rule against it, the file is probably too long and the rule is getting lost. If Claude asks you questions that are answered in CLAUDE.md, the phrasing might be ambiguous. Treat CLAUDE.md like code: review it when things go wrong, prune it regularly, and test changes by observing whether Claude's behavior actually shifts.

182 

183You can tune instructions by adding emphasis (e.g., "IMPORTANT" or "YOU MUST") to improve adherence. Check CLAUDE.md into git so your team can contribute. The file compounds in value over time.

184 

185CLAUDE.md files can import additional files using `@path/to/import` syntax:

186 

187```markdown CLAUDE.md theme={null}

188See @README.md for project overview and @package.json for available npm commands.

189 

190# Additional Instructions

191- Git workflow: @docs/git-instructions.md

192- Personal overrides: @~/.claude/my-project-instructions.md

193```

194 

195You can place CLAUDE.md files in several locations:

196 

197* **Home folder (`~/.claude/CLAUDE.md`)**: Applies to all Claude sessions

198* **Project root (`./CLAUDE.md`)**: Check into git to share with your team, or name it `CLAUDE.local.md` and `.gitignore` it

199* **Parent directories**: Useful for monorepos where both `root/CLAUDE.md` and `root/foo/CLAUDE.md` are pulled in automatically

200* **Child directories**: Claude pulls in child CLAUDE.md files on demand when working with files in those directories

201 

202### Configure permissions

203 

204<Tip>

205 Use `/permissions` to allowlist safe commands or `/sandbox` for OS-level isolation. This reduces interruptions while keeping you in control.

206</Tip>

207 

208By default, Claude Code requests permission for actions that might modify your system: file writes, Bash commands, MCP tools, etc. This is safe but tedious. After the tenth approval you're not really reviewing anymore, you're just clicking through. There are two ways to reduce these interruptions:

209 

210* **Permission allowlists**: Permit specific tools you know are safe (like `npm run lint` or `git commit`)

211* **Sandboxing**: Enable OS-level isolation that restricts filesystem and network access, allowing Claude to work more freely within defined boundaries

212 

213Alternatively, use `--dangerously-skip-permissions` to bypass all permission checks for contained workflows like fixing lint errors or generating boilerplate.

214 

215<Warning>

216 Letting Claude run arbitrary commands can result in data loss, system corruption, or data exfiltration via prompt injection. Only use `--dangerously-skip-permissions` in a sandbox without internet access.

217</Warning>

218 

219Read more about [configuring permissions](/en/settings) and [enabling sandboxing](/en/sandboxing#sandboxing).

220 

221### Use CLI tools

222 

223<Tip>

224 Tell Claude Code to use CLI tools like `gh`, `aws`, `gcloud`, and `sentry-cli` when interacting with external services.

225</Tip>

226 

227CLI tools are the most context-efficient way to interact with external services. If you use GitHub, install the `gh` CLI. Claude knows how to use it for creating issues, opening pull requests, and reading comments. Without `gh`, Claude can still use the GitHub API, but unauthenticated requests often hit rate limits.

228 

229Claude is also effective at learning CLI tools it doesn't already know. Try prompts like `Use 'foo-cli-tool --help' to learn about foo tool, then use it to solve A, B, C.`

230 

231### Connect MCP servers

232 

233<Tip>

234 Run `claude mcp add` to connect external tools like Notion, Figma, or your database.

235</Tip>

236 

237With [MCP servers](/en/mcp), you can ask Claude to implement features from issue trackers, query databases, analyze monitoring data, integrate designs from Figma, and automate workflows.

238 

239### Set up hooks

240 

241<Tip>

242 Use hooks for actions that must happen every time with zero exceptions.

243</Tip>

244 

245[Hooks](/en/hooks-guide) run scripts automatically at specific points in Claude's workflow. Unlike CLAUDE.md instructions which are advisory, hooks are deterministic and guarantee the action happens.

246 

247Claude can write hooks for you. Try prompts like *"Write a hook that runs eslint after every file edit"* or *"Write a hook that blocks writes to the migrations folder."* Run `/hooks` for interactive configuration, or edit `.claude/settings.json` directly.

248 

249### Create skills

250 

251<Tip>

252 Create `SKILL.md` files in `.claude/skills/` to give Claude domain knowledge and reusable workflows.

253</Tip>

254 

255[Skills](/en/skills) extend Claude's knowledge with information specific to your project, team, or domain. Claude applies them automatically when relevant, or you can invoke them directly with `/skill-name`.

256 

257Create a skill by adding a directory with a `SKILL.md` to `.claude/skills/`:

258 

259```markdown .claude/skills/api-conventions/SKILL.md theme={null}

260---

261name: api-conventions

262description: REST API design conventions for our services

263---

264# API Conventions

265- Use kebab-case for URL paths

266- Use camelCase for JSON properties

267- Always include pagination for list endpoints

268- Version APIs in the URL path (/v1/, /v2/)

269```

270 

271Skills can also define repeatable workflows you invoke directly:

272 

273```markdown .claude/skills/fix-issue/SKILL.md theme={null}

274---

275name: fix-issue

276description: Fix a GitHub issue

277disable-model-invocation: true

278---

279Analyze and fix the GitHub issue: $ARGUMENTS.

280 

2811. Use `gh issue view` to get the issue details

2822. Understand the problem described in the issue

2833. Search the codebase for relevant files

2844. Implement the necessary changes to fix the issue

2855. Write and run tests to verify the fix

2866. Ensure code passes linting and type checking

2877. Create a descriptive commit message

2888. Push and create a PR

289```

290 

291Run `/fix-issue 1234` to invoke it. Use `disable-model-invocation: true` for workflows with side effects that you want to trigger manually.

292 

293### Create custom subagents

294 

295<Tip>

296 Define specialized assistants in `.claude/agents/` that Claude can delegate to for isolated tasks.

297</Tip>

298 

299[Subagents](/en/sub-agents) run in their own context with their own set of allowed tools. They're useful for tasks that read many files or need specialized focus without cluttering your main conversation.

300 

301```markdown .claude/agents/security-reviewer.md theme={null}

302---

303name: security-reviewer

304description: Reviews code for security vulnerabilities

305tools: Read, Grep, Glob, Bash

306model: opus

307---

308You are a senior security engineer. Review code for:

309- Injection vulnerabilities (SQL, XSS, command injection)

310- Authentication and authorization flaws

311- Secrets or credentials in code

312- Insecure data handling

313 

314Provide specific line references and suggested fixes.

315```

316 

317Tell Claude to use subagents explicitly: *"Use a subagent to review this code for security issues."*

318 

319### Install plugins

320 

321<Tip>

322 Run `/plugin` to browse the marketplace. Plugins add skills, tools, and integrations without configuration.

323</Tip>

324 

325[Plugins](/en/plugins) bundle skills, hooks, subagents, and MCP servers into a single installable unit from the community and Anthropic. If you work with a typed language, install a [code intelligence plugin](/en/discover-plugins#code-intelligence) to give Claude precise symbol navigation and automatic error detection after edits.

326 

327For guidance on choosing between skills, subagents, hooks, and MCP, see [Extend Claude Code](/en/features-overview#match-features-to-your-goal).

328 

329***

330 

331## Communicate effectively

332 

333The way you communicate with Claude Code significantly impacts the quality of results.

334 

335### Ask codebase questions

336 

337<Tip>

338 Ask Claude questions you'd ask a senior engineer.

339</Tip>

340 

341When onboarding to a new codebase, use Claude Code for learning and exploration. You can ask Claude the same sorts of questions you would ask another engineer:

342 

343* How does logging work?

344* How do I make a new API endpoint?

345* What does `async move { ... }` do on line 134 of `foo.rs`?

346* What edge cases does `CustomerOnboardingFlowImpl` handle?

347* Why does this code call `foo()` instead of `bar()` on line 333?

348 

349Using Claude Code this way is an effective onboarding workflow, improving ramp-up time and reducing load on other engineers. No special prompting required: ask questions directly.

350 

351### Let Claude interview you

352 

353<Tip>

354 For larger features, have Claude interview you first. Start with a minimal prompt and ask Claude to interview you using the `AskUserQuestion` tool.

355</Tip>

356 

357Claude asks about things you might not have considered yet, including technical implementation, UI/UX, edge cases, and tradeoffs.

358 

359```

360I want to build [brief description]. Interview me in detail using the AskUserQuestion tool.

361 

362Ask about technical implementation, UI/UX, edge cases, concerns, and tradeoffs. Don't ask obvious questions, dig into the hard parts I might not have considered.

363 

364Keep interviewing until we've covered everything, then write a complete spec to SPEC.md.

365```

366 

367Once the spec is complete, start a fresh session to execute it. The new session has clean context focused entirely on implementation, and you have a written spec to reference.

368 

369***

370 

371## Manage your session

372 

373Conversations are persistent and reversible. Use this to your advantage!

374 

375### Course-correct early and often

376 

377<Tip>

378 Correct Claude as soon as you notice it going off track.

379</Tip>

380 

381The best results come from tight feedback loops. Though Claude occasionally solves problems perfectly on the first attempt, correcting it quickly generally produces better solutions faster.

382 

383* **`Esc`**: Stop Claude mid-action with the `Esc` key. Context is preserved, so you can redirect.

384* **`Esc + Esc` or `/rewind`**: Press `Esc` twice or run `/rewind` to open the rewind menu and restore previous conversation and code state, or summarize from a selected message.

385* **`"Undo that"`**: Have Claude revert its changes.

386* **`/clear`**: Reset context between unrelated tasks. Long sessions with irrelevant context can reduce performance.

387 

388If you've corrected Claude more than twice on the same issue in one session, the context is cluttered with failed approaches. Run `/clear` and start fresh with a more specific prompt that incorporates what you learned. A clean session with a better prompt almost always outperforms a long session with accumulated corrections.

389 

390### Manage context aggressively

391 

392<Tip>

393 Run `/clear` between unrelated tasks to reset context.

394</Tip>

395 

396Claude Code automatically compacts conversation history when you approach context limits, which preserves important code and decisions while freeing space.

397 

398During long sessions, Claude's context window can fill with irrelevant conversation, file contents, and commands. This can reduce performance and sometimes distract Claude.

399 

400* Use `/clear` frequently between tasks to reset the context window entirely

401* When auto compaction triggers, Claude summarizes what matters most, including code patterns, file states, and key decisions

402* For more control, run `/compact <instructions>`, like `/compact Focus on the API changes`

403* To compact only part of the conversation, use `Esc + Esc` or `/rewind`, select a message checkpoint, and choose **Summarize from here**. This condenses messages from that point forward while keeping earlier context intact.

404* Customize compaction behavior in CLAUDE.md with instructions like `"When compacting, always preserve the full list of modified files and any test commands"` to ensure critical context survives summarization

405 

406### Use subagents for investigation

407 

408<Tip>

409 Delegate research with `"use subagents to investigate X"`. They explore in a separate context, keeping your main conversation clean for implementation.

410</Tip>

411 

412Since context is your fundamental constraint, subagents are one of the most powerful tools available. When Claude researches a codebase it reads lots of files, all of which consume your context. Subagents run in separate context windows and report back summaries:

413 

414```

415Use subagents to investigate how our authentication system handles token

416refresh, and whether we have any existing OAuth utilities I should reuse.

417```

418 

419The subagent explores the codebase, reads relevant files, and reports back with findings, all without cluttering your main conversation.

420 

421You can also use subagents for verification after Claude implements something:

422 

423```

424use a subagent to review this code for edge cases

425```

426 

427### Rewind with checkpoints

428 

429<Tip>

430 Every action Claude makes creates a checkpoint. You can restore conversation, code, or both to any previous checkpoint.

431</Tip>

432 

433Claude automatically checkpoints before changes. Double-tap `Escape` or run `/rewind` to open the rewind menu. You can restore conversation only, restore code only, restore both, or summarize from a selected message. See [Checkpointing](/en/checkpointing) for details.

434 

435Instead of carefully planning every move, you can tell Claude to try something risky. If it doesn't work, rewind and try a different approach. Checkpoints persist across sessions, so you can close your terminal and still rewind later.

436 

437<Warning>

438 Checkpoints only track changes made *by Claude*, not external processes. This isn't a replacement for git.

439</Warning>

440 

441### Resume conversations

442 

443<Tip>

444 Run `claude --continue` to pick up where you left off, or `--resume` to choose from recent sessions.

445</Tip>

446 

447Claude Code saves conversations locally. When a task spans multiple sessions (you start a feature, get interrupted, come back the next day) you don't have to re-explain the context:

448 

449```bash theme={null}

450claude --continue # Resume the most recent conversation

451claude --resume # Select from recent conversations

452```

453 

454Use `/rename` to give sessions descriptive names (`"oauth-migration"`, `"debugging-memory-leak"`) so you can find them later. Treat sessions like branches. Different workstreams can have separate, persistent contexts.

455 

456***

457 

458## Automate and scale

459 

460Once you're effective with one Claude, multiply your output with parallel sessions, headless mode, and fan-out patterns.

461 

462Everything so far assumes one human, one Claude, and one conversation. But Claude Code scales horizontally. The techniques in this section show how you can get more done.

463 

464### Run headless mode

465 

466<Tip>

467 Use `claude -p "prompt"` in CI, pre-commit hooks, or scripts. Add `--output-format stream-json` for streaming JSON output.

468</Tip>

469 

470With `claude -p "your prompt"`, you can run Claude headlessly, without an interactive session. Headless mode is how you integrate Claude into CI pipelines, pre-commit hooks, or any automated workflow. The output formats (plain text, JSON, streaming JSON) let you parse results programmatically.

471 

472```bash theme={null}

473# One-off queries

474claude -p "Explain what this project does"

475 

476# Structured output for scripts

477claude -p "List all API endpoints" --output-format json

478 

479# Streaming for real-time processing

480claude -p "Analyze this log file" --output-format stream-json

481```

482 

483### Run multiple Claude sessions

484 

485<Tip>

486 Run multiple Claude sessions in parallel to speed up development, run isolated experiments, or start complex workflows.

487</Tip>

488 

489There are three main ways to run parallel sessions:

490 

491* [Claude Code desktop app](/en/desktop#work-in-parallel-with-sessions): Manage multiple local sessions visually. Each session gets its own isolated worktree.

492* [Claude Code on the web](/en/claude-code-on-the-web): Run on Anthropic's secure cloud infrastructure in isolated VMs.

493* [Agent teams](/en/agent-teams): Automated coordination of multiple sessions with shared tasks, messaging, and a team lead.

494 

495Beyond parallelizing work, multiple sessions enable quality-focused workflows. A fresh context improves code review since Claude won't be biased toward code it just wrote.

496 

497For example, use a Writer/Reviewer pattern:

498 

499| Session A (Writer) | Session B (Reviewer) |

500| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

501| `Implement a rate limiter for our API endpoints` | |

502| | `Review the rate limiter implementation in @src/middleware/rateLimiter.ts. Look for edge cases, race conditions, and consistency with our existing middleware patterns.` |

503| `Here's the review feedback: [Session B output]. Address these issues.` | |

504 

505You can do something similar with tests: have one Claude write tests, then another write code to pass them.

506 

507### Fan out across files

508 

509<Tip>

510 Loop through tasks calling `claude -p` for each. Use `--allowedTools` to scope permissions for batch operations.

511</Tip>

512 

513For large migrations or analyses, you can distribute work across many parallel Claude invocations:

514 

515<Steps>

516 <Step title="Generate a task list">

517 Have Claude list all files that need migrating (e.g., `list all 2,000 Python files that need migrating`)

518 </Step>

519 

520 <Step title="Write a script to loop through the list">

521 ```bash theme={null}

522 for file in $(cat files.txt); do

523 claude -p "Migrate $file from React to Vue. Return OK or FAIL." \

524 --allowedTools "Edit,Bash(git commit *)"

525 done

526 ```

527 </Step>

528 

529 <Step title="Test on a few files, then run at scale">

530 Refine your prompt based on what goes wrong with the first 2-3 files, then run on the full set. The `--allowedTools` flag restricts what Claude can do, which matters when you're running unattended.

531 </Step>

532</Steps>

533 

534You can also integrate Claude into existing data/processing pipelines:

535 

536```bash theme={null}

537claude -p "<your prompt>" --output-format json | your_command

538```

539 

540Use `--verbose` for debugging during development, and turn it off in production.

541 

542### Safe Autonomous Mode

543 

544Use `claude --dangerously-skip-permissions` to bypass all permission checks and let Claude work uninterrupted. This works well for workflows like fixing lint errors or generating boilerplate code.

545 

546<Warning>

547 Letting Claude run arbitrary commands is risky and can result in data loss, system corruption, or data exfiltration (e.g., via prompt injection attacks). To minimize these risks, use `--dangerously-skip-permissions` in a container without internet access.

548 

549 With sandboxing enabled (`/sandbox`), you get similar autonomy with better security. Sandbox defines upfront boundaries rather than bypassing all checks.

550</Warning>

551 

552***

553 

554## Avoid common failure patterns

555 

556These are common mistakes. Recognizing them early saves time:

557 

558* **The kitchen sink session.** You start with one task, then ask Claude something unrelated, then go back to the first task. Context is full of irrelevant information.

559 > **Fix**: `/clear` between unrelated tasks.

560* **Correcting over and over.** Claude does something wrong, you correct it, it's still wrong, you correct again. Context is polluted with failed approaches.

561 > **Fix**: After two failed corrections, `/clear` and write a better initial prompt incorporating what you learned.

562* **The over-specified CLAUDE.md.** If your CLAUDE.md is too long, Claude ignores half of it because important rules get lost in the noise.

563 > **Fix**: Ruthlessly prune. If Claude already does something correctly without the instruction, delete it or convert it to a hook.

564* **The trust-then-verify gap.** Claude produces a plausible-looking implementation that doesn't handle edge cases.

565 > **Fix**: Always provide verification (tests, scripts, screenshots). If you can't verify it, don't ship it.

566* **The infinite exploration.** You ask Claude to "investigate" something without scoping it. Claude reads hundreds of files, filling the context.

567 > **Fix**: Scope investigations narrowly or use subagents so the exploration doesn't consume your main context.

568 

569***

570 

571## Develop your intuition

572 

573The patterns in this guide aren't set in stone. They're starting points that work well in general, but might not be optimal for every situation.

574 

575Sometimes you *should* let context accumulate because you're deep in one complex problem and the history is valuable. Sometimes you should skip planning and let Claude figure it out because the task is exploratory. Sometimes a vague prompt is exactly right because you want to see how Claude interprets the problem before constraining it.

576 

577Pay attention to what works. When Claude produces great output, notice what you did: the prompt structure, the context you provided, the mode you were in. When Claude struggles, ask why. Was the context too noisy? The prompt too vague? The task too big for one pass?

578 

579Over time, you'll develop intuition that no guide can capture. You'll know when to be specific and when to be open-ended, when to plan and when to explore, when to clear context and when to let it accumulate.

580 

581## Related resources

582 

583<CardGroup cols={2}>

584 <Card title="How Claude Code works" icon="gear" href="/en/how-claude-code-works">

585 Understand the agentic loop, tools, and context management

586 </Card>

587 

588 <Card title="Extend Claude Code" icon="puzzle-piece" href="/en/features-overview">

589 Choose between skills, hooks, MCP, subagents, and plugins

590 </Card>

591 

592 <Card title="Common workflows" icon="list-check" href="/en/common-workflows">

593 Step-by-step recipes for debugging, testing, PRs, and more

594 </Card>

595 

596 <Card title="CLAUDE.md" icon="file-lines" href="/en/memory">

597 Store project conventions and persistent context

598 </Card>

599</CardGroup>

checkpointing.md +36 −12

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Checkpointing5# Checkpointing

2 6 

3> Automatically track and rewind Claude's edits to quickly recover from unwanted changes.7> Track, rewind, and summarize Claude's edits and conversation to manage session state.

4 8 

5Claude Code automatically tracks Claude's file edits as you work, allowing you to quickly undo changes and rewind to previous states if anything gets off track.9Claude Code automatically tracks Claude's file edits as you work, allowing you to quickly undo changes and rewind to previous states if anything gets off track.

6 10 


16* Checkpoints persist across sessions, so you can access them in resumed conversations20* Checkpoints persist across sessions, so you can access them in resumed conversations

17* Automatically cleaned up along with sessions after 30 days (configurable)21* Automatically cleaned up along with sessions after 30 days (configurable)

18 22 

19### Rewinding changes23### Rewind and summarize

24 

25Press `Esc` twice (`Esc` + `Esc`) or use the `/rewind` command to open the rewind menu. A scrollable list shows each of your prompts from the session. Select the point you want to act on, then choose an action:

26 

27* **Restore code and conversation**: revert both code and conversation to that point

28* **Restore conversation**: rewind to that message while keeping current code

29* **Restore code**: revert file changes while keeping the conversation

30* **Summarize from here**: compress the conversation from this point forward into a summary, freeing context window space

31* **Never mind**: return to the message list without making changes

32 

33After restoring the conversation or summarizing, the original prompt from the selected message is restored into the input field so you can re-send or edit it.

34 

35#### Restore vs. summarize

36 

37The three restore options revert state: they undo code changes, conversation history, or both. "Summarize from here" works differently:

38 

39* Messages before the selected message stay intact

40* The selected message and all subsequent messages get replaced with a compact AI-generated summary

41* No files on disk are changed

42* The original messages are preserved in the session transcript, so Claude can reference the details if needed

20 43 

21Press `Esc` twice (`Esc` + `Esc`) or use the `/rewind` command to open up the rewind menu. You can choose to restore:44This is similar to `/compact`, but targeted: instead of summarizing the entire conversation, you keep early context in full detail and only compress the parts that are using up space. You can type optional instructions to guide what the summary focuses on.

22 45 

23* **Conversation only**: Rewind to a user message while keeping code changes46<Note>

24* **Code only**: Revert file changes while keeping the conversation47 Summarize keeps you in the same session and compresses context. If you want to branch off and try a different approach while preserving the original session intact, use [fork](/en/how-claude-code-works#resume-or-fork-sessions) instead (`claude --continue --fork-session`).

25* **Both code and conversation**: Restore both to a prior point in the session48</Note>

26 49 

27## Common use cases50## Common use cases

28 51 

29Checkpoints are particularly useful when:52Checkpoints are particularly useful when:

30 53 

31* **Exploring alternatives**: Try different implementation approaches without losing your starting point54* **Exploring alternatives**: try different implementation approaches without losing your starting point

32* **Recovering from mistakes**: Quickly undo changes that introduced bugs or broke functionality55* **Recovering from mistakes**: quickly undo changes that introduced bugs or broke functionality

33* **Iterating on features**: Experiment with variations knowing you can revert to working states56* **Iterating on features**: experiment with variations knowing you can revert to working states

57* **Freeing context space**: summarize a verbose debugging session from the midpoint forward, keeping your initial instructions intact

34 58 

35## Limitations59## Limitations

36 60 


60 84 

61## See also85## See also

62 86 

63* [Interactive mode](/en/docs/claude-code/interactive-mode) - Keyboard shortcuts and session controls87* [Interactive mode](/en/interactive-mode) - Keyboard shortcuts and session controls

64* [Slash commands](/en/docs/claude-code/slash-commands) - Accessing checkpoints using `/rewind`88* [Built-in commands](/en/interactive-mode#built-in-commands) - Accessing checkpoints using `/rewind`

65* [CLI reference](/en/docs/claude-code/cli-reference) - Command-line options89* [CLI reference](/en/cli-reference) - Command-line options

chrome.md +231 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Use Claude Code with Chrome (beta)

6 

7> Connect Claude Code to your Chrome browser to test web apps, debug with console logs, automate form filling, and extract data from web pages.

8 

9Claude Code integrates with the Claude in Chrome browser extension to give you browser automation capabilities from the CLI or the [VS Code extension](/en/vs-code#automate-browser-tasks-with-chrome). Build your code, then test and debug in the browser without switching contexts.

10 

11Claude opens new tabs for browser tasks and shares your browser's login state, so it can access any site you're already signed into. Browser actions run in a visible Chrome window in real time. When Claude encounters a login page or CAPTCHA, it pauses and asks you to handle it manually.

12 

13<Note>

14 Chrome integration is in beta and currently works with Google Chrome and Microsoft Edge. It is not yet supported on Brave, Arc, or other Chromium-based browsers. WSL (Windows Subsystem for Linux) is also not supported.

15</Note>

16 

17## Capabilities

18 

19With Chrome connected, you can chain browser actions with coding tasks in a single workflow:

20 

21* **Live debugging**: read console errors and DOM state directly, then fix the code that caused them

22* **Design verification**: build a UI from a Figma mock, then open it in the browser to verify it matches

23* **Web app testing**: test form validation, check for visual regressions, or verify user flows

24* **Authenticated web apps**: interact with Google Docs, Gmail, Notion, or any app you're logged into without API connectors

25* **Data extraction**: pull structured information from web pages and save it locally

26* **Task automation**: automate repetitive browser tasks like data entry, form filling, or multi-site workflows

27* **Session recording**: record browser interactions as GIFs to document or share what happened

28 

29## Prerequisites

30 

31Before using Claude Code with Chrome, you need:

32 

33* [Google Chrome](https://www.google.com/chrome/) or [Microsoft Edge](https://www.microsoft.com/edge) browser

34* [Claude in Chrome extension](https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn) version 1.0.36 or higher, available in the Chrome Web Store for both browsers

35* [Claude Code](/en/quickstart#step-1-install-claude-code) version 2.0.73 or higher

36* A direct Anthropic plan (Pro, Max, Teams, or Enterprise)

37 

38<Note>

39 Chrome integration is not available through third-party providers like Amazon Bedrock, Google Cloud Vertex AI, or Microsoft Foundry. If you access Claude exclusively through a third-party provider, you need a separate claude.ai account to use this feature.

40</Note>

41 

42## Get started in the CLI

43 

44<Steps>

45 <Step title="Launch Claude Code with Chrome">

46 Start Claude Code with the `--chrome` flag:

47 

48 ```bash theme={null}

49 claude --chrome

50 ```

51 

52 You can also enable Chrome from within an existing session by running `/chrome`.

53 </Step>

54 

55 <Step title="Ask Claude to use the browser">

56 This example navigates to a page, interacts with it, and reports what it finds, all from your terminal or editor:

57 

58 ```text theme={null}

59 Go to code.claude.com/docs, click on the search box,

60 type "hooks", and tell me what results appear

61 ```

62 </Step>

63</Steps>

64 

65Run `/chrome` at any time to check the connection status, manage permissions, or reconnect the extension.

66 

67For VS Code, see [browser automation in VS Code](/en/vs-code#automate-browser-tasks-with-chrome).

68 

69### Enable Chrome by default

70 

71To avoid passing `--chrome` each session, run `/chrome` and select "Enabled by default".

72 

73In the [VS Code extension](/en/vs-code#automate-browser-tasks-with-chrome), Chrome is available whenever the Chrome extension is installed. No additional flag is needed.

74 

75<Note>

76 Enabling Chrome by default in the CLI increases context usage since browser tools are always loaded. If you notice increased context consumption, disable this setting and use `--chrome` only when needed.

77</Note>

78 

79### Manage site permissions

80 

81Site-level permissions are inherited from the Chrome extension. Manage permissions in the Chrome extension settings to control which sites Claude can browse, click, and type on.

82 

83## Example workflows

84 

85These examples show common ways to combine browser actions with coding tasks. Run `/mcp` and select `claude-in-chrome` to see the full list of available browser tools.

86 

87### Test a local web application

88 

89When developing a web app, ask Claude to verify your changes work correctly:

90 

91```text theme={null}

92I just updated the login form validation. Can you open localhost:3000,

93try submitting the form with invalid data, and check if the error

94messages appear correctly?

95```

96 

97Claude navigates to your local server, interacts with the form, and reports what it observes.

98 

99### Debug with console logs

100 

101Claude can read console output to help diagnose problems. Tell Claude what patterns to look for rather than asking for all console output, since logs can be verbose:

102 

103```text theme={null}

104Open the dashboard page and check the console for any errors when

105the page loads.

106```

107 

108Claude reads the console messages and can filter for specific patterns or error types.

109 

110### Automate form filling

111 

112Speed up repetitive data entry tasks:

113 

114```text theme={null}

115I have a spreadsheet of customer contacts in contacts.csv. For each row,

116go to the CRM at crm.example.com, click "Add Contact", and fill in the

117name, email, and phone fields.

118```

119 

120Claude reads your local file, navigates the web interface, and enters the data for each record.

121 

122### Draft content in Google Docs

123 

124Use Claude to write directly in your documents without API setup:

125 

126```text theme={null}

127Draft a project update based on the recent commits and add it to my

128Google Doc at docs.google.com/document/d/abc123

129```

130 

131Claude opens the document, clicks into the editor, and types the content. This works with any web app you're logged into: Gmail, Notion, Sheets, and more.

132 

133### Extract data from web pages

134 

135Pull structured information from websites:

136 

137```text theme={null}

138Go to the product listings page and extract the name, price, and

139availability for each item. Save the results as a CSV file.

140```

141 

142Claude navigates to the page, reads the content, and compiles the data into a structured format.

143 

144### Run multi-site workflows

145 

146Coordinate tasks across multiple websites:

147 

148```text theme={null}

149Check my calendar for meetings tomorrow, then for each meeting with

150an external attendee, look up their company website and add a note

151about what they do.

152```

153 

154Claude works across tabs to gather information and complete the workflow.

155 

156### Record a demo GIF

157 

158Create shareable recordings of browser interactions:

159 

160```text theme={null}

161Record a GIF showing how to complete the checkout flow, from adding

162an item to the cart through to the confirmation page.

163```

164 

165Claude records the interaction sequence and saves it as a GIF file.

166 

167## Troubleshooting

168 

169### Extension not detected

170 

171If Claude Code shows "Chrome extension not detected":

172 

1731. Verify the Chrome extension is installed and enabled in `chrome://extensions`

1742. Verify Claude Code is up to date by running `claude --version`

1753. Check that Chrome is running

1764. Run `/chrome` and select "Reconnect extension" to re-establish the connection

1775. If the issue persists, restart both Claude Code and Chrome

178 

179The first time you enable Chrome integration, Claude Code installs a native messaging host configuration file. Chrome reads this file on startup, so if the extension isn't detected on your first attempt, restart Chrome to pick up the new configuration.

180 

181If the connection still fails, verify the host configuration file exists at:

182 

183For Chrome:

184 

185* **macOS**: `~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json`

186* **Linux**: `~/.config/google-chrome/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json`

187* **Windows**: check `HKCU\Software\Google\Chrome\NativeMessagingHosts\` in the Windows Registry

188 

189For Edge:

190 

191* **macOS**: `~/Library/Application Support/Microsoft Edge/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json`

192* **Linux**: `~/.config/microsoft-edge/NativeMessagingHosts/com.anthropic.claude_code_browser_extension.json`

193* **Windows**: check `HKCU\Software\Microsoft\Edge\NativeMessagingHosts\` in the Windows Registry

194 

195### Browser not responding

196 

197If Claude's browser commands stop working:

198 

1991. Check if a modal dialog (alert, confirm, prompt) is blocking the page. JavaScript dialogs block browser events and prevent Claude from receiving commands. Dismiss the dialog manually, then tell Claude to continue.

2002. Ask Claude to create a new tab and try again

2013. Restart the Chrome extension by disabling and re-enabling it in `chrome://extensions`

202 

203### Connection drops during long sessions

204 

205The Chrome extension's service worker can go idle during extended sessions, which breaks the connection. If browser tools stop working after a period of inactivity, run `/chrome` and select "Reconnect extension".

206 

207### Windows-specific issues

208 

209On Windows, you may encounter:

210 

211* **Named pipe conflicts (EADDRINUSE)**: if another process is using the same named pipe, restart Claude Code. Close any other Claude Code sessions that might be using Chrome.

212* **Native messaging host errors**: if the native messaging host crashes on startup, try reinstalling Claude Code to regenerate the host configuration.

213 

214### Common error messages

215 

216These are the most frequently encountered errors and how to resolve them:

217 

218| Error | Cause | Fix |

219| ------------------------------------ | ------------------------------------------------ | --------------------------------------------------------------- |

220| "Browser extension is not connected" | Native messaging host cannot reach the extension | Restart Chrome and Claude Code, then run `/chrome` to reconnect |

221| "Extension not detected" | Chrome extension is not installed or is disabled | Install or enable the extension in `chrome://extensions` |

222| "No tab available" | Claude tried to act before a tab was ready | Ask Claude to create a new tab and retry |

223| "Receiving end does not exist" | Extension service worker went idle | Run `/chrome` and select "Reconnect extension" |

224 

225## See also

226 

227* [Use Claude Code in VS Code](/en/vs-code#automate-browser-tasks-with-chrome): browser automation in the VS Code extension

228* [CLI reference](/en/cli-reference): command-line flags including `--chrome`

229* [Common workflows](/en/common-workflows): more ways to use Claude Code

230* [Data and privacy](/en/data-usage): how Claude Code handles your data

231* [Getting started with Claude in Chrome](https://support.claude.com/en/articles/12012173-getting-started-with-claude-in-chrome): full documentation for the Chrome extension, including shortcuts, scheduling, and permissions

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Claude Code on the web5# Claude Code on the web

2 6 

3> Run Claude Code tasks asynchronously on secure cloud infrastructure7> Run Claude Code tasks asynchronously on secure cloud infrastructure


11Claude Code on the web lets developers kick off Claude Code from the Claude app. This is perfect for:15Claude Code on the web lets developers kick off Claude Code from the Claude app. This is perfect for:

12 16 

13* **Answering questions**: Ask about code architecture and how features are implemented17* **Answering questions**: Ask about code architecture and how features are implemented

14* **Bugfixes and routine tasks**: Well-defined tasks that don't require frequent steering18* **Bug fixes and routine tasks**: Well-defined tasks that don't require frequent steering

15* **Parallel work**: Tackle multiple bug fixes in parallel19* **Parallel work**: Tackle multiple bug fixes in parallel

16* **Repositories not on your local machine**: Work on code you don't have checked out locally20* **Repositories not on your local machine**: Work on code you don't have checked out locally

17* **Backend changes**: Where Claude Code can write tests and then write code to pass those tests21* **Backend changes**: Where Claude Code can write tests and then write code to pass those tests

18 22 

19Claude Code is also available on the Claude iOS app. This is perfect for:23Claude Code is also available on the Claude app for [iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) and [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude) for kicking off tasks on the go and monitoring work in progress.

20 

21* **On the go**: Kick off tasks while commuting or away from laptop

22* **Monitoring**: Watch the trajectory and steer the agent's work

23 24 

24Developers can also move Claude Code sessions from the Claude app to their terminal to continue tasks locally.25You can move between local and remote development: [send tasks from your terminal to run on the web](#from-terminal-to-web) with the `&` prefix, or [teleport web sessions back to your terminal](#from-web-to-terminal) to continue locally. To use the web interface while running Claude Code on your own machine instead of cloud infrastructure, see [Remote Control](/en/remote-control).

25 26 

26## Who can use Claude Code on the web?27## Who can use Claude Code on the web?

27 28 


29 30 

30* **Pro users**31* **Pro users**

31* **Max users**32* **Max users**

32 33* **Team users**

33Coming soon to Team and Enterprise premium seat users.34* **Enterprise users** with premium seats or Chat + Claude Code seats

34 35 

35## Getting started36## Getting started

36 37 


393. Install the Claude GitHub app in your repositories403. Install the Claude GitHub app in your repositories

404. Select your default environment414. Select your default environment

415. Submit your coding task425. Submit your coding task

426. Review changes and create a pull request in GitHub436. Review changes in diff view, iterate with comments, then create a pull request

43 44 

44## How it works45## How it works

45 46 


525. **Completion**: You're notified when finished and can create a PR with the changes535. **Completion**: You're notified when finished and can create a PR with the changes

536. **Results**: Changes are pushed to a branch, ready for pull request creation546. **Results**: Changes are pushed to a branch, ready for pull request creation

54 55 

56## Review changes with diff view

57 

58Diff view lets you see exactly what Claude changed before creating a pull request. Instead of clicking "Create PR" to review changes in GitHub, view the diff directly in the app and iterate with Claude until the changes are ready.

59 

60When Claude makes changes to files, a diff stats indicator appears showing the number of lines added and removed (for example, `+12 -1`). Select this indicator to open the diff viewer, which displays a file list on the left and the changes for each file on the right.

61 

62From the diff view, you can:

63 

64* Review changes file by file

65* Comment on specific changes to request modifications

66* Continue iterating with Claude based on what you see

67 

68This lets you refine changes through multiple rounds of feedback without creating draft PRs or switching to GitHub.

69 

55## Moving tasks between web and terminal70## Moving tasks between web and terminal

56 71 

72You can start tasks on the web and continue them in your terminal, or send tasks from your terminal to run on the web. Web sessions persist even if you close your laptop, and you can monitor them from anywhere including the Claude iOS app.

73 

74<Note>

75 Session handoff is one-way: you can pull web sessions into your terminal, but you can't push an existing terminal session to the web. The [`&` prefix](#from-terminal-to-web) creates a *new* web session with your current conversation context.

76</Note>

77 

78### From terminal to web

79 

80Start a message with `&` inside Claude Code to send a task to run on the web:

81 

82```

83& Fix the authentication bug in src/auth/login.ts

84```

85 

86This creates a new web session on claude.ai with your current conversation context. The task runs in the cloud while you continue working locally. Use `/tasks` to check progress, or open the session on claude.ai or the Claude iOS app to interact directly. From there you can steer Claude, provide feedback, or answer questions just like any other conversation.

87 

88You can also start a web session directly from the command line:

89 

90```bash theme={null}

91claude --remote "Fix the authentication bug in src/auth/login.ts"

92```

93 

94#### Tips for background tasks

95 

96**Plan locally, execute remotely**: For complex tasks, start Claude in plan mode to collaborate on the approach before sending work to the web:

97 

98```bash theme={null}

99claude --permission-mode plan

100```

101 

102In plan mode, Claude can only read files and explore the codebase. Once you're satisfied with the plan, send it to the web for autonomous execution:

103 

104```

105& Execute the migration plan we discussed

106```

107 

108This pattern gives you control over the strategy while letting Claude execute autonomously in the cloud.

109 

110**Run tasks in parallel**: Each `&` command creates its own web session that runs independently. You can kick off multiple tasks and they'll all run simultaneously in separate sessions:

111 

112```

113& Fix the flaky test in auth.spec.ts

114& Update the API documentation

115& Refactor the logger to use structured output

116```

117 

118Monitor all sessions with `/tasks`. When a session completes, you can create a PR from the web interface or [teleport](#from-web-to-terminal) the session to your terminal to continue working.

119 

57### From web to terminal120### From web to terminal

58 121 

59After starting a task on the web:122There are several ways to pull a web session into your terminal:

123 

124* **Using `/teleport`**: From within Claude Code, run `/teleport` (or `/tp`) to see an interactive picker of your web sessions. If you have uncommitted changes, you'll be prompted to stash them first.

125* **Using `--teleport`**: From the command line, run `claude --teleport` for an interactive session picker, or `claude --teleport <session-id>` to resume a specific session directly.

126* **From `/tasks`**: Run `/tasks` to see your background sessions, then press `t` to teleport into one

127* **From the web interface**: Click "Open in CLI" to copy a command you can paste into your terminal

128 

129When you teleport a session, Claude verifies you're in the correct repository, fetches and checks out the branch from the remote session, and loads the full conversation history into your terminal.

130 

131#### Requirements for teleporting

132 

133Teleport checks these requirements before resuming a session. If any requirement isn't met, you'll see an error or be prompted to resolve the issue.

134 

135| Requirement | Details |

136| ------------------ | ---------------------------------------------------------------------------------------------------------------------- |

137| Clean git state | Your working directory must have no uncommitted changes. Teleport prompts you to stash changes if needed. |

138| Correct repository | You must run `--teleport` from a checkout of the same repository, not a fork. |

139| Branch available | The branch from the web session must have been pushed to the remote. Teleport automatically fetches and checks it out. |

140| Same account | You must be authenticated to the same Claude.ai account used in the web session. |

141 

142### Sharing sessions

143 

144To share a session, toggle its visibility according to the account

145types below. After that, share the session link as-is. Recipients who open your

146shared session will see the latest state of the session upon load, but the

147recipient's page will not update in real time.

148 

149#### Sharing from an Enterprise or Teams account

60 150 

611. Click the "Open in CLI" button151For Enterprise and Teams accounts, the two visibility options are **Private**

622. Paste and run the command in your terminal in a checkout of the repo152and **Team**. Team visibility makes the session visible to other members of your

633. Any existing local changes will be stashed, and the remote session will be loaded153Claude.ai organization. Repository access verification is enabled by default,

644. Continue working locally154based on the GitHub account connected to the recipient's account. Your account's

155display name is visible to all recipients with access. [Claude in Slack](/en/slack)

156sessions are automatically shared with Team visibility.

157 

158#### Sharing from a Max or Pro account

159 

160For Max and Pro accounts, the two visibility options are **Private**

161and **Public**. Public visibility makes the session visible to any user logged

162into claude.ai.

163 

164Check your session for sensitive content before sharing. Sessions may contain

165code and credentials from private GitHub repositories. Repository access

166verification is not enabled by default.

167 

168Enable repository access verification and/or withhold your name from your shared

169sessions by going to Settings > Claude Code > Sharing settings.

65 170 

66## Cloud environment171## Cloud environment

67 172 


92The universal image includes pre-configured environments for:197The universal image includes pre-configured environments for:

93 198 

94* **Python**: Python 3.x with pip, poetry, and common scientific libraries199* **Python**: Python 3.x with pip, poetry, and common scientific libraries

95* **Node.js**: Latest LTS versions with npm, yarn, and pnpm200* **Node.js**: Latest LTS versions with npm, yarn, pnpm, and bun

201* **Ruby**: Versions 3.1.6, 3.2.6, 3.3.6 (default: 3.3.6) with gem, bundler, and rbenv for version management

202* **PHP**: Version 8.4.14

96* **Java**: OpenJDK with Maven and Gradle203* **Java**: OpenJDK with Maven and Gradle

97* **Go**: Latest stable version with module support204* **Go**: Latest stable version with module support

98* **Rust**: Rust toolchain with cargo205* **Rust**: Rust toolchain with cargo

99* **C++**: GCC and Clang compilers206* **C++**: GCC and Clang compilers

100 207 

208#### Databases

209 

210The universal image includes the following databases:

211 

212* **PostgreSQL**: Version 16

213* **Redis**: Version 7.0

214 

101### Environment configuration215### Environment configuration

102 216 

103When you start a session in Claude Code on the web, here's what happens under the hood:217When you start a session in Claude Code on the web, here's what happens under the hood:


118 232 

119**To update an existing environment:** Select the current environment, to the right of the environment name, and select the settings button. This will open a dialog where you can update the environment name, network access, and environment variables.233**To update an existing environment:** Select the current environment, to the right of the environment name, and select the settings button. This will open a dialog where you can update the environment name, network access, and environment variables.

120 234 

235**To select your default environment from the terminal:** If you have multiple environments configured, run `/remote-env` to choose which one to use when starting web sessions from your terminal with `&` or `--remote`. With a single environment, this command shows your current configuration.

236 

121<Note>237<Note>

122 Environment variables must be specified as key-value pairs, in [`.env` format](https://www.dotenv.org/). For example:238 Environment variables must be specified as key-value pairs, in [`.env` format](https://www.dotenv.org/). For example:

123 239 


129 245 

130### Dependency management246### Dependency management

131 247 

132Configure automatic dependency installation using [SessionStart hooks](/en/docs/claude-code/hooks#sessionstart). This can be configured in your repository's `.claude/settings.json` file:248Custom environment images and snapshots are not yet supported. As a workaround, you can use [SessionStart hooks](/en/hooks#sessionstart) to install packages when a session starts. This approach has [known limitations](#dependency-management-limitations).

249 

250To configure automatic dependency installation, add a SessionStart hook to your repository's `.claude/settings.json` file:

133 251 

134```json theme={null}252```json theme={null}

135{253{


151 269 

152Create the corresponding script at `scripts/install_pkgs.sh`:270Create the corresponding script at `scripts/install_pkgs.sh`:

153 271 

154```bash theme={null}

155#!/bin/bash

156npm install

157pip install -r requirements.txt

158exit 0

159```

160 

161Make it executable: `chmod +x scripts/install_pkgs.sh`

162 

163#### Local vs remote execution

164 

165By default, all hooks execute both locally and in remote (web) environments. To run a hook only in one environment, check the `CLAUDE_CODE_REMOTE` environment variable in your hook script.

166 

167```bash theme={null}272```bash theme={null}

168#!/bin/bash273#!/bin/bash

169 274 

170# Example: Only run in remote environments275# Only run in remote environments

171if [ "$CLAUDE_CODE_REMOTE" != "true" ]; then276if [ "$CLAUDE_CODE_REMOTE" != "true" ]; then

172 exit 0277 exit 0

173fi278fi

174 279 

175npm install280npm install

176pip install -r requirements.txt281pip install -r requirements.txt

282exit 0

177```283```

178 284 

179#### Persisting environment variables285Make it executable: `chmod +x scripts/install_pkgs.sh`

286 

287#### Persist environment variables

180 288 

181SessionStart hooks can persist environment variables for subsequent bash commands by writing to the file specified in the `CLAUDE_ENV_FILE` environment variable. For details, see [SessionStart hooks](/en/docs/claude-code/hooks#sessionstart) in the hooks reference.289SessionStart hooks can persist environment variables for subsequent Bash commands by writing to the file specified in the `CLAUDE_ENV_FILE` environment variable. For details, see [SessionStart hooks](/en/hooks#sessionstart) in the hooks reference.

290 

291#### Dependency management limitations

292 

293* **Hooks fire for all sessions**: SessionStart hooks run in both local and remote environments. There is no hook configuration to scope a hook to remote sessions only. To skip local execution, check the `CLAUDE_CODE_REMOTE` environment variable in your script as shown above.

294* **Requires network access**: Install commands need network access to reach package registries. If your environment is configured with "No internet" access, these hooks will fail. Use "Limited" (the default) or "Full" network access. The [default allowlist](#default-allowed-domains) includes common registries like npm, PyPI, RubyGems, and crates.io.

295* **Proxy compatibility**: All outbound traffic in remote environments passes through a [security proxy](#security-proxy). Some package managers do not work correctly with this proxy. Bun is a known example.

296* **Runs on every session start**: Hooks run each time a session starts or resumes, adding startup latency. Keep install scripts fast by checking whether dependencies are already present before reinstalling.

182 297 

183## Network access and security298## Network access and security

184 299 


214 329 

215* api.anthropic.com330* api.anthropic.com

216* statsig.anthropic.com331* statsig.anthropic.com

332* platform.claude.com

333* code.claude.com

217* claude.ai334* claude.ai

218 335 

219#### Version Control336#### Version Control


221* github.com338* github.com

222* [www.github.com](http://www.github.com)339* [www.github.com](http://www.github.com)

223* api.github.com340* api.github.com

341* npm.pkg.github.com

224* raw\.githubusercontent.com342* raw\.githubusercontent.com

343* pkg-npm.githubusercontent.com

225* objects.githubusercontent.com344* objects.githubusercontent.com

226* codeload.github.com345* codeload.github.com

227* avatars.githubusercontent.com346* avatars.githubusercontent.com


243* [www.docker.com](http://www.docker.com)362* [www.docker.com](http://www.docker.com)

244* production.cloudflare.docker.com363* production.cloudflare.docker.com

245* download.docker.com364* download.docker.com

365* gcr.io

246* \*.gcr.io366* \*.gcr.io

247* ghcr.io367* ghcr.io

248* mcr.microsoft.com368* mcr.microsoft.com

249* \*.data.mcr.microsoft.com369* \*.data.mcr.microsoft.com

370* public.ecr.aws

250 371 

251#### Cloud Platforms372#### Cloud Platforms

252 373 


267* dot.net388* dot.net

268* visualstudio.com389* visualstudio.com

269* dev.azure.com390* dev.azure.com

391* \*.amazonaws.com

392* \*.api.aws

270* oracle.com393* oracle.com

271* [www.oracle.com](http://www.oracle.com)394* [www.oracle.com](http://www.oracle.com)

272* java.com395* java.com


316 439 

317* crates.io440* crates.io

318* [www.crates.io](http://www.crates.io)441* [www.crates.io](http://www.crates.io)

442* index.crates.io

319* static.crates.io443* static.crates.io

320* rustup.rs444* rustup.rs

321* static.rust-lang.org445* static.rust-lang.org


341* gradle.org465* gradle.org

342* [www.gradle.org](http://www.gradle.org)466* [www.gradle.org](http://www.gradle.org)

343* services.gradle.org467* services.gradle.org

468* plugins.gradle.org

469* kotlin.org

470* [www.kotlin.org](http://www.kotlin.org)

344* spring.io471* spring.io

345* repo.spring.io472* repo.spring.io

346 473 


414* statsig.com541* statsig.com

415* [www.statsig.com](http://www.statsig.com)542* [www.statsig.com](http://www.statsig.com)

416* api.statsig.com543* api.statsig.com

544* sentry.io

417* \*.sentry.io545* \*.sentry.io

546* http-intake.logs.datadoghq.com

547* \*.datadoghq.com

548* \*.datadoghq.eu

418 549 

419#### Content Delivery & Mirrors550#### Content Delivery & Mirrors

420 551 

552* sourceforge.net

421* \*.sourceforge.net553* \*.sourceforge.net

422* packagecloud.io554* packagecloud.io

423* \*.packagecloud.io555* \*.packagecloud.io


429* json.schemastore.org561* json.schemastore.org

430* [www.schemastore.org](http://www.schemastore.org)562* [www.schemastore.org](http://www.schemastore.org)

431 563 

564#### Model Context Protocol

565 

566* \*.modelcontextprotocol.io

567 

432<Note>568<Note>

433 Domains marked with `*` indicate wildcard subdomain matching. For example, `*.gcr.io` allows access to any subdomain of `gcr.io`.569 Domains marked with `*` indicate wildcard subdomain matching. For example, `*.gcr.io` allows access to any subdomain of `gcr.io`.

434</Note>570</Note>


464 600 

465## Best practices601## Best practices

466 602 

4671. **Use Claude Code hooks**: Configure [sessionStart hooks](/en/docs/claude-code/hooks#sessionstart) to automate environment setup and dependency installation.6031. **Use Claude Code hooks**: Configure [SessionStart hooks](/en/hooks#sessionstart) to automate environment setup and dependency installation.

4682. **Document requirements**: Clearly specify dependencies and commands in your `CLAUDE.md` file. If you have an `AGENTS.md` file, you can source it in your `CLAUDE.md` using `@AGENTS.md` to maintain a single source of truth.6042. **Document requirements**: Clearly specify dependencies and commands in your `CLAUDE.md` file. If you have an `AGENTS.md` file, you can source it in your `CLAUDE.md` using `@AGENTS.md` to maintain a single source of truth.

469 605 

470## Related resources606## Related resources

471 607 

472* [Hooks configuration](/en/docs/claude-code/hooks)608* [Hooks configuration](/en/hooks)

473* [Settings reference](/en/docs/claude-code/settings)609* [Settings reference](/en/settings)

474* [Security](/en/docs/claude-code/security)610* [Security](/en/security)

475* [Data usage](/en/docs/claude-code/data-usage)611* [Data usage](/en/data-usage)

cli-reference.md +110 −32

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# CLI reference5# CLI reference

2 6 

3> Complete reference for Claude Code command-line interface, including commands and flags.7> Complete reference for Claude Code command-line interface, including commands and flags.


5## CLI commands9## CLI commands

6 10 

7| Command | Description | Example |11| Command | Description | Example |

8| :--------------------------------- | :--------------------------------------------- | :----------------------------------------------------------------- |12| :------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------- |

9| `claude` | Start interactive REPL | `claude` |13| `claude` | Start interactive REPL | `claude` |

10| `claude "query"` | Start REPL with initial prompt | `claude "explain this project"` |14| `claude "query"` | Start REPL with initial prompt | `claude "explain this project"` |

11| `claude -p "query"` | Query via SDK, then exit | `claude -p "explain this function"` |15| `claude -p "query"` | Query via SDK, then exit | `claude -p "explain this function"` |

12| `cat file \| claude -p "query"` | Process piped content | `cat logs.txt \| claude -p "explain"` |16| `cat file \| claude -p "query"` | Process piped content | `cat logs.txt \| claude -p "explain"` |

13| `claude -c` | Continue most recent conversation | `claude -c` |17| `claude -c` | Continue most recent conversation in current directory | `claude -c` |

14| `claude -c -p "query"` | Continue via SDK | `claude -c -p "Check for type errors"` |18| `claude -c -p "query"` | Continue via SDK | `claude -c -p "Check for type errors"` |

15| `claude -r "<session-id>" "query"` | Resume session by ID | `claude -r "abc123" "Finish this PR"` |19| `claude -r "<session>" "query"` | Resume session by ID or name | `claude -r "auth-refactor" "Finish this PR"` |

16| `claude update` | Update to latest version | `claude update` |20| `claude update` | Update to latest version | `claude update` |

17| `claude mcp` | Configure Model Context Protocol (MCP) servers | See the [Claude Code MCP documentation](/en/docs/claude-code/mcp). |21| `claude auth login` | Sign in to your Anthropic account. Use `--email` to pre-fill your email address and `--sso` to force SSO authentication | `claude auth login --email user@example.com --sso` |

22| `claude auth logout` | Log out from your Anthropic account | `claude auth logout` |

23| `claude auth status` | Show authentication status as JSON. Use `--text` for human-readable output. Exits with code 0 if logged in, 1 if not | `claude auth status` |

24| `claude agents` | List all configured [subagents](/en/sub-agents), grouped by source | `claude agents` |

25| `claude mcp` | Configure Model Context Protocol (MCP) servers | See the [Claude Code MCP documentation](/en/mcp). |

26| `claude remote-control` | Start a [Remote Control session](/en/remote-control) to control Claude Code from Claude.ai or the Claude app while running locally. See [Remote Control](/en/remote-control) for flags | `claude remote-control` |

18 27 

19## CLI flags28## CLI flags

20 29 

21Customize Claude Code's behavior with these command-line flags:30Customize Claude Code's behavior with these command-line flags:

22 31 

23| Flag | Description | Example |32| Flag | Description | Example |

24| :------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- |33| :------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- |

25| `--add-dir` | Add additional working directories for Claude to access (validates each path exists as a directory) | `claude --add-dir ../apps ../lib` |34| `--add-dir` | Add additional working directories for Claude to access (validates each path exists as a directory) | `claude --add-dir ../apps ../lib` |

26| `--agents` | Define custom [subagents](/en/docs/claude-code/sub-agents) dynamically via JSON (see below for format) | `claude --agents '{"reviewer":{"description":"Reviews code","prompt":"You are a code reviewer"}}'` |35| `--agent` | Specify an agent for the current session (overrides the `agent` setting) | `claude --agent my-custom-agent` |

27| `--allowedTools` | A list of tools that should be allowed without prompting the user for permission, in addition to [settings.json files](/en/docs/claude-code/settings) | `"Bash(git log:*)" "Bash(git diff:*)" "Read"` |36| `--agents` | Define custom [subagents](/en/sub-agents) dynamically via JSON (see below for format) | `claude --agents '{"reviewer":{"description":"Reviews code","prompt":"You are a code reviewer"}}'` |

28| `--disallowedTools` | A list of tools that should be disallowed without prompting the user for permission, in addition to [settings.json files](/en/docs/claude-code/settings) | `"Bash(git log:*)" "Bash(git diff:*)" "Edit"` |37| `--allow-dangerously-skip-permissions` | Enable permission bypassing as an option without immediately activating it. Allows composing with `--permission-mode` (use with caution) | `claude --permission-mode plan --allow-dangerously-skip-permissions` |

29| `--print`, `-p` | Print response without interactive mode (see [SDK documentation](/en/docs/claude-code/sdk) for programmatic usage details) | `claude -p "query"` |38| `--allowedTools` | Tools that execute without prompting for permission. See [permission rule syntax](/en/settings#permission-rule-syntax) for pattern matching. To restrict which tools are available, use `--tools` instead | `"Bash(git log *)" "Bash(git diff *)" "Read"` |

30| `--append-system-prompt` | Append to system prompt (only with `--print`) | `claude --append-system-prompt "Custom instruction"` |39| `--append-system-prompt` | Append custom text to the end of the default system prompt (works in both interactive and print modes) | `claude --append-system-prompt "Always use TypeScript"` |

31| `--output-format` | Specify output format for print mode (options: `text`, `json`, `stream-json`) | `claude -p "query" --output-format json` |40| `--append-system-prompt-file` | Load additional system prompt text from a file and append to the default prompt (print mode only) | `claude -p --append-system-prompt-file ./extra-rules.txt "query"` |

32| `--input-format` | Specify input format for print mode (options: `text`, `stream-json`) | `claude -p --output-format json --input-format stream-json` |41| `--betas` | Beta headers to include in API requests (API key users only) | `claude --betas interleaved-thinking` |

42| `--chrome` | Enable [Chrome browser integration](/en/chrome) for web automation and testing | `claude --chrome` |

43| `--continue`, `-c` | Load the most recent conversation in the current directory | `claude --continue` |

44| `--dangerously-skip-permissions` | Skip all permission prompts (use with caution) | `claude --dangerously-skip-permissions` |

45| `--debug` | Enable debug mode with optional category filtering (for example, `"api,hooks"` or `"!statsig,!file"`) | `claude --debug "api,mcp"` |

46| `--disable-slash-commands` | Disable all skills and slash commands for this session | `claude --disable-slash-commands` |

47| `--disallowedTools` | Tools that are removed from the model's context and cannot be used | `"Bash(git log *)" "Bash(git diff *)" "Edit"` |

48| `--fallback-model` | Enable automatic fallback to specified model when default model is overloaded (print mode only) | `claude -p --fallback-model sonnet "query"` |

49| `--fork-session` | When resuming, create a new session ID instead of reusing the original (use with `--resume` or `--continue`) | `claude --resume abc123 --fork-session` |

50| `--from-pr` | Resume sessions linked to a specific GitHub PR. Accepts a PR number or URL. Sessions are automatically linked when created via `gh pr create` | `claude --from-pr 123` |

51| `--ide` | Automatically connect to IDE on startup if exactly one valid IDE is available | `claude --ide` |

52| `--init` | Run initialization hooks and start interactive mode | `claude --init` |

53| `--init-only` | Run initialization hooks and exit (no interactive session) | `claude --init-only` |

33| `--include-partial-messages` | Include partial streaming events in output (requires `--print` and `--output-format=stream-json`) | `claude -p --output-format stream-json --include-partial-messages "query"` |54| `--include-partial-messages` | Include partial streaming events in output (requires `--print` and `--output-format=stream-json`) | `claude -p --output-format stream-json --include-partial-messages "query"` |

34| `--verbose` | Enable verbose logging, shows full turn-by-turn output (helpful for debugging in both print and interactive modes) | `claude --verbose` |55| `--input-format` | Specify input format for print mode (options: `text`, `stream-json`) | `claude -p --output-format json --input-format stream-json` |

35| `--max-turns` | Limit the number of agentic turns in non-interactive mode | `claude -p --max-turns 3 "query"` |56| `--json-schema` | Get validated JSON output matching a JSON Schema after agent completes its workflow (print mode only, see [structured outputs](https://platform.claude.com/docs/en/agent-sdk/structured-outputs)) | `claude -p --json-schema '{"type":"object","properties":{...}}' "query"` |

36| `--model` | Sets the model for the current session with an alias for the latest model (`sonnet` or `opus`) or a model's full name | `claude --model claude-sonnet-4-5-20250929` |57| `--maintenance` | Run maintenance hooks and exit | `claude --maintenance` |

37| `--permission-mode` | Begin in a specified [permission mode](iam#permission-modes) | `claude --permission-mode plan` |58| `--max-budget-usd` | Maximum dollar amount to spend on API calls before stopping (print mode only) | `claude -p --max-budget-usd 5.00 "query"` |

59| `--max-turns` | Limit the number of agentic turns (print mode only). Exits with an error when the limit is reached. No limit by default | `claude -p --max-turns 3 "query"` |

60| `--mcp-config` | Load MCP servers from JSON files or strings (space-separated) | `claude --mcp-config ./mcp.json` |

61| `--model` | Sets the model for the current session with an alias for the latest model (`sonnet` or `opus`) or a model's full name | `claude --model claude-sonnet-4-6` |

62| `--no-chrome` | Disable [Chrome browser integration](/en/chrome) for this session | `claude --no-chrome` |

63| `--no-session-persistence` | Disable session persistence so sessions are not saved to disk and cannot be resumed (print mode only) | `claude -p --no-session-persistence "query"` |

64| `--output-format` | Specify output format for print mode (options: `text`, `json`, `stream-json`) | `claude -p "query" --output-format json` |

65| `--permission-mode` | Begin in a specified [permission mode](/en/permissions#permission-modes) | `claude --permission-mode plan` |

38| `--permission-prompt-tool` | Specify an MCP tool to handle permission prompts in non-interactive mode | `claude -p --permission-prompt-tool mcp_auth_tool "query"` |66| `--permission-prompt-tool` | Specify an MCP tool to handle permission prompts in non-interactive mode | `claude -p --permission-prompt-tool mcp_auth_tool "query"` |

39| `--resume` | Resume a specific session by ID, or by choosing in interactive mode | `claude --resume abc123 "query"` |67| `--plugin-dir` | Load plugins from directories for this session only (repeatable) | `claude --plugin-dir ./my-plugins` |

40| `--continue` | Load the most recent conversation in the current directory | `claude --continue` |68| `--print`, `-p` | Print response without interactive mode (see [Agent SDK documentation](https://platform.claude.com/docs/en/agent-sdk/overview) for programmatic usage details) | `claude -p "query"` |

41| `--dangerously-skip-permissions` | Skip permission prompts (use with caution) | `claude --dangerously-skip-permissions` |69| `--remote` | Create a new [web session](/en/claude-code-on-the-web) on claude.ai with the provided task description | `claude --remote "Fix the login bug"` |

70| `--resume`, `-r` | Resume a specific session by ID or name, or show an interactive picker to choose a session | `claude --resume auth-refactor` |

71| `--session-id` | Use a specific session ID for the conversation (must be a valid UUID) | `claude --session-id "550e8400-e29b-41d4-a716-446655440000"` |

72| `--setting-sources` | Comma-separated list of setting sources to load (`user`, `project`, `local`) | `claude --setting-sources user,project` |

73| `--settings` | Path to a settings JSON file or a JSON string to load additional settings from | `claude --settings ./settings.json` |

74| `--strict-mcp-config` | Only use MCP servers from `--mcp-config`, ignoring all other MCP configurations | `claude --strict-mcp-config --mcp-config ./mcp.json` |

75| `--system-prompt` | Replace the entire system prompt with custom text (works in both interactive and print modes) | `claude --system-prompt "You are a Python expert"` |

76| `--system-prompt-file` | Load system prompt from a file, replacing the default prompt (print mode only) | `claude -p --system-prompt-file ./custom-prompt.txt "query"` |

77| `--teleport` | Resume a [web session](/en/claude-code-on-the-web) in your local terminal | `claude --teleport` |

78| `--teammate-mode` | Set how [agent team](/en/agent-teams) teammates display: `auto` (default), `in-process`, or `tmux`. See [set up agent teams](/en/agent-teams#set-up-agent-teams) | `claude --teammate-mode in-process` |

79| `--tools` | Restrict which built-in tools Claude can use (works in both interactive and print modes). Use `""` to disable all, `"default"` for all, or tool names like `"Bash,Edit,Read"` | `claude --tools "Bash,Edit,Read"` |

80| `--verbose` | Enable verbose logging, shows full turn-by-turn output (helpful for debugging in both print and interactive modes) | `claude --verbose` |

81| `--version`, `-v` | Output the version number | `claude -v` |

82| `--worktree`, `-w` | Start Claude in an isolated [git worktree](/en/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees) at `<repo>/.claude/worktrees/<name>`. If no name is given, one is auto-generated | `claude -w feature-auth` |

42 83 

43<Tip>84<Tip>

44 The `--output-format json` flag is particularly useful for scripting and85 The `--output-format json` flag is particularly useful for scripting and


50The `--agents` flag accepts a JSON object that defines one or more custom subagents. Each subagent requires a unique name (as the key) and a definition object with the following fields:91The `--agents` flag accepts a JSON object that defines one or more custom subagents. Each subagent requires a unique name (as the key) and a definition object with the following fields:

51 92 

52| Field | Required | Description |93| Field | Required | Description |

53| :------------ | :------- | :-------------------------------------------------------------------------------------------------------------- |94| :---------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

54| `description` | Yes | Natural language description of when the subagent should be invoked |95| `description` | Yes | Natural language description of when the subagent should be invoked |

55| `prompt` | Yes | The system prompt that guides the subagent's behavior |96| `prompt` | Yes | The system prompt that guides the subagent's behavior |

56| `tools` | No | Array of specific tools the subagent can use (e.g., `["Read", "Edit", "Bash"]`). If omitted, inherits all tools |97| `tools` | No | Array of specific tools the subagent can use, for example `["Read", "Edit", "Bash"]`. If omitted, inherits all tools. Supports [`Task(agent_type)`](/en/sub-agents#restrict-which-subagents-can-be-spawned) syntax |

57| `model` | No | Model alias to use: `sonnet`, `opus`, or `haiku`. If omitted, uses the default subagent model |98| `disallowedTools` | No | Array of tool names to explicitly deny for this subagent |

99| `model` | No | Model alias to use: `sonnet`, `opus`, `haiku`, or `inherit`. If omitted, defaults to `inherit` |

100| `skills` | No | Array of [skill](/en/skills) names to preload into the subagent's context |

101| `mcpServers` | No | Array of [MCP servers](/en/mcp) for this subagent. Each entry is a server name string or a `{name: config}` object |

102| `maxTurns` | No | Maximum number of agentic turns before the subagent stops |

58 103 

59Example:104Example:

60 105 


73}'118}'

74```119```

75 120 

76For more details on creating and using subagents, see the [subagents documentation](/en/docs/claude-code/sub-agents).121For more details on creating and using subagents, see the [subagents documentation](/en/sub-agents).

122 

123### System prompt flags

124 

125Claude Code provides four flags for customizing the system prompt, each serving a different purpose:

126 

127| Flag | Behavior | Modes | Use Case |

128| :---------------------------- | :------------------------------------------ | :------------------ | :------------------------------------------------------------------- |

129| `--system-prompt` | **Replaces** entire default prompt | Interactive + Print | Complete control over Claude's behavior and instructions |

130| `--system-prompt-file` | **Replaces** with file contents | Print only | Load prompts from files for reproducibility and version control |

131| `--append-system-prompt` | **Appends** to default prompt | Interactive + Print | Add specific instructions while keeping default Claude Code behavior |

132| `--append-system-prompt-file` | **Appends** file contents to default prompt | Print only | Load additional instructions from files while keeping defaults |

133 

134**When to use each:**

135 

136* **`--system-prompt`**: Use when you need complete control over Claude's system prompt. This removes all default Claude Code instructions, giving you a blank slate.

137 ```bash theme={null}

138 claude --system-prompt "You are a Python expert who only writes type-annotated code"

139 ```

140 

141* **`--system-prompt-file`**: Use when you want to load a custom prompt from a file, useful for team consistency or version-controlled prompt templates.

142 ```bash theme={null}

143 claude -p --system-prompt-file ./prompts/code-review.txt "Review this PR"

144 ```

145 

146* **`--append-system-prompt`**: Use when you want to add specific instructions while keeping Claude Code's default capabilities intact. This is the safest option for most use cases.

147 ```bash theme={null}

148 claude --append-system-prompt "Always use TypeScript and include JSDoc comments"

149 ```

150 

151* **`--append-system-prompt-file`**: Use when you want to append instructions from a file while keeping Claude Code's defaults. Useful for version-controlled additions.

152 ```bash theme={null}

153 claude -p --append-system-prompt-file ./prompts/style-rules.txt "Review this PR"

154 ```

155 

156`--system-prompt` and `--system-prompt-file` are mutually exclusive. The append flags can be used together with either replacement flag.

77 157 

78For detailed information about print mode (`-p`) including output formats,158For most use cases, `--append-system-prompt` or `--append-system-prompt-file` is recommended as they preserve Claude Code's built-in capabilities while adding your custom requirements. Use `--system-prompt` or `--system-prompt-file` only when you need complete control over the system prompt.

79streaming, verbose logging, and programmatic usage, see the

80[SDK documentation](/en/docs/claude-code/sdk).

81 159 

82## See also160## See also

83 161 

84* [Interactive mode](/en/docs/claude-code/interactive-mode) - Shortcuts, input modes, and interactive features162* [Chrome extension](/en/chrome) - Browser automation and web testing

85* [Slash commands](/en/docs/claude-code/slash-commands) - Interactive session commands163* [Interactive mode](/en/interactive-mode) - Shortcuts, input modes, and interactive features

86* [Quickstart guide](/en/docs/claude-code/quickstart) - Getting started with Claude Code164* [Quickstart guide](/en/quickstart) - Getting started with Claude Code

87* [Common workflows](/en/docs/claude-code/common-workflows) - Advanced workflows and patterns165* [Common workflows](/en/common-workflows) - Advanced workflows and patterns

88* [Settings](/en/docs/claude-code/settings) - Configuration options166* [Settings](/en/settings) - Configuration options

89* [SDK documentation](/en/docs/claude-code/sdk) - Programmatic usage and integrations167* [Agent SDK documentation](https://platform.claude.com/docs/en/agent-sdk/overview) - Programmatic usage and integrations

common-workflows.md +247 −271

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Common workflows5# Common workflows

2 6 

3> Learn about common workflows with Claude Code.7> Step-by-step guides for exploring codebases, fixing bugs, refactoring, testing, and other everyday tasks with Claude Code.

4 8 

5Each task in this document includes clear instructions, example commands, and best practices to help you get the most from Claude Code.9This page covers practical workflows for everyday development: exploring unfamiliar code, debugging, refactoring, writing tests, creating PRs, and managing sessions. Each section includes example prompts you can adapt to your own projects. For higher-level patterns and tips, see [Best practices](/en/best-practices).

6 10 

7## Understand new codebases11## Understand new codebases

8 12 


81 85 

82 * Be specific about what you're looking for86 * Be specific about what you're looking for

83 * Use domain language from the project87 * Use domain language from the project

88 * Install a [code intelligence plugin](/en/discover-plugins#code-intelligence) for your language to give Claude precise "go to definition" and "find references" navigation

84</Tip>89</Tip>

85 90 

86***91***


173 </Step>178 </Step>

174 179 

175 <Step title="Use subagents automatically">180 <Step title="Use subagents automatically">

176 Claude Code will automatically delegate appropriate tasks to specialized subagents:181 Claude Code automatically delegates appropriate tasks to specialized subagents:

177 182 

178 ```183 ```

179 > review my recent code changes for security issues184 > review my recent code changes for security issues


201 206 

202 Then select "Create New subagent" and follow the prompts to define:207 Then select "Create New subagent" and follow the prompts to define:

203 208 

204 * Subagent type (e.g., `api-designer`, `performance-optimizer`)209 * A unique identifier that describes the subagent's purpose (for example, `code-reviewer`, `api-designer`).

205 * When to use it210 * When Claude should use this agent

206 * Which tools it can access211 * Which tools it can access

207 * Its specialized system prompt212 * A system prompt describing the agent's role and behavior

208 </Step>213 </Step>

209</Steps>214</Steps>

210 215 


214 * Create project-specific subagents in `.claude/agents/` for team sharing219 * Create project-specific subagents in `.claude/agents/` for team sharing

215 * Use descriptive `description` fields to enable automatic delegation220 * Use descriptive `description` fields to enable automatic delegation

216 * Limit tool access to what each subagent actually needs221 * Limit tool access to what each subagent actually needs

217 * Check the [subagents documentation](/en/docs/claude-code/sub-agents) for detailed examples222 * Check the [subagents documentation](/en/sub-agents) for detailed examples

218</Tip>223</Tip>

219 224 

220***225***

221 226 

222## Use Plan Mode for safe code analysis227## Use Plan Mode for safe code analysis

223 228 

224Plan Mode instructs Claude to create a plan by analyzing the codebase with read-only operations, perfect for exploring codebases, planning complex changes, or reviewing code safely.229Plan Mode instructs Claude to create a plan by analyzing the codebase with read-only operations, perfect for exploring codebases, planning complex changes, or reviewing code safely. In Plan Mode, Claude uses [`AskUserQuestion`](/en/settings#tools-available-to-claude) to gather requirements and clarify your goals before proposing a plan.

225 230 

226### When to use Plan Mode231### When to use Plan Mode

227 232 


235 240 

236You can switch into Plan Mode during a session using **Shift+Tab** to cycle through permission modes.241You can switch into Plan Mode during a session using **Shift+Tab** to cycle through permission modes.

237 242 

238If you are in Normal Mode, **Shift+Tab** will first switch into Auto-Accept Mode, indicated by `⏵⏵ accept edits on` at the bottom of the terminal. A subsequent **Shift+Tab** will switch into Plan Mode, indicated by `⏸ plan mode on`.243If you are in Normal Mode, **Shift+Tab** first switches into Auto-Accept Mode, indicated by `⏵⏵ accept edits on` at the bottom of the terminal. A subsequent **Shift+Tab** will switch into Plan Mode, indicated by `⏸ plan mode on`.

239 244 

240**Start a new session in Plan Mode**245**Start a new session in Plan Mode**

241 246 


247 252 

248**Run "headless" queries in Plan Mode**253**Run "headless" queries in Plan Mode**

249 254 

250You can also run a query in Plan Mode directly with `-p` (i.e., in ["headless mode"](/en/docs/claude-code/sdk/sdk-headless)):255You can also run a query in Plan Mode directly with `-p` (that is, in ["headless mode"](/en/headless)):

251 256 

252```bash theme={null}257```bash theme={null}

253claude --permission-mode plan -p "Analyze the authentication system and suggest improvements"258claude --permission-mode plan -p "Analyze the authentication system and suggest improvements"


263> I need to refactor our authentication system to use OAuth2. Create a detailed migration plan.268> I need to refactor our authentication system to use OAuth2. Create a detailed migration plan.

264```269```

265 270 

266Claude will analyze the current implementation and create a comprehensive plan. Refine with follow-ups:271Claude analyzes the current implementation and create a comprehensive plan. Refine with follow-ups:

267 272 

268```273```

269> What about backward compatibility?274> What about backward compatibility?

270> How should we handle database migration?275> How should we handle database migration?

271```276```

272 277 

278<Tip>Press `Ctrl+G` to open the plan in your default text editor, where you can edit it directly before Claude proceeds.</Tip>

279 

273### Configure Plan Mode as default280### Configure Plan Mode as default

274 281 

275```json theme={null}282```json theme={null}


281}288}

282```289```

283 290 

284See [settings documentation](/en/docs/claude-code/settings#available-settings) for more configuration options.291See [settings documentation](/en/settings#available-settings) for more configuration options.

285 292 

286***293***

287 294 


315 </Step>322 </Step>

316</Steps>323</Steps>

317 324 

318<Tip>325Claude can generate tests that follow your project's existing patterns and conventions. When asking for tests, be specific about what behavior you want to verify. Claude examines your existing test files to match the style, frameworks, and assertion patterns already in use.

319 Tips:

320 326 

321 * Ask for tests that cover edge cases and error conditions327For comprehensive coverage, ask Claude to identify edge cases you might have missed. Claude can analyze your code paths and suggest tests for error conditions, boundary values, and unexpected inputs that are easy to overlook.

322 * Request both unit and integration tests when appropriate

323 * Have Claude explain the testing strategy

324</Tip>

325 328 

326***329***

327 330 

328## Create pull requests331## Create pull requests

329 332 

330Suppose you need to create a well-documented pull request for your changes.333You can create pull requests by asking Claude directly ("create a pr for my changes") or by using the `/commit-push-pr` skill, which commits, pushes, and opens a PR in one step.

334 

335```

336> /commit-push-pr

337```

338 

339If you have a Slack MCP server configured and specify channels in your CLAUDE.md (for example, "post PR URLs to #team-prs"), the skill automatically posts the PR URL to those channels.

340 

341For more control over the process, guide Claude through it step-by-step or [create your own skill](/en/skills):

331 342 

332<Steps>343<Steps>

333 <Step title="Summarize your changes">344 <Step title="Summarize your changes">


336 ```347 ```

337 </Step>348 </Step>

338 349 

339 <Step title="Generate a PR with Claude">350 <Step title="Generate a pull request">

340 ```351 ```

341 > create a pr352 > create a pr

342 ```353 ```


347 > enhance the PR description with more context about the security improvements358 > enhance the PR description with more context about the security improvements

348 ```359 ```

349 </Step>360 </Step>

350 

351 <Step title="Add testing details">

352 ```

353 > add information about how these changes were tested

354 ```

355 </Step>

356</Steps>361</Steps>

357 362 

358<Tip>363When you create a PR using `gh pr create`, the session is automatically linked to that PR. You can resume it later with `claude --from-pr <number>`.

359 Tips:

360 364 

361 * Ask Claude directly to make a PR for you365<Tip>

362 * Review Claude's generated PR before submitting366 Review Claude's generated PR before submitting and ask Claude to highlight potential risks or considerations.

363 * Ask Claude to highlight potential risks or considerations

364</Tip>367</Tip>

365 368 

366## Handle documentation369## Handle documentation


458 * Include screenshots of errors, UI designs, or diagrams for better context461 * Include screenshots of errors, UI designs, or diagrams for better context

459 * You can work with multiple images in a conversation462 * You can work with multiple images in a conversation

460 * Image analysis works with diagrams, screenshots, mockups, and more463 * Image analysis works with diagrams, screenshots, mockups, and more

464 * When Claude references images (for example, `[Image #1]`), `Cmd+Click` (Mac) or `Ctrl+Click` (Windows/Linux) the link to open the image in your default viewer

461</Tip>465</Tip>

462 466 

463***467***


488 > Show me the data from @github:repos/owner/repo/issues492 > Show me the data from @github:repos/owner/repo/issues

489 ```493 ```

490 494 

491 This fetches data from connected MCP servers using the format @server:resource. See [MCP resources](/en/docs/claude-code/mcp#use-mcp-resources) for details.495 This fetches data from connected MCP servers using the format @server:resource. See [MCP resources](/en/mcp#use-mcp-resources) for details.

492 </Step>496 </Step>

493</Steps>497</Steps>

494 498 


496 Tips:500 Tips:

497 501 

498 * File paths can be relative or absolute502 * File paths can be relative or absolute

499 * @ file references add CLAUDE.md in the file's directory and parent directories to context503 * @ file references add `CLAUDE.md` in the file's directory and parent directories to context

500 * Directory references show file listings, not contents504 * Directory references show file listings, not contents

501 * You can reference multiple files in a single message (e.g., "@file1.js and @file2.js")505 * You can reference multiple files in a single message (for example, "@file1.js and @file2.js")

502</Tip>506</Tip>

503 507 

504***508***

505 509 

506## Use extended thinking510## Use extended thinking (thinking mode)

507 511 

508Suppose you're working on complex architectural decisions, challenging bugs, or planning multi-step implementations that require deep reasoning.512[Extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) is enabled by default, giving Claude space to reason through complex problems step-by-step before responding. This reasoning is visible in verbose mode, which you can toggle on with `Ctrl+O`.

509 513 

510<Note>514Additionally, Opus 4.6 introduces adaptive reasoning: instead of a fixed thinking token budget, the model dynamically allocates thinking based on your [effort level](/en/model-config#adjust-effort-level) setting. Extended thinking and adaptive reasoning work together to give you control over how deeply Claude reasons before responding.

511 [Extended thinking](/en/docs/build-with-claude/extended-thinking) is disabled by default in Claude Code. You can enable it on-demand by using `Tab` to toggle Thinking on, or by using prompts like "think" or "think hard". You can also enable it permanently by setting the [`MAX_THINKING_TOKENS` environment variable](/en/docs/claude-code/settings#environment-variables) in your settings.

512</Note>

513 515 

514<Steps>516Extended thinking is particularly valuable for complex architectural decisions, challenging bugs, multi-step implementation planning, and evaluating tradeoffs between different approaches.

515 <Step title="Provide context and ask Claude to think">

516 ```

517 > I need to implement a new authentication system using OAuth2 for our API. Think deeply about the best approach for implementing this in our codebase.

518 ```

519 517 

520 Claude will gather relevant information from your codebase and518<Note>

521 use extended thinking, which will be visible in the interface.519 Phrases like "think", "think hard", "ultrathink", and "think more" are interpreted as regular prompt instructions and don't allocate thinking tokens.

522 </Step>520</Note>

523 521 

524 <Step title="Refine the thinking with follow-up prompts">522### Configure thinking mode

525 ```

526 > think about potential security vulnerabilities in this approach

527 ```

528 523 

529 ```524Thinking is enabled by default, but you can adjust or disable it.

530 > think hard about edge cases we should handle

531 ```

532 </Step>

533</Steps>

534 525 

535<Tip>526| Scope | How to configure | Details |

536 Tips to get the most value out of extended thinking:527| ---------------------- | ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |

528| **Effort level** | Adjust in `/model` or set [`CLAUDE_CODE_EFFORT_LEVEL`](/en/settings#environment-variables) | Control thinking depth for Opus 4.6: low, medium, high (default). See [Adjust effort level](/en/model-config#adjust-effort-level) |

529| **Toggle shortcut** | Press `Option+T` (macOS) or `Alt+T` (Windows/Linux) | Toggle thinking on/off for the current session (all models). May require [terminal configuration](/en/terminal-config) to enable Option key shortcuts |

530| **Global default** | Use `/config` to toggle thinking mode | Sets your default across all projects (all models).<br />Saved as `alwaysThinkingEnabled` in `~/.claude/settings.json` |

531| **Limit token budget** | Set [`MAX_THINKING_TOKENS`](/en/settings#environment-variables) environment variable | Limit the thinking budget to a specific number of tokens (ignored on Opus 4.6 unless set to 0). Example: `export MAX_THINKING_TOKENS=10000` |

537 532 

538 [Extended thinking](/en/docs/build-with-claude/extended-thinking) is most valuable for complex tasks such as:533To view Claude's thinking process, press `Ctrl+O` to toggle verbose mode and see the internal reasoning displayed as gray italic text.

539 534 

540 * Planning complex architectural changes535### How extended thinking works

541 * Debugging intricate issues

542 * Creating implementation plans for new features

543 * Understanding complex codebases

544 * Evaluating tradeoffs between different approaches

545 536 

546 Use `Tab` to toggle Thinking on and off during a session.537Extended thinking controls how much internal reasoning Claude performs before responding. More thinking provides more space to explore solutions, analyze edge cases, and self-correct mistakes.

547 538 

548 The way you prompt for thinking results in varying levels of thinking depth:539**With Opus 4.6**, thinking uses adaptive reasoning: the model dynamically allocates thinking tokens based on the [effort level](/en/model-config#adjust-effort-level) you select (low, medium, high). This is the recommended way to tune the tradeoff between speed and reasoning depth.

549 540 

550 * "think" triggers basic extended thinking541**With other models**, thinking uses a fixed budget of up to 31,999 tokens from your output budget. You can limit this with the [`MAX_THINKING_TOKENS`](/en/settings#environment-variables) environment variable, or disable thinking entirely via `/config` or the `Option+T`/`Alt+T` toggle.

551 * intensifying phrases such as "keep hard", "think more", "think a lot", or "think longer" triggers deeper thinking

552 542 

553 For more extended thinking prompting tips, see [Extended thinking tips](/en/docs/build-with-claude/prompt-engineering/extended-thinking-tips).543`MAX_THINKING_TOKENS` is ignored when using Opus 4.6, since adaptive reasoning controls thinking depth instead. The one exception: setting `MAX_THINKING_TOKENS=0` still disables thinking entirely on any model.

554</Tip>

555 544 

556<Note>545<Warning>

557 Claude will display its thinking process as italic gray text above the546 You're charged for all thinking tokens used, even though Claude 4 models show summarized thinking

558 response.547</Warning>

559</Note>

560 548 

561***549***

562 550 

563## Resume previous conversations551## Resume previous conversations

564 552 

565Suppose you've been working on a task with Claude Code and need to continue where you left off in a later session.553When starting Claude Code, you can resume a previous session:

566 554 

567Claude Code provides two options for resuming previous conversations:555* `claude --continue` continues the most recent conversation in the current directory

556* `claude --resume` opens a conversation picker or resumes by name

557* `claude --from-pr 123` resumes sessions linked to a specific pull request

568 558 

569* `--continue` to automatically continue the most recent conversation559From inside an active session, use `/resume` to switch to a different conversation.

570* `--resume` to display a conversation picker560 

561Sessions are stored per project directory. The `/resume` picker shows sessions from the same git repository, including worktrees.

562 

563### Name your sessions

564 

565Give sessions descriptive names to find them later. This is a best practice when working on multiple tasks or features.

571 566 

572<Steps>567<Steps>

573 <Step title="Continue the most recent conversation">568 <Step title="Name the current session">

574 ```bash theme={null}569 Use `/rename` during a session to give it a memorable name:

575 claude --continue570 

571 ```

572 > /rename auth-refactor

576 ```573 ```

577 574 

578 This immediately resumes your most recent conversation without any prompts.575 You can also rename any session from the picker: run `/resume`, navigate to a session, and press `R`.

579 </Step>576 </Step>

580 577 

581 <Step title="Continue in non-interactive mode">578 <Step title="Resume by name later">

579 From the command line:

580 

582 ```bash theme={null}581 ```bash theme={null}

583 claude --continue --print "Continue with my task"582 claude --resume auth-refactor

584 ```583 ```

585 584 

586 Use `--print` with `--continue` to resume the most recent conversation in non-interactive mode, perfect for scripts or automation.585 Or from inside an active session:

587 </Step>

588 586 

589 <Step title="Show conversation picker">

590 ```bash theme={null}

591 claude --resume

592 ```587 ```

588 > /resume auth-refactor

589 ```

590 </Step>

591</Steps>

593 592 

594 This displays an interactive conversation selector with a clean list view showing:593### Use the session picker

595 594 

596 * Session summary (or initial prompt)595The `/resume` command (or `claude --resume` without arguments) opens an interactive session picker with these features:

597 * Metadata: time elapsed, message count, and git branch

598 596 

599 Use arrow keys to navigate and press Enter to select a conversation. Press Esc to exit.597**Keyboard shortcuts in the picker:**

600 </Step>598 

601</Steps>599| Shortcut | Action |

600| :-------- | :------------------------------------------------ |

601| `↑` / `↓` | Navigate between sessions |

602| `→` / `←` | Expand or collapse grouped sessions |

603| `Enter` | Select and resume the highlighted session |

604| `P` | Preview the session content |

605| `R` | Rename the highlighted session |

606| `/` | Search to filter sessions |

607| `A` | Toggle between current directory and all projects |

608| `B` | Filter to sessions from your current git branch |

609| `Esc` | Exit the picker or search mode |

610 

611**Session organization:**

612 

613The picker displays sessions with helpful metadata:

614 

615* Session name or initial prompt

616* Time elapsed since last activity

617* Message count

618* Git branch (if applicable)

619 

620Forked sessions (created with `/rewind` or `--fork-session`) are grouped together under their root session, making it easier to find related conversations.

602 621 

603<Tip>622<Tip>

604 Tips:623 Tips:

605 624 

606 * Conversation history is stored locally on your machine625 * **Name sessions early**: Use `/rename` when starting work on a distinct task—it's much easier to find "payment-integration" than "explain this function" later

607 * Use `--continue` for quick access to your most recent conversation626 * Use `--continue` for quick access to your most recent conversation in the current directory

608 * Use `--resume` when you need to select a specific past conversation627 * Use `--resume session-name` when you know which session you need

609 * When resuming, you'll see the entire conversation history before continuing628 * Use `--resume` (without a name) when you need to browse and select

629 * For scripts, use `claude --continue --print "prompt"` to resume in non-interactive mode

630 * Press `P` in the picker to preview a session before resuming it

610 * The resumed conversation starts with the same model and configuration as the original631 * The resumed conversation starts with the same model and configuration as the original

611 632 

612 How it works:633 How it works:


615 2. **Message Deserialization**: When resuming, the entire message history is restored to maintain context636 2. **Message Deserialization**: When resuming, the entire message history is restored to maintain context

616 3. **Tool State**: Tool usage and results from the previous conversation are preserved637 3. **Tool State**: Tool usage and results from the previous conversation are preserved

617 4. **Context Restoration**: The conversation resumes with all previous context intact638 4. **Context Restoration**: The conversation resumes with all previous context intact

639</Tip>

618 640 

619 Examples:641***

620 642 

621 ```bash theme={null}643## Run parallel Claude Code sessions with Git worktrees

622 # Continue most recent conversation

623 claude --continue

624 644 

625 # Continue most recent conversation with a specific prompt645When working on multiple tasks at once, you need each Claude session to have its own copy of the codebase so changes don't collide. Git worktrees solve this by creating separate working directories that each have their own files and branch, while sharing the same repository history and remote connections. This means you can have Claude working on a feature in one worktree while fixing a bug in another, without either session interfering with the other.

626 claude --continue --print "Show me our progress"

627 646 

628 # Show conversation picker647Use the `--worktree` (`-w`) flag to create an isolated worktree and start Claude in it. The value you pass becomes the worktree directory name and branch name:

629 claude --resume

630 648 

631 # Continue most recent conversation in non-interactive mode649```bash theme={null}

632 claude --continue --print "Run the tests again"650# Start Claude in a worktree named "feature-auth"

633 ```651# Creates .claude/worktrees/feature-auth/ with a new branch

652claude --worktree feature-auth

653 

654# Start another session in a separate worktree

655claude --worktree bugfix-123

656```

657 

658If you omit the name, Claude generates a random one automatically:

659 

660```bash theme={null}

661# Auto-generates a name like "bright-running-fox"

662claude --worktree

663```

664 

665Worktrees are created at `<repo>/.claude/worktrees/<name>` and branch from the default remote branch. The worktree branch is named `worktree-<name>`.

666 

667You can also ask Claude to "work in a worktree" or "start a worktree" during a session, and it will create one automatically.

668 

669### Subagent worktrees

670 

671Subagents can also use worktree isolation to work in parallel without conflicts. Ask Claude to "use worktrees for your agents" or configure it in a [custom subagent](/en/sub-agents#supported-frontmatter-fields) by adding `isolation: worktree` to the agent's frontmatter. Each subagent gets its own worktree that is automatically cleaned up when the subagent finishes without changes.

672 

673### Worktree cleanup

674 

675When you exit a worktree session, Claude handles cleanup based on whether you made changes:

676 

677* **No changes**: the worktree and its branch are removed automatically

678* **Changes or commits exist**: Claude prompts you to keep or remove the worktree. Keeping preserves the directory and branch so you can return later. Removing deletes the worktree directory and its branch, discarding all uncommitted changes and commits

679 

680To clean up worktrees outside of a Claude session, use [manual worktree management](#manage-worktrees-manually).

681 

682<Tip>

683 Add `.claude/worktrees/` to your `.gitignore` to prevent worktree contents from appearing as untracked files in your main repository.

684</Tip>

685 

686### Manage worktrees manually

687 

688For more control over worktree location and branch configuration, create worktrees with Git directly. This is useful when you need to check out a specific existing branch or place the worktree outside the repository.

689 

690```bash theme={null}

691# Create a worktree with a new branch

692git worktree add ../project-feature-a -b feature-a

693 

694# Create a worktree with an existing branch

695git worktree add ../project-bugfix bugfix-123

696 

697# Start Claude in the worktree

698cd ../project-feature-a && claude

699 

700# Clean up when done

701git worktree list

702git worktree remove ../project-feature-a

703```

704 

705Learn more in the [official Git worktree documentation](https://git-scm.com/docs/git-worktree).

706 

707<Tip>

708 Remember to initialize your development environment in each new worktree according to your project's setup. Depending on your stack, this might include running dependency installation (`npm install`, `yarn`), setting up virtual environments, or following your project's standard setup process.

634</Tip>709</Tip>

635 710 

711### Non-git version control

712 

713Worktree isolation works with git by default. For other version control systems like SVN, Perforce, or Mercurial, configure [WorktreeCreate and WorktreeRemove hooks](/en/hooks#worktreecreate) to provide custom worktree creation and cleanup logic. When configured, these hooks replace the default git behavior when you use `--worktree`.

714 

715For automated coordination of parallel sessions with shared tasks and messaging, see [agent teams](/en/agent-teams).

716 

636***717***

637 718 

638## Run parallel Claude Code sessions with Git worktrees719## Get notified when Claude needs your attention

639 720 

640Suppose you need to work on multiple tasks simultaneously with complete code isolation between Claude Code instances.721When you kick off a long-running task and switch to another window, you can set up desktop notifications so you know when Claude finishes or needs your input. This uses the `Notification` [hook event](/en/hooks-guide#get-notified-when-claude-needs-input), which fires whenever Claude is waiting for permission, idle and ready for a new prompt, or completing authentication.

641 722 

642<Steps>723<Steps>

643 <Step title="Understand Git worktrees">724 <Step title="Open the hooks menu">

644 Git worktrees allow you to check out multiple branches from the same725 Type `/hooks` and select `Notification` from the list of events.

645 repository into separate directories. Each worktree has its own working

646 directory with isolated files, while sharing the same Git history. Learn

647 more in the [official Git worktree

648 documentation](https://git-scm.com/docs/git-worktree).

649 </Step>726 </Step>

650 727 

651 <Step title="Create a new worktree">728 <Step title="Configure the matcher">

652 ```bash theme={null}729 Select `+ Match all (no filter)` to fire on all notification types. To notify only for specific events, select `+ Add new matcher…` and enter one of these values:

653 # Create a new worktree with a new branch

654 git worktree add ../project-feature-a -b feature-a

655 

656 # Or create a worktree with an existing branch

657 git worktree add ../project-bugfix bugfix-123

658 ```

659 730 

660 This creates a new directory with a separate working copy of your repository.731 | Matcher | Fires when |

732 | :------------------- | :---------------------------------------------- |

733 | `permission_prompt` | Claude needs you to approve a tool use |

734 | `idle_prompt` | Claude is done and waiting for your next prompt |

735 | `auth_success` | Authentication completes |

736 | `elicitation_dialog` | Claude is asking you a question |

661 </Step>737 </Step>

662 738 

663 <Step title="Run Claude Code in each worktree">739 <Step title="Add your notification command">

664 ```bash theme={null}740 Select `+ Add new hook…` and enter the command for your OS:

665 # Navigate to your worktree 741 

666 cd ../project-feature-a742 <Tabs>

743 <Tab title="macOS">

744 Uses [`osascript`](https://ss64.com/mac/osascript.html) to trigger a native macOS notification through AppleScript:

667 745 

668 # Run Claude Code in this isolated environment

669 claude

670 ```746 ```

671 </Step>747 osascript -e 'display notification "Claude Code needs your attention" with title "Claude Code"'

748 ```

749 </Tab>

750 

751 <Tab title="Linux">

752 Uses `notify-send`, which is pre-installed on most Linux desktops with a notification daemon:

672 753 

673 <Step title="Run Claude in another worktree">

674 ```bash theme={null}

675 cd ../project-bugfix

676 claude

677 ```754 ```

678 </Step>755 notify-send 'Claude Code' 'Claude Code needs your attention'

756 ```

757 </Tab>

679 758 

680 <Step title="Manage your worktrees">759 <Tab title="Windows (PowerShell)">

681 ```bash theme={null}760 Uses PowerShell to show a native message box through .NET's Windows Forms:

682 # List all worktrees

683 git worktree list

684 761 

685 # Remove a worktree when done

686 git worktree remove ../project-feature-a

687 ```762 ```

763 powershell.exe -Command "[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')"

764 ```

765 </Tab>

766 </Tabs>

688 </Step>767 </Step>

689</Steps>

690 768 

691<Tip>769 <Step title="Save to user settings">

692 Tips:770 Select `User settings` to apply the notification across all your projects.

771 </Step>

772</Steps>

693 773 

694 * Each worktree has its own independent file state, making it perfect for parallel Claude Code sessions774For the full walkthrough with JSON configuration examples, see [Automate workflows with hooks](/en/hooks-guide#get-notified-when-claude-needs-input). For the complete event schema and notification types, see the [Notification reference](/en/hooks#notification).

695 * Changes made in one worktree won't affect others, preventing Claude instances from interfering with each other

696 * All worktrees share the same Git history and remote connections

697 * For long-running tasks, you can have Claude working in one worktree while you continue development in another

698 * Use descriptive directory names to easily identify which task each worktree is for

699 * Remember to initialize your development environment in each new worktree according to your project's setup. Depending on your stack, this might include:

700 * JavaScript projects: Running dependency installation (`npm install`, `yarn`)

701 * Python projects: Setting up virtual environments or installing with package managers

702 * Other languages: Following your project's standard setup process

703</Tip>

704 775 

705***776***

706 777 


789 860 

790***861***

791 862 

792## Create custom slash commands

793 

794Claude Code supports custom slash commands that you can create to quickly execute specific prompts or tasks.

795 

796For more details, see the [Slash commands](/en/docs/claude-code/slash-commands) reference page.

797 

798### Create project-specific commands

799 

800Suppose you want to create reusable slash commands for your project that all team members can use.

801 

802<Steps>

803 <Step title="Create a commands directory in your project">

804 ```bash theme={null}

805 mkdir -p .claude/commands

806 ```

807 </Step>

808 

809 <Step title="Create a Markdown file for each command">

810 ```bash theme={null}

811 echo "Analyze the performance of this code and suggest three specific optimizations:" > .claude/commands/optimize.md

812 ```

813 </Step>

814 

815 <Step title="Use your custom command in Claude Code">

816 ```

817 > /optimize

818 ```

819 </Step>

820</Steps>

821 

822<Tip>

823 Tips:

824 

825 * Command names are derived from the filename (e.g., `optimize.md` becomes `/optimize`)

826 * You can organize commands in subdirectories (e.g., `.claude/commands/frontend/component.md` creates `/component` with "(project:frontend)" shown in the description)

827 * Project commands are available to everyone who clones the repository

828 * The Markdown file content becomes the prompt sent to Claude when the command is invoked

829</Tip>

830 

831### Add command arguments with \$ARGUMENTS

832 

833Suppose you want to create flexible slash commands that can accept additional input from users.

834 

835<Steps>

836 <Step title="Create a command file with the $ARGUMENTS placeholder">

837 ```bash theme={null}

838 echo 'Find and fix issue #$ARGUMENTS. Follow these steps: 1.

839 Understand the issue described in the ticket 2. Locate the relevant code in

840 our codebase 3. Implement a solution that addresses the root cause 4. Add

841 appropriate tests 5. Prepare a concise PR description' >

842 .claude/commands/fix-issue.md

843 ```

844 </Step>

845 

846 <Step title="Use the command with an issue number">

847 In your Claude session, use the command with arguments.

848 

849 ```

850 > /fix-issue 123

851 ```

852 

853 This will replace \$ARGUMENTS with "123" in the prompt.

854 </Step>

855</Steps>

856 

857<Tip>

858 Tips:

859 

860 * The \$ARGUMENTS placeholder is replaced with any text that follows the command

861 * You can position \$ARGUMENTS anywhere in your command template

862 * Other useful applications: generating test cases for specific functions, creating documentation for components, reviewing code in particular files, or translating content to specified languages

863</Tip>

864 

865### Create personal slash commands

866 

867Suppose you want to create personal slash commands that work across all your projects.

868 

869<Steps>

870 <Step title="Create a commands directory in your home folder">

871 ```bash theme={null}

872 mkdir -p ~/.claude/commands

873 ```

874 </Step>

875 

876 <Step title="Create a Markdown file for each command">

877 ```bash theme={null}

878 echo "Review this code for security vulnerabilities, focusing on:" >

879 ~/.claude/commands/security-review.md

880 ```

881 </Step>

882 

883 <Step title="Use your personal custom command">

884 ```

885 > /security-review

886 ```

887 </Step>

888</Steps>

889 

890<Tip>

891 Tips:

892 

893 * Personal commands show "(user)" in their description when listed with `/help`

894 * Personal commands are only available to you and not shared with your team

895 * Personal commands work across all your projects

896 * You can use these for consistent workflows across different codebases

897</Tip>

898 

899***

900 

901## Ask Claude about its capabilities863## Ask Claude about its capabilities

902 864 

903Claude has built-in access to its documentation and can answer questions about its own features and limitations.865Claude has built-in access to its documentation and can answer questions about its own features and limitations.


913```875```

914 876 

915```877```

916> what slash commands are available?878> what skills are available?

917```879```

918 880 

919```881```


944 906 

945## Next steps907## Next steps

946 908 

947<Card title="Claude Code reference implementation" icon="code" href="https://github.com/anthropics/claude-code/tree/main/.devcontainer">909<CardGroup cols={2}>

948 Clone our development container reference implementation.910 <Card title="Best practices" icon="lightbulb" href="/en/best-practices">

949</Card>911 Patterns for getting the most out of Claude Code

912 </Card>

913 

914 <Card title="How Claude Code works" icon="gear" href="/en/how-claude-code-works">

915 Understand the agentic loop and context management

916 </Card>

917 

918 <Card title="Extend Claude Code" icon="puzzle-piece" href="/en/features-overview">

919 Add skills, hooks, MCP, subagents, and plugins

920 </Card>

921 

922 <Card title="Reference implementation" icon="code" href="https://github.com/anthropics/claude-code/tree/main/.devcontainer">

923 Clone our development container reference implementation

924 </Card>

925</CardGroup>

costs.md +129 −58

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Manage costs effectively5# Manage costs effectively

2 6 

3> Learn how to track and optimize token usage and costs when using Claude Code.7> Track token usage, set team spend limits, and reduce Claude Code costs with context management, model selection, extended thinking settings, and preprocessing hooks.

8 

9Claude Code consumes tokens for each interaction. Costs vary based on codebase size, query complexity, and conversation length. The average cost is \$6 per developer per day, with daily costs remaining below \$12 for 90% of users.

4 10 

5Claude Code consumes tokens for each interaction. The average cost is \$6 per developer per day, with daily costs remaining below \$12 for 90% of users.11For team usage, Claude Code charges by API token consumption. On average, Claude Code costs \~\$100-200/developer per month with Sonnet 4.6 though there is large variance depending on how many instances users are running and whether they're using it in automation.

6 12 

7For team usage, Claude Code charges by API token consumption. On average, Claude Code costs \~\$100-200/developer per month with Sonnet 4.5 though there is large variance depending on how many instances users are running and whether they're using it in automation.13This page covers how to [track your costs](#track-your-costs), [manage costs for teams](#managing-costs-for-teams), and [reduce token usage](#reduce-token-usage).

8 14 

9## Track your costs15## Track your costs

10 16 

11### Using the `/cost` command17### Using the `/cost` command

12 18 

13<Note>19<Note>

14 The `/cost` command is not intended for Claude Max and Pro subscribers.20 The `/cost` command shows API token usage and is intended for API users. Claude Max and Pro subscribers have usage included in their subscription, so `/cost` data isn't relevant for billing purposes. Subscribers can use `/stats` to view usage patterns.

15</Note>21</Note>

16 22 

17The `/cost` command provides detailed token usage statistics for your current session:23The `/cost` command provides detailed token usage statistics for your current session:


23Total code changes: 0 lines added, 0 lines removed29Total code changes: 0 lines added, 0 lines removed

24```30```

25 31 

26### Additional tracking options32## Managing costs for teams

27 33 

28Check [historical usage](https://support.claude.com/en/articles/9534590-cost-and-usage-reporting-in-console) in the Claude Console (requires Admin or Billing role) and set [workspace spend limits](https://support.claude.com/en/articles/9796807-creating-and-managing-workspaces) for the Claude Code workspace (requires Admin role).34When using Claude API, you can [set workspace spend limits](https://platform.claude.com/docs/en/build-with-claude/workspaces#workspace-limits) on the total Claude Code workspace spend. Admins can [view cost and usage reporting](https://platform.claude.com/docs/en/build-with-claude/workspaces#usage-and-cost-tracking) in the Console.

29 35 

30<Note>36<Note>

31 When you first authenticate Claude Code with your Claude Console account, a workspace called "Claude Code" is automatically created for you. This workspace provides centralized cost tracking and management for all Claude Code usage in your organization. You cannot create API keys for this workspace - it is exclusively for Claude Code authentication and usage.37 When you first authenticate Claude Code with your Claude Console account, a workspace called "Claude Code" is automatically created for you. This workspace provides centralized cost tracking and management for all Claude Code usage in your organization. You cannot create API keys for this workspace; it is exclusively for Claude Code authentication and usage.

32</Note>38</Note>

33 39 

34## Managing costs for teams40On Bedrock, Vertex, and Foundry, Claude Code does not send metrics from your cloud. To get cost metrics, several large enterprises reported using [LiteLLM](/en/llm-gateway#litellm-configuration), which is an open-source tool that helps companies [track spend by key](https://docs.litellm.ai/docs/proxy/virtual_keys#tracking-spend). This project is unaffiliated with Anthropic and has not been audited for security.

35 

36When using Claude API, you can limit the total Claude Code workspace spend. To configure, [follow these instructions](https://support.claude.com/en/articles/9796807-creating-and-managing-workspaces). Admins can view cost and usage reporting by [following these instructions](https://support.claude.com/en/articles/9534590-cost-and-usage-reporting-in-console).

37 

38On Bedrock and Vertex, Claude Code does not send metrics from your cloud. In order to get cost metrics, several large enterprises reported using [LiteLLM](/en/docs/claude-code/bedrock-vertex-proxies#litellm), which is an open-source tool that helps companies [track spend by key](https://docs.litellm.ai/docs/proxy/virtual_keys#tracking-spend). This project is unaffiliated with Anthropic and we have not audited its security.

39 41 

40### Rate limit recommendations42### Rate limit recommendations

41 43 


52 54 

53For example, if you have 200 users, you might request 20k TPM for each user, or 4 million total TPM (200\*20,000 = 4 million).55For example, if you have 200 users, you might request 20k TPM for each user, or 4 million total TPM (200\*20,000 = 4 million).

54 56 

55The TPM per user decreases as team size grows because we expect fewer users to use Claude Code concurrently in larger organizations. These rate limits apply at the organization level, not per individual user, which means individual users can temporarily consume more than their calculated share when others aren't actively using the service.57The TPM per user decreases as team size grows because fewer users tend to use Claude Code concurrently in larger organizations. These rate limits apply at the organization level, not per individual user, which means individual users can temporarily consume more than their calculated share when others aren't actively using the service.

56 58 

57<Note>59<Note>

58 If you anticipate scenarios with unusually high concurrent usage (such as live training sessions with large groups), you may need higher TPM allocations per user.60 If you anticipate scenarios with unusually high concurrent usage (such as live training sessions with large groups), you may need higher TPM allocations per user.

59</Note>61</Note>

60 62 

63### Agent team token costs

64 

65[Agent teams](/en/agent-teams) spawn multiple Claude Code instances, each with its own context window. Token usage scales with the number of active teammates and how long each one runs.

66 

67To keep agent team costs manageable:

68 

69* Use Sonnet for teammates. It balances capability and cost for coordination tasks.

70* Keep teams small. Each teammate runs its own context window, so token usage is roughly proportional to team size.

71* Keep spawn prompts focused. Teammates load CLAUDE.md, MCP servers, and skills automatically, but everything in the spawn prompt adds to their context from the start.

72* Clean up teams when work is done. Active teammates continue consuming tokens even if idle.

73* Agent teams are disabled by default. Set `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` in your [settings.json](/en/settings) or environment to enable them. See [enable agent teams](/en/agent-teams#enable-agent-teams).

74 

61## Reduce token usage75## Reduce token usage

62 76 

63* **Compact conversations:**77Token costs scale with context size: the more context Claude processes, the more tokens you use. Claude Code automatically optimizes costs through prompt caching (which reduces costs for repeated content like system prompts) and auto-compaction (which summarizes conversation history when approaching context limits).

64 78 

65 * Claude uses auto-compact by default when context exceeds 95% capacity79The following strategies help you keep context small and reduce per-message costs.

66 * Toggle auto-compact: Run `/config` and navigate to "Auto-compact enabled"

67 * Use `/compact` manually when context gets large

68 * Add custom instructions: `/compact Focus on code samples and API usage`

69 * Customize compaction by adding to CLAUDE.md:

70 80 

71 ```markdown theme={null}81### Manage context proactively

72 # Summary instructions

73 82 

74 When you are using compact, please focus on test output and code changes83Use `/cost` to check your current token usage, or [configure your status line](/en/statusline#context-window-usage) to display it continuously.

75 ```

76 84 

77* **Write specific queries:** Avoid vague requests that trigger unnecessary scanning85* **Clear between tasks**: Use `/clear` to start fresh when switching to unrelated work. Stale context wastes tokens on every subsequent message. Use `/rename` before clearing so you can easily find the session later, then `/resume` to return to it.

86* **Add custom compaction instructions**: `/compact Focus on code samples and API usage` tells Claude what to preserve during summarization.

78 87 

79* **Break down complex tasks:** Split large tasks into focused interactions88You can also customize compaction behavior in your CLAUDE.md:

80 89 

81* **Clear history between tasks:** Use `/clear` to reset context90```markdown theme={null}

91# Compact instructions

82 92 

83Costs can vary significantly based on:93When you are using compact, please focus on test output and code changes

94```

84 95 

85* Size of codebase being analyzed96### Choose the right model

86* Complexity of queries

87* Number of files being searched or modified

88* Length of conversation history

89* Frequency of compacting conversations

90 97 

91## Background token usage98Sonnet handles most coding tasks well and costs less than Opus. Reserve Opus for complex architectural decisions or multi-step reasoning. Use `/model` to switch models mid-session, or set a default in `/config`. For simple subagent tasks, specify `model: haiku` in your [subagent configuration](/en/sub-agents#choose-a-model).

92 99 

93Claude Code uses tokens for some background functionality even when idle:100### Reduce MCP server overhead

94 101 

95* **Conversation summarization**: Background jobs that summarize previous conversations for the `claude --resume` feature102Each MCP server adds tool definitions to your context, even when idle. Run `/context` to see what's consuming space.

96* **Command processing**: Some commands like `/cost` may generate requests to check status

97 103 

98These background processes consume a small amount of tokens (typically under \$0.04 per session) even without active interaction.104* **Prefer CLI tools when available**: Tools like `gh`, `aws`, `gcloud`, and `sentry-cli` are more context-efficient than MCP servers because they don't add persistent tool definitions. Claude can run CLI commands directly without the overhead.

105* **Disable unused servers**: Run `/mcp` to see configured servers and disable any you're not actively using.

106* **Tool search is automatic**: When MCP tool descriptions exceed 10% of your context window, Claude Code automatically defers them and loads tools on-demand via [tool search](/en/mcp#scale-with-mcp-tool-search). Since deferred tools only enter context when actually used, a lower threshold means fewer idle tool definitions consuming space. Set a lower threshold with `ENABLE_TOOL_SEARCH=auto:<N>` (for example, `auto:5` triggers when tools exceed 5% of your context window).

99 107 

100## Tracking version changes and updates108### Install code intelligence plugins for typed languages

101 109 

102### Current version information110[Code intelligence plugins](/en/discover-plugins#code-intelligence) give Claude precise symbol navigation instead of text-based search, reducing unnecessary file reads when exploring unfamiliar code. A single "go to definition" call replaces what might otherwise be a grep followed by reading multiple candidate files. Installed language servers also report type errors automatically after edits, so Claude catches mistakes without running a compiler.

103 111 

104To check your current Claude Code version and installation details:112### Offload processing to hooks and skills

105 113 

106```bash theme={null}114Custom [hooks](/en/hooks) can preprocess data before Claude sees it. Instead of Claude reading a 10,000-line log file to find errors, a hook can grep for `ERROR` and return only matching lines, reducing context from tens of thousands of tokens to hundreds.

107claude doctor

108```

109 115 

110This command shows your version, installation type, and system information.116A [skill](/en/skills) can give Claude domain knowledge so it doesn't have to explore. For example, a "codebase-overview" skill could describe your project's architecture, key directories, and naming conventions. When Claude invokes the skill, it gets this context immediately instead of spending tokens reading multiple files to understand the structure.

111 117 

112### Understanding changes in Claude Code behavior118For example, this PreToolUse hook filters test output to show only failures:

113 119 

114Claude Code regularly receives updates that may change how features work, including cost reporting:120<Tabs>

121 <Tab title="settings.json">

122 Add this to your [settings.json](/en/settings#settings-files) to run the hook before every Bash command:

115 123 

116* **Version tracking**: Use `claude doctor` to see your current version124 ```json theme={null}

117* **Behavior changes**: Features like `/cost` may display information differently across versions125 {

118* **Documentation access**: Claude always has access to the latest documentation, which can help explain current feature behavior126 "hooks": {

127 "PreToolUse": [

128 {

129 "matcher": "Bash",

130 "hooks": [

131 {

132 "type": "command",

133 "command": "~/.claude/hooks/filter-test-output.sh"

134 }

135 ]

136 }

137 ]

138 }

139 }

140 ```

141 </Tab>

142 

143 <Tab title="filter-test-output.sh">

144 The hook calls this script, which checks if the command is a test runner and modifies it to show only failures:

145 

146 ```bash theme={null}

147 #!/bin/bash

148 input=$(cat)

149 cmd=$(echo "$input" | jq -r '.tool_input.command')

150 

151 # If running tests, filter to show only failures

152 if [[ "$cmd" =~ ^(npm test|pytest|go test) ]]; then

153 filtered_cmd="$cmd 2>&1 | grep -A 5 -E '(FAIL|ERROR|error:)' | head -100"

154 echo "{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"allow\",\"updatedInput\":{\"command\":\"$filtered_cmd\"}}}"

155 else

156 echo "{}"

157 fi

158 ```

159 </Tab>

160</Tabs>

119 161 

120### When cost reporting changes162### Move instructions from CLAUDE.md to skills

121 163 

122If you notice changes in how costs are displayed (such as the `/cost` command showing different information):164Your [CLAUDE.md](/en/memory) file is loaded into context at session start. If it contains detailed instructions for specific workflows (like PR reviews or database migrations), those tokens are present even when you're doing unrelated work. [Skills](/en/skills) load on-demand only when invoked, so moving specialized instructions into skills keeps your base context smaller. Aim to keep CLAUDE.md under \~500 lines by including only essentials.

123 165 

1241. **Verify your version**: Run `claude doctor` to confirm your current version166### Adjust extended thinking

1252. **Consult documentation**: Ask Claude directly about current feature behavior, as it has access to up-to-date documentation

1263. **Contact support**: For specific billing questions, contact Anthropic support through your Console account

127 167 

128<Note>168Extended thinking is enabled by default with a budget of 31,999 tokens because it significantly improves performance on complex planning and reasoning tasks. However, thinking tokens are billed as output tokens, so for simpler tasks where deep reasoning isn't needed, you can reduce costs by lowering the [effort level](/en/model-config#adjust-effort-level) in `/model` for Opus 4.6, disabling thinking in `/config`, or lowering the budget (for example, `MAX_THINKING_TOKENS=8000`).

129 For team deployments, we recommend starting with a small pilot group to169 

130 establish usage patterns before wider rollout.170### Delegate verbose operations to subagents

131</Note>171 

172Running tests, fetching documentation, or processing log files can consume significant context. Delegate these to [subagents](/en/sub-agents#isolate-high-volume-operations) so the verbose output stays in the subagent's context while only a summary returns to your main conversation.

173 

174### Manage agent team costs

175 

176Agent teams use approximately 7x more tokens than standard sessions when teammates run in plan mode, because each teammate maintains its own context window and runs as a separate Claude instance. Keep team tasks small and self-contained to limit per-teammate token usage. See [agent teams](/en/agent-teams) for details.

177 

178### Write specific prompts

179 

180Vague requests like "improve this codebase" trigger broad scanning. Specific requests like "add input validation to the login function in auth.ts" let Claude work efficiently with minimal file reads.

181 

182### Work efficiently on complex tasks

183 

184For longer or more complex work, these habits help avoid wasted tokens from going down the wrong path:

185 

186* **Use plan mode for complex tasks**: Press Shift+Tab to enter [plan mode](/en/common-workflows#use-plan-mode-for-safe-code-analysis) before implementation. Claude explores the codebase and proposes an approach for your approval, preventing expensive re-work when the initial direction is wrong.

187* **Course-correct early**: If Claude starts heading the wrong direction, press Escape to stop immediately. Use `/rewind` or double-tap Escape to restore conversation and code to a previous checkpoint.

188* **Give verification targets**: Include test cases, paste screenshots, or define expected output in your prompt. When Claude can verify its own work, it catches issues before you need to request fixes.

189* **Test incrementally**: Write one file, test it, then continue. This catches issues early when they're cheap to fix.

190 

191## Background token usage

192 

193Claude Code uses tokens for some background functionality even when idle:

194 

195* **Conversation summarization**: Background jobs that summarize previous conversations for the `claude --resume` feature

196* **Command processing**: Some commands like `/cost` may generate requests to check status

197 

198These background processes consume a small amount of tokens (typically under \$0.04 per session) even without active interaction.

199 

200## Understanding changes in Claude Code behavior

201 

202Claude Code regularly receives updates that may change how features work, including cost reporting. Run `claude --version` to check your current version. For specific billing questions, contact Anthropic support through your [Console account](https://platform.claude.com/login). For team deployments, start with a small pilot group to establish usage patterns before wider rollout.

data-usage.md +32 −32

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Data usage5# Data usage

2 6 

3> Learn about Anthropic's data usage policies for Claude7> Learn about Anthropic's data usage policies for Claude


7### Data training policy11### Data training policy

8 12 

9**Consumer users (Free, Pro, and Max plans)**:13**Consumer users (Free, Pro, and Max plans)**:

10Starting August 28, 2025, we're giving you the choice to allow your data to be used to improve future Claude models.14We give you the choice to allow your data to be used to improve future Claude models. We will train new models using data from Free, Pro, and Max accounts when this setting is on (including when you use Claude Code from these accounts).

11 

12We will train new models using data from Free, Pro, and Max accounts when this setting is on (including when you use Claude Code from these accounts).

13 15 

14* If you're a current user, you can select your preference now and your selection will immediately go into effect.16**Commercial users**: (Team and Enterprise plans, API, 3rd-party platforms, and Claude Gov) maintain existing policies: Anthropic does not train generative models using code or prompts sent to Claude Code under commercial terms, unless the customer has chosen to provide their data to us for model improvement (for example, the [Developer Partner Program](https://support.claude.com/en/articles/11174108-about-the-development-partner-program)).

15 This setting will only apply to new or resumed chats and coding sessions on Claude. Previous chats with no additional activity will not be used for model training.

16* You have until October 8, 2025 to make your selection.

17 If you're a new user, you can pick your setting for model training during the signup process.

18 You can change your selection at any time in your Privacy Settings.

19 

20**Commercial users**: (Team and Enterprise plans, API, 3rd-party platforms, and Claude Gov) maintain existing policies: Anthropic does not train generative models using code or prompts sent to Claude Code under commercial terms, unless the customer has chosen to provide their data to us for model improvement (e.g. [Developer Partner Program](https://support.claude.com/en/articles/11174108-about-the-development-partner-program)).

21 17 

22### Development Partner Program18### Development Partner Program

23 19 


31 27 

32When you see the "How is Claude doing this session?" prompt in Claude Code, responding to this survey (including selecting "Dismiss"), only your numeric rating (1, 2, 3, or dismiss) is recorded. We do not collect or store any conversation transcripts, inputs, outputs, or other session data as part of this survey. Unlike thumbs up/down feedback or `/bug` reports, this session quality survey is a simple product satisfaction metric. Your responses to this survey do not impact your data training preferences and cannot be used to train our AI models.28When you see the "How is Claude doing this session?" prompt in Claude Code, responding to this survey (including selecting "Dismiss"), only your numeric rating (1, 2, 3, or dismiss) is recorded. We do not collect or store any conversation transcripts, inputs, outputs, or other session data as part of this survey. Unlike thumbs up/down feedback or `/bug` reports, this session quality survey is a simple product satisfaction metric. Your responses to this survey do not impact your data training preferences and cannot be used to train our AI models.

33 29 

30To disable these surveys, set `CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1`. The survey is also automatically disabled when using third-party providers (Bedrock, Vertex, Foundry) or when telemetry is disabled.

31 

34### Data retention32### Data retention

35 33 

36Anthropic retains Claude Code data based on your account type and preferences.34Anthropic retains Claude Code data based on your account type and preferences.


39 37 

40* Users who allow data use for model improvement: 5-year retention period to support model development and safety improvements38* Users who allow data use for model improvement: 5-year retention period to support model development and safety improvements

41* Users who don't allow data use for model improvement: 30-day retention period39* Users who don't allow data use for model improvement: 30-day retention period

42* Privacy settings can be changed at any time at [claude.ai/settings/data-privacy-controls](claude.ai/settings/data-privacy-controls).40* Privacy settings can be changed at any time at [claude.ai/settings/data-privacy-controls](https://claude.ai/settings/data-privacy-controls).

43 41 

44**Commercial users (Team, Enterprise, and API)**:42**Commercial users (Team, Enterprise, and API)**:

45 43 


51 49 

52For full details, please review our [Commercial Terms of Service](https://www.anthropic.com/legal/commercial-terms) (for Team, Enterprise, and API users) or [Consumer Terms](https://www.anthropic.com/legal/consumer-terms) (for Free, Pro, and Max users) and [Privacy Policy](https://www.anthropic.com/legal/privacy).50For full details, please review our [Commercial Terms of Service](https://www.anthropic.com/legal/commercial-terms) (for Team, Enterprise, and API users) or [Consumer Terms](https://www.anthropic.com/legal/consumer-terms) (for Free, Pro, and Max users) and [Privacy Policy](https://www.anthropic.com/legal/privacy).

53 51 

54## Data flow and dependencies52## Data access

55 53 

56<img src="https://mintcdn.com/anthropic-claude-docs/LF5WV0SNF6oudpT5/images/claude-code-data-flow.png?fit=max&auto=format&n=LF5WV0SNF6oudpT5&q=85&s=4b30069d702719e7bfb974eaaafab21c" alt="Claude Code data flow diagram" data-og-width="1597" width="1597" data-og-height="1285" height="1285" data-path="images/claude-code-data-flow.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/anthropic-claude-docs/LF5WV0SNF6oudpT5/images/claude-code-data-flow.png?w=280&fit=max&auto=format&n=LF5WV0SNF6oudpT5&q=85&s=067676caa12f89051cb193e6b3f7d0a0 280w, https://mintcdn.com/anthropic-claude-docs/LF5WV0SNF6oudpT5/images/claude-code-data-flow.png?w=560&fit=max&auto=format&n=LF5WV0SNF6oudpT5&q=85&s=5506197deff927f54f2fb5a349f358a8 560w, https://mintcdn.com/anthropic-claude-docs/LF5WV0SNF6oudpT5/images/claude-code-data-flow.png?w=840&fit=max&auto=format&n=LF5WV0SNF6oudpT5&q=85&s=bb4febe7974dde5b76b88744f89ab472 840w, https://mintcdn.com/anthropic-claude-docs/LF5WV0SNF6oudpT5/images/claude-code-data-flow.png?w=1100&fit=max&auto=format&n=LF5WV0SNF6oudpT5&q=85&s=b51af3074f87b33ccc342aaad655dcbf 1100w, https://mintcdn.com/anthropic-claude-docs/LF5WV0SNF6oudpT5/images/claude-code-data-flow.png?w=1650&fit=max&auto=format&n=LF5WV0SNF6oudpT5&q=85&s=8fd96f1dde615877d4e4bbe1874af12d 1650w, https://mintcdn.com/anthropic-claude-docs/LF5WV0SNF6oudpT5/images/claude-code-data-flow.png?w=2500&fit=max&auto=format&n=LF5WV0SNF6oudpT5&q=85&s=056deded541ec30e9b67a67d620f6aaf 2500w" />54For all first party users, you can learn more about what data is logged for [local Claude Code](#local-claude-code-data-flow-and-dependencies) and [remote Claude Code](#cloud-execution-data-flow-and-dependencies). [Remote Control](/en/remote-control) sessions follow the local data flow since all execution happens on your machine. Note for remote Claude Code, Claude accesses the repository where you initiate your Claude Code session. Claude does not access repositories that you have connected but have not started a session in.

55 

56## Local Claude Code: Data flow and dependencies

57 

58The diagram below shows how Claude Code connects to external services during installation and normal operation. Solid lines indicate required connections, while dashed lines represent optional or user-initiated data flows.

59 

60<img src="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/claude-code-data-flow.svg?fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=e0239c69a0bbae485b726338e50f1082" alt="Diagram showing Claude Code's external connections: install/update connects to NPM, and user requests connect to Anthropic services including Console auth, public-api, and optionally Statsig, Sentry, and bug reporting" data-og-width="720" width="720" data-og-height="520" height="520" data-path="images/claude-code-data-flow.svg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/claude-code-data-flow.svg?w=280&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=06435e080df22e66a454e99af1b6040b 280w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/claude-code-data-flow.svg?w=560&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=8261c15b4ffc12504e0a6e3f0ccd8c7d 560w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/claude-code-data-flow.svg?w=840&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=163bfaa8d4727a1bbb492cb086e5f083 840w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/claude-code-data-flow.svg?w=1100&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=ea3c2f801dfa5ad956b18b5f72df5c50 1100w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/claude-code-data-flow.svg?w=1650&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=91d743def7a8d074c93001b351f23037 1650w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/claude-code-data-flow.svg?w=2500&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=df68b2dd6de83316f70fd7f61c3a3bbd 2500w" />

57 61 

58Claude Code is installed from [NPM](https://www.npmjs.com/package/@anthropic-ai/claude-code). Claude Code runs locally. In order to interact with the LLM, Claude Code sends data over the network. This data includes all user prompts and model outputs. The data is encrypted in transit via TLS and is not encrypted at rest. Claude Code is compatible with most popular VPNs and LLM proxies.62Claude Code is installed from [NPM](https://www.npmjs.com/package/@anthropic-ai/claude-code). Claude Code runs locally. In order to interact with the LLM, Claude Code sends data over the network. This data includes all user prompts and model outputs. The data is encrypted in transit via TLS and is not encrypted at rest. Claude Code is compatible with most popular VPNs and LLM proxies.

59 63 

60Claude Code is built on Anthropic's APIs. For details regarding our API's security controls, including our API logging procedures, please refer to compliance artifacts offered in the [Anthropic Trust Center](https://trust.anthropic.com).64Claude Code is built on Anthropic's APIs. For details regarding our API's security controls, including our API logging procedures, please refer to compliance artifacts offered in the [Anthropic Trust Center](https://trust.anthropic.com).

61 65 

62### Cloud execution66### Cloud execution: Data flow and dependencies

63 

64<Note>

65 The above data flow diagram and description applies to Claude Code CLI running locally on your machine. For cloud-based sessions using Claude Code on the web, see the section below.

66</Note>

67 67 

68When using [Claude Code on the web](/en/docs/claude-code/claude-code-on-the-web), sessions run in Anthropic-managed virtual machines instead of locally. In cloud environments:68When using [Claude Code on the web](/en/claude-code-on-the-web), sessions run in Anthropic-managed virtual machines instead of locally. In cloud environments:

69 69 

70* **Code storage**: Your repository is cloned to an isolated VM and automatically deleted after session completion70* **Code and data storage:** Your repository is cloned to an isolated VM. Code and session data are subject to the retention and usage policies for your account type (see Data retention section above)

71* **Credentials**: GitHub authentication is handled through a secure proxy; your GitHub credentials never enter the sandbox71* **Credentials:** GitHub authentication is handled through a secure proxy; your GitHub credentials never enter the sandbox

72* **Network traffic**: All outbound traffic goes through a security proxy for audit logging and abuse prevention72* **Network traffic:** All outbound traffic goes through a security proxy for audit logging and abuse prevention

73* **Data retention**: Code and session data are subject to the retention and usage policies for your account type73* **Session data:** Prompts, code changes, and outputs follow the same data policies as local Claude Code usage

74* **Session data**: Prompts, code changes, and outputs follow the same data policies as local Claude Code usage

75 74 

76For security details about cloud execution, see [Security](/en/docs/claude-code/security#cloud-execution-security).75For security details about cloud execution, see [Security](/en/security#cloud-execution-security).

77 76 

78## Telemetry services77## Telemetry services

79 78 


85 84 

86## Default behaviors by API provider85## Default behaviors by API provider

87 86 

88By default, we disable all non-essential traffic (including error reporting, telemetry, and bug reporting functionality) when using Bedrock or Vertex. You can also opt out of all of these at once by setting the `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` environment variable. Here are the full default behaviors:87By default, we disable all non-essential traffic (including error reporting, telemetry, bug reporting functionality, and session quality surveys) when using Bedrock, Vertex, or Foundry. You can also opt out of all of these at once by setting the `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` environment variable. Here are the full default behaviors:

89 88 

90| Service | Claude API | Vertex API | Bedrock API |89| Service | Claude API | Vertex API | Bedrock API | Foundry API |

91| ------------------------------- | -------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------ |90| ------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------ |

92| **Statsig (Metrics)** | Default on.<br />`DISABLE_TELEMETRY=1` to disable. | Default off.<br />`CLAUDE_CODE_USE_VERTEX` must be 1. | Default off.<br />`CLAUDE_CODE_USE_BEDROCK` must be 1. |91| **Statsig (Metrics)** | Default on.<br />`DISABLE_TELEMETRY=1` to disable. | Default off.<br />`CLAUDE_CODE_USE_VERTEX` must be 1. | Default off.<br />`CLAUDE_CODE_USE_BEDROCK` must be 1. | Default off.<br />`CLAUDE_CODE_USE_FOUNDRY` must be 1. |

93| **Sentry (Errors)** | Default on.<br />`DISABLE_ERROR_REPORTING=1` to disable. | Default off.<br />`CLAUDE_CODE_USE_VERTEX` must be 1. | Default off.<br />`CLAUDE_CODE_USE_BEDROCK` must be 1. |92| **Sentry (Errors)** | Default on.<br />`DISABLE_ERROR_REPORTING=1` to disable. | Default off.<br />`CLAUDE_CODE_USE_VERTEX` must be 1. | Default off.<br />`CLAUDE_CODE_USE_BEDROCK` must be 1. | Default off.<br />`CLAUDE_CODE_USE_FOUNDRY` must be 1. |

94| **Claude API (`/bug` reports)** | Default on.<br />`DISABLE_BUG_COMMAND=1` to disable. | Default off.<br />`CLAUDE_CODE_USE_VERTEX` must be 1. | Default off.<br />`CLAUDE_CODE_USE_BEDROCK` must be 1. |93| **Claude API (`/bug` reports)** | Default on.<br />`DISABLE_BUG_COMMAND=1` to disable. | Default off.<br />`CLAUDE_CODE_USE_VERTEX` must be 1. | Default off.<br />`CLAUDE_CODE_USE_BEDROCK` must be 1. | Default off.<br />`CLAUDE_CODE_USE_FOUNDRY` must be 1. |

94| **Session quality surveys** | Default on.<br />`CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY=1` to disable. | Default off.<br />`CLAUDE_CODE_USE_VERTEX` must be 1. | Default off.<br />`CLAUDE_CODE_USE_BEDROCK` must be 1. | Default off.<br />`CLAUDE_CODE_USE_FOUNDRY` must be 1. |

95 95 

96All environment variables can be checked into `settings.json` ([read more](/en/docs/claude-code/settings)).96All environment variables can be checked into `settings.json` ([read more](/en/settings)).

desktop.md +546 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Use Claude Code Desktop

6 

7> Get more out of Claude Code Desktop: parallel sessions with Git isolation, visual diff review, app previews, PR monitoring, permission modes, connectors, and enterprise configuration.

8 

9The Code tab within the Claude Desktop app lets you use Claude Code through a graphical interface instead of the terminal.

10 

11Desktop adds these capabilities on top of the standard Claude Code experience:

12 

13* Visual diff review with inline comments

14* Live app preview with dev servers

15* GitHub PR monitoring with auto-fix and auto-merge

16* Parallel sessions with automatic Git worktree isolation

17* Connectors for GitHub, Slack, Linear, and more

18* Local, [SSH](#ssh-sessions), and [cloud](#run-long-running-tasks-remotely) environments

19 

20<Tip>

21 New to Desktop? Start with [Get started](/en/desktop-quickstart) to install the app and make your first edit.

22</Tip>

23 

24This page covers [working with code](#work-with-code), [managing sessions](#manage-sessions), [extending Claude Code](#extend-claude-code), and [configuration](#environment-configuration). It also includes a [CLI comparison](#coming-from-the-cli) and [troubleshooting](#troubleshooting).

25 

26## Start a session

27 

28Before you send your first message, configure four things in the prompt area:

29 

30* **Environment**: choose where Claude runs. Select **Local** for your machine, **Remote** for Anthropic-hosted cloud sessions, or an [**SSH connection**](#ssh-sessions) for a remote machine you manage. See [environment configuration](#environment-configuration).

31* **Project folder**: select the folder or repository Claude works in. For remote sessions, you can add [multiple repositories](#run-long-running-tasks-remotely).

32* **Model**: pick a [model](/en/model-config#available-models) from the dropdown next to the send button. The model is locked once the session starts.

33* **Permission mode**: choose how much autonomy Claude has from the [mode selector](#choose-a-permission-mode). You can change this during the session.

34 

35Type your task and press **Enter** to start. Each session tracks its own context and changes independently.

36 

37## Work with code

38 

39Give Claude the right context, control how much it does on its own, and review what it changed.

40 

41### Use the prompt box

42 

43Type what you want Claude to do and press **Enter** to send. Claude reads your project files, makes changes, and runs commands based on your [permission mode](#choose-a-permission-mode). You can interrupt Claude at any point: click the stop button or type your correction and press **Enter**. Claude stops what it's doing and adjusts based on your input.

44 

45The **+** button next to the prompt box gives you access to file attachments, [skills](#use-skills), [connectors](#connect-external-tools), and [plugins](#install-plugins).

46 

47### Add files and context to prompts

48 

49The prompt box supports two ways to bring in external context:

50 

51* **@mention files**: type `@` followed by a filename to add a file to the conversation context. Claude can then read and reference that file.

52* **Attach files**: attach images, PDFs, and other files to your prompt using the attachment button, or drag and drop files directly into the prompt. This is useful for sharing screenshots of bugs, design mockups, or reference documents.

53 

54### Choose a permission mode

55 

56Permission modes control how much autonomy Claude has during a session: whether it asks before editing files, running commands, or both. You can switch modes at any time using the mode selector next to the send button. Start with Ask permissions to see exactly what Claude does, then move to Auto accept edits or Plan mode as you get comfortable.

57 

58| Mode | Settings key | Behavior |

59| ---------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

60| **Ask permissions** | `default` | Claude asks before editing files or running commands. You see a diff and can accept or reject each change. Recommended for new users. |

61| **Auto accept edits** | `acceptEdits` | Claude auto-accepts file edits but still asks before running terminal commands. Use this when you trust file changes and want faster iteration. |

62| **Plan mode** | `plan` | Claude analyzes your code and creates a plan without modifying files or running commands. Good for complex tasks where you want to review the approach first. |

63| **Bypass permissions** | `bypassPermissions` | Claude runs without any permission prompts, equivalent to `--dangerously-skip-permissions` in the CLI. Enable in your Settings → Claude Code under "Allow bypass permissions mode". Only use this in sandboxed containers or VMs. Enterprise admins can disable this option. |

64 

65The `dontAsk` permission mode is available only in the [CLI](/en/permissions#permission-modes).

66 

67<Tip title="Best practice">

68 Start complex tasks in Plan mode so Claude maps out an approach before making changes. Once you approve the plan, switch to Auto accept edits or Ask permissions to execute it. See [explore first, then plan, then code](/en/best-practices#explore-first-then-plan-then-code) for more on this workflow.

69</Tip>

70 

71Remote sessions support Auto accept edits and Plan mode. Ask permissions is not available because remote sessions auto-accept file edits by default, and Bypass permissions is not available because the remote environment is already sandboxed.

72 

73Enterprise admins can restrict which permission modes are available. See [enterprise configuration](#enterprise-configuration) for details.

74 

75### Preview your app

76 

77Claude can start a dev server and open an embedded browser to verify its changes. This works for frontend web apps as well as backend servers: Claude can test API endpoints, view server logs, and iterate on issues it finds. In most cases, Claude starts the server automatically after editing project files. You can also ask Claude to preview at any time. By default, Claude [auto-verifies](#auto-verify-changes) changes after every edit.

78 

79From the preview panel, you can:

80 

81* Interact with your running app directly in the embedded browser

82* Watch Claude verify its own changes automatically: it takes screenshots, inspects the DOM, clicks elements, fills forms, and fixes issues it finds

83* Start or stop servers from the **Preview** dropdown in the session toolbar

84* Persist cookies and local storage across server restarts by selecting **Persist sessions** in the dropdown, so you don't have to re-login during development

85* Edit the server configuration or stop all servers at once

86 

87Claude creates the initial server configuration based on your project. If your app uses a custom dev command, edit `.claude/launch.json` to match your setup. See [Configure preview servers](#configure-preview-servers) for the full reference.

88 

89To clear saved session data, toggle **Persist preview sessions** off in Settings → Claude Code. To disable preview entirely, toggle off **Preview** in Settings → Claude Code.

90 

91### Review changes with diff view

92 

93After Claude makes changes to your code, the diff view lets you review modifications file by file before creating a pull request.

94 

95When Claude changes files, a diff stats indicator appears showing the number of lines added and removed, such as `+12 -1`. Click this indicator to open the diff viewer, which displays a file list on the left and the changes for each file on the right.

96 

97To comment on specific lines, click any line in the diff to open a comment box. Type your feedback and press **Enter** to add the comment. After adding comments to multiple lines, submit all comments at once:

98 

99* **macOS**: press **Cmd+Enter**

100* **Windows**: press **Ctrl+Enter**

101 

102Claude reads your comments and makes the requested changes, which appear as a new diff you can review.

103 

104### Review your code

105 

106In the diff view, click **Review code** in the top-right toolbar to ask Claude to evaluate the changes before you commit. Claude examines the current diffs and leaves comments directly in the diff view. You can respond to any comment or ask Claude to revise.

107 

108The review focuses on high-signal issues: compile errors, definite logic errors, security vulnerabilities, and obvious bugs. It does not flag style, formatting, pre-existing issues, or anything a linter would catch.

109 

110### Monitor pull request status

111 

112After you open a pull request, a CI status bar appears in the session. Claude Code uses the GitHub CLI to poll check results and surface failures.

113 

114* **Auto-fix**: when enabled, Claude automatically attempts to fix failing CI checks by reading the failure output and iterating.

115* **Auto-merge**: when enabled, Claude merges the PR once all checks pass. The merge method is squash. Auto-merge must be [enabled in your GitHub repository settings](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-auto-merge-for-pull-requests-in-your-repository) for this to work.

116 

117Use the **Auto-fix** and **Auto-merge** toggles in the CI status bar to enable either option. Claude Code also sends a desktop notification when CI finishes.

118 

119<Note>

120 PR monitoring requires the [GitHub CLI (`gh`)](https://cli.github.com/) to be installed and authenticated on your machine. If `gh` is not installed, Desktop prompts you to install it the first time you try to create a PR.

121</Note>

122 

123## Manage sessions

124 

125Each session is an independent conversation with its own context and changes. You can run multiple sessions in parallel or send work to the cloud.

126 

127### Work in parallel with sessions

128 

129Click **+ New session** in the sidebar to work on multiple tasks in parallel. For Git repositories, each session gets its own isolated copy of your project using [Git worktrees](/en/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees), so changes in one session don't affect other sessions until you commit them.

130 

131Worktrees are stored in `<project-root>/.claude/worktrees/` by default. You can change this to a custom directory in Settings → Claude Code under "Worktree location". You can also set a branch prefix that gets prepended to every worktree branch name, which is useful for keeping Claude-created branches organized. To remove a worktree when you're done, hover over the session in the sidebar and click the archive icon.

132 

133<Note>

134 Session isolation requires [Git](https://git-scm.com/downloads). Most Macs include Git by default. Run `git --version` in Terminal to check. On Windows, Git is required for the Code tab to work: [download Git for Windows](https://git-scm.com/downloads/win), install it, and restart the app. If you run into Git errors, try a Cowork session to help troubleshoot your setup.

135</Note>

136 

137Use the filter icon at the top of the sidebar to filter sessions by status (Active, Archived) and environment (Local, Cloud). To rename a session or check context usage, click the session title in the toolbar at the top of the active session. When context fills up, Claude automatically summarizes the conversation and continues working. You can also type `/compact` to trigger summarization earlier and free up context space. See [the context window](/en/how-claude-code-works#the-context-window) for details on how compaction works.

138 

139### Run long-running tasks remotely

140 

141For large refactors, test suites, migrations, or other long-running tasks, select **Remote** instead of **Local** when starting a session. Remote sessions run on Anthropic's cloud infrastructure and continue even if you close the app or shut down your computer. Check back anytime to see progress or steer Claude in a different direction. You can also monitor remote sessions from [claude.ai/code](https://claude.ai/code) or the Claude iOS app.

142 

143Remote sessions also support multiple repositories. After selecting a cloud environment, click the **+** button next to the repo pill to add additional repositories to the session. Each repo gets its own branch selector. This is useful for tasks that span multiple codebases, such as updating a shared library and its consumers.

144 

145See [Claude Code on the web](/en/claude-code-on-the-web) for more on how remote sessions work.

146 

147### Continue in another surface

148 

149The **Continue in** menu, accessible from the VS Code icon in the bottom right of the session toolbar, lets you move your session to another surface:

150 

151* **Claude Code on the Web**: sends your local session to continue running remotely. Desktop pushes your branch, generates a summary of the conversation, and creates a new remote session with the full context. You can then choose to archive the local session or keep it. This requires a clean working tree, and is not available for SSH sessions.

152* **Your IDE**: opens your project in a supported IDE at the current working directory.

153 

154## Extend Claude Code

155 

156Connect external services, add reusable workflows, customize Claude's behavior, and configure preview servers.

157 

158### Connect external tools

159 

160For local and [SSH](#ssh-sessions) sessions, click the **+** button next to the prompt box and select **Connectors** to add integrations like Google Calendar, Slack, GitHub, Linear, Notion, and more. You can add connectors before or during a session. Connectors are not available for remote sessions.

161 

162To manage or disconnect connectors, go to Settings → Connectors in the desktop app, or select **Manage connectors** from the Connectors menu in the prompt box.

163 

164Once connected, Claude can read your calendar, send messages, create issues, and interact with your tools directly. You can ask Claude what connectors are configured in your session.

165 

166Connectors are [MCP servers](/en/mcp) with a graphical setup flow. Use them for quick integration with supported services. For integrations not listed in Connectors, add MCP servers manually via [settings files](/en/mcp#installing-mcp-servers). You can also [create custom connectors](https://support.claude.com/en/articles/11175166-getting-started-with-custom-connectors-using-remote-mcp).

167 

168### Use skills

169 

170[Skills](/en/skills) extend what Claude can do. Claude loads them automatically when relevant, or you can invoke one directly: type `/` in the prompt box or click the **+** button and select **Slash commands** to browse what's available. This includes [built-in commands](/en/interactive-mode#built-in-commands), your [custom skills](/en/skills#create-custom-skills), project skills from your codebase, and skills from any [installed plugins](/en/plugins). Select one and it appears highlighted in the input field. Type your task after it and send as usual.

171 

172### Install plugins

173 

174[Plugins](/en/plugins) are reusable packages that add skills, agents, hooks, MCP servers, and LSP configurations to Claude Code. You can install plugins from the desktop app without using the terminal.

175 

176For local and [SSH](#ssh-sessions) sessions, click the **+** button next to the prompt box and select **Plugins** to see your installed plugins and their commands. To add a plugin, select **Add plugin** from the submenu to open the plugin browser, which shows available plugins from your configured [marketplaces](/en/plugin-marketplaces) including the official Anthropic marketplace. Select **Manage plugins** to enable, disable, or uninstall plugins.

177 

178Plugins can be scoped to your user account, a specific project, or local-only. Plugins are not available for remote sessions. For the full plugin reference including creating your own plugins, see [plugins](/en/plugins).

179 

180### Configure preview servers

181 

182Claude automatically detects your dev server setup and stores the configuration in `.claude/launch.json` at the root of the folder you selected when starting the session. Preview uses this folder as its working directory, so if you selected a parent folder, subfolders with their own dev servers won't be detected automatically. To work with a subfolder's server, either start a session in that folder directly or add a configuration manually.

183 

184To customize how your server starts, for example to use `yarn dev` instead of `npm run dev` or to change the port, edit the file manually or click **Edit configuration** in the Preview dropdown to open it in your code editor. The file supports JSON with comments.

185 

186```json theme={null}

187{

188 "version": "0.0.1",

189 "configurations": [

190 {

191 "name": "my-app",

192 "runtimeExecutable": "npm",

193 "runtimeArgs": ["run", "dev"],

194 "port": 3000

195 }

196 ]

197}

198```

199 

200You can define multiple configurations to run different servers from the same project, such as a frontend and an API. See the [examples](#examples) below.

201 

202#### Auto-verify changes

203 

204When `autoVerify` is enabled, Claude automatically verifies code changes after editing files. It takes screenshots, checks for errors, and confirms changes work before completing its response.

205 

206Auto-verify is on by default. Disable it per-project by adding `"autoVerify": false` to `.claude/launch.json`, or toggle it from the **Preview** dropdown menu.

207 

208```json theme={null}

209{

210 "version": "0.0.1",

211 "autoVerify": false,

212 "configurations": [...]

213}

214```

215 

216When disabled, preview tools are still available and you can ask Claude to verify at any time. Auto-verify makes it automatic after every edit.

217 

218#### Configuration fields

219 

220Each entry in the `configurations` array accepts the following fields:

221 

222| Field | Type | Description |

223| ------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

224| `name` | string | A unique identifier for this server |

225| `runtimeExecutable` | string | The command to run, such as `npm`, `yarn`, or `node` |

226| `runtimeArgs` | string\[] | Arguments passed to `runtimeExecutable`, such as `["run", "dev"]` |

227| `port` | number | The port your server listens on. Defaults to 3000 |

228| `cwd` | string | Working directory relative to your project root. Defaults to the project root. Use `${workspaceFolder}` to reference the project root explicitly |

229| `env` | object | Additional environment variables as key-value pairs, such as `{ "NODE_ENV": "development" }`. Don't put secrets here since this file is committed to your repo. Secrets set in your shell profile are inherited automatically. |

230| `autoPort` | boolean | How to handle port conflicts. See below |

231| `program` | string | A script to run with `node`. See [when to use `program` vs `runtimeExecutable`](#when-to-use-program-vs-runtimeexecutable) |

232| `args` | string\[] | Arguments passed to `program`. Only used when `program` is set |

233 

234##### When to use `program` vs `runtimeExecutable`

235 

236Use `runtimeExecutable` with `runtimeArgs` to start a dev server through a package manager. For example, `"runtimeExecutable": "npm"` with `"runtimeArgs": ["run", "dev"]` runs `npm run dev`.

237 

238Use `program` when you have a standalone script you want to run with `node` directly. For example, `"program": "server.js"` runs `node server.js`. Pass additional flags with `args`.

239 

240#### Port conflicts

241 

242The `autoPort` field controls what happens when your preferred port is already in use:

243 

244* **`true`**: Claude finds and uses a free port automatically. Suitable for most dev servers.

245* **`false`**: Claude fails with an error. Use this when your server must use a specific port, such as for OAuth callbacks or CORS allowlists.

246* **Not set (default)**: Claude asks whether the server needs that exact port, then saves your answer.

247 

248When Claude picks a different port, it passes the assigned port to your server via the `PORT` environment variable.

249 

250#### Examples

251 

252These configurations show common setups for different project types:

253 

254<Tabs>

255 <Tab title="Next.js">

256 This configuration runs a Next.js app using Yarn on port 3000:

257 

258 ```json theme={null}

259 {

260 "version": "0.0.1",

261 "configurations": [

262 {

263 "name": "web",

264 "runtimeExecutable": "yarn",

265 "runtimeArgs": ["dev"],

266 "port": 3000

267 }

268 ]

269 }

270 ```

271 </Tab>

272 

273 <Tab title="Multiple servers">

274 For a monorepo with a frontend and an API server, define multiple configurations. The frontend uses `autoPort: true` so it picks a free port if 3000 is taken, while the API server requires port 8080 exactly:

275 

276 ```json theme={null}

277 {

278 "version": "0.0.1",

279 "configurations": [

280 {

281 "name": "frontend",

282 "runtimeExecutable": "npm",

283 "runtimeArgs": ["run", "dev"],

284 "cwd": "apps/web",

285 "port": 3000,

286 "autoPort": true

287 },

288 {

289 "name": "api",

290 "runtimeExecutable": "npm",

291 "runtimeArgs": ["run", "start"],

292 "cwd": "server",

293 "port": 8080,

294 "env": { "NODE_ENV": "development" },

295 "autoPort": false

296 }

297 ]

298 }

299 ```

300 </Tab>

301 

302 <Tab title="Node.js script">

303 To run a Node.js script directly instead of using a package manager command, use the `program` field:

304 

305 ```json theme={null}

306 {

307 "version": "0.0.1",

308 "configurations": [

309 {

310 "name": "server",

311 "program": "server.js",

312 "args": ["--verbose"],

313 "port": 4000

314 }

315 ]

316 }

317 ```

318 </Tab>

319</Tabs>

320 

321## Environment configuration

322 

323When starting a session, you choose between three environments:

324 

325* **Local**: runs on your machine with direct access to your files

326* **Remote**: runs on Anthropic's cloud infrastructure. Sessions continue even if you close the app.

327* **SSH**: runs on a remote machine you connect to over SSH, such as your own servers, cloud VMs, or dev containers

328 

329### Local sessions

330 

331Local sessions inherit environment variables from your shell. If you need additional variables, set them in your shell profile, such as `~/.zshrc` or `~/.bashrc`, and restart the desktop app. See [environment variables](/en/settings#environment-variables) for the full list of supported variables.

332 

333[Extended thinking](/en/common-workflows#use-extended-thinking-thinking-mode) is enabled by default, which improves performance on complex reasoning tasks but uses additional tokens. To disable thinking entirely, set `MAX_THINKING_TOKENS=0` in your shell profile. On Opus, `MAX_THINKING_TOKENS` is ignored except for `0` because adaptive reasoning controls thinking depth instead.

334 

335### Remote sessions

336 

337Remote sessions continue in the background even if you close the app. Usage counts toward your [subscription plan limits](/en/costs) with no separate compute charges.

338 

339You can create custom cloud environments with different network access levels and environment variables. Select the environment dropdown when starting a remote session and choose **Add environment**. See [cloud environments](/en/claude-code-on-the-web#cloud-environment) for details on configuring network access and environment variables.

340 

341### SSH sessions

342 

343SSH sessions let you run Claude Code on a remote machine while using the desktop app as your interface. This is useful for working with codebases that live on cloud VMs, dev containers, or servers with specific hardware or dependencies.

344 

345To add an SSH connection, click the environment dropdown before starting a session and select **+ Add SSH connection**. The dialog asks for:

346 

347* **Name**: a friendly label for this connection

348* **SSH Host**: `user@hostname` or a host defined in `~/.ssh/config`

349* **SSH Port**: defaults to 22 if left empty, or uses the port from your SSH config

350* **Identity File**: path to your private key, such as `~/.ssh/id_rsa`. Leave empty to use the default key or your SSH config.

351 

352Once added, the connection appears in the environment dropdown. Select it to start a session on that machine. Claude runs on the remote machine with access to its files and tools.

353 

354Claude Code must be installed on the remote machine. Once connected, SSH sessions support permission modes, connectors, plugins, and MCP servers.

355 

356## Enterprise configuration

357 

358Organizations on Teams or Enterprise plans can manage desktop app behavior through admin console controls, managed settings files, and device management policies.

359 

360### Admin console controls

361 

362These settings are configured through the [admin settings console](https://claude.ai/admin-settings/claude-code):

363 

364* **Enable or disable the Code tab**: control whether users in your organization can access Claude Code in the desktop app

365* **Disable Bypass permissions mode**: prevent users in your organization from enabling bypass permissions mode

366* **Disable Claude Code on the web**: enable or disable remote sessions for your organization

367 

368### Managed settings

369 

370Managed settings override project and user settings and apply when Desktop spawns CLI sessions. You can set these keys in your organization's [managed settings](/en/settings#settings-precedence) file or push them remotely through the admin console.

371 

372| Key | Description |

373| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |

374| `disableBypassPermissionsMode` | set to `"disable"` to prevent users from enabling Bypass permissions mode. See [managed settings](/en/permissions#managed-only-settings). |

375 

376For the complete list of managed-only settings including `allowManagedPermissionRulesOnly` and `allowManagedHooksOnly`, see [managed-only settings](/en/permissions#managed-only-settings).

377 

378Remote managed settings uploaded through the admin console currently apply to CLI and IDE sessions only. For Desktop-specific restrictions, use the admin console controls above.

379 

380### Device management policies

381 

382IT teams can manage the desktop app through MDM on macOS or group policy on Windows. Available policies include enabling or disabling the Claude Code feature, controlling auto-updates, and setting a custom deployment URL.

383 

384* **macOS**: configure via `com.anthropic.Claude` preference domain using tools like Jamf or Kandji

385* **Windows**: configure via registry at `SOFTWARE\Policies\Claude`

386 

387### Authentication and SSO

388 

389Enterprise organizations can require SSO for all users. See [authentication](/en/authentication) for plan-level details and [Setting up SSO](https://support.claude.com/en/articles/13132885-setting-up-single-sign-on-sso) for SAML and OIDC configuration.

390 

391### Data handling

392 

393Claude Code processes your code locally in local sessions or on Anthropic's cloud infrastructure in remote sessions. Conversations and code context are sent to Anthropic's API for processing. See [data handling](/en/data-usage) for details on data retention, privacy, and compliance.

394 

395### Deployment

396 

397Desktop can be distributed through enterprise deployment tools:

398 

399* **macOS**: distribute via MDM such as Jamf or Kandji using the `.dmg` installer

400* **Windows**: deploy via MSIX package or `.exe` installer. See [Deploy Claude Desktop for Windows](https://support.claude.com/en/articles/12622703-deploy-claude-desktop-for-windows) for enterprise deployment options including silent installation

401 

402For network configuration such as proxy settings, firewall allowlisting, and LLM gateways, see [network configuration](/en/network-config).

403 

404For the full enterprise configuration reference, see the [enterprise configuration guide](https://support.claude.com/en/articles/12622667-enterprise-configuration).

405 

406## Coming from the CLI?

407 

408If you already use the Claude Code CLI, Desktop runs the same underlying engine with a graphical interface. You can run both simultaneously on the same machine, even on the same project. Each maintains separate session history, but they share configuration and project memory via CLAUDE.md files.

409 

410To move a CLI session into Desktop, run `/desktop` in the terminal. Claude saves your session and opens it in the desktop app, then exits the CLI. This command is available on macOS and Windows only.

411 

412<Tip>

413 When to use Desktop vs CLI: use Desktop when you want visual diff review, file attachments, or session management in a sidebar. Use the CLI when you need scripting, automation, third-party providers, or prefer a terminal workflow.

414</Tip>

415 

416### CLI flag equivalents

417 

418This table shows the desktop app equivalent for common CLI flags. Flags not listed have no desktop equivalent because they are designed for scripting or automation.

419 

420| CLI | Desktop equivalent |

421| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |

422| `--model sonnet` | model dropdown next to the send button, before starting a session |

423| `--resume`, `--continue` | click a session in the sidebar |

424| `--permission-mode` | mode selector next to the send button |

425| `--dangerously-skip-permissions` | Bypass permissions mode. Enable in Settings → Claude Code → "Allow bypass permissions mode". Enterprise admins can disable this setting. |

426| `--add-dir` | add multiple repos with the **+** button in remote sessions |

427| `--allowedTools`, `--disallowedTools` | not available in Desktop |

428| `--verbose` | not available. Check system logs: Console.app on macOS, Event Viewer → Windows Logs → Application on Windows |

429| `--print`, `--output-format` | not available. Desktop is interactive only. |

430| `ANTHROPIC_MODEL` env var | model dropdown next to the send button |

431| `MAX_THINKING_TOKENS` env var | set in shell profile; applies to local sessions. See [environment configuration](#environment-configuration). |

432 

433### Shared configuration

434 

435Desktop and CLI read the same configuration files, so your setup carries over:

436 

437* **[CLAUDE.md](/en/memory)** and **CLAUDE.local.md** files in your project are used by both

438* **[MCP servers](/en/mcp)** configured in `~/.claude.json` or `.mcp.json` work in both

439* **[Hooks](/en/hooks)** and **[skills](/en/skills)** defined in settings apply to both

440* **[Settings](/en/settings)** in `~/.claude.json` and `~/.claude/settings.json` are shared. Permission rules, allowed tools, and other settings in `settings.json` apply to Desktop sessions.

441* **Models**: Sonnet, Opus, and Haiku are available in both. In Desktop, select the model from the dropdown next to the send button before starting a session. You cannot change the model during an active session.

442 

443<Note>

444 **MCP servers: desktop chat app vs Claude Code**: MCP servers configured for the Claude Desktop chat app in `claude_desktop_config.json` are separate from Claude Code and will not appear in the Code tab. To use MCP servers in Claude Code, configure them in `~/.claude.json` or your project's `.mcp.json` file. See [MCP configuration](/en/mcp#installing-mcp-servers) for details.

445</Note>

446 

447### Feature comparison

448 

449This table compares core capabilities between the CLI and Desktop. For a full list of CLI flags, see the [CLI reference](/en/cli-reference).

450 

451| Feature | CLI | Desktop |

452| ----------------------------------------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------- |

453| Permission modes | all modes including `dontAsk` | Ask permissions, Auto accept edits, Plan mode, and Bypass permissions via Settings |

454| `--dangerously-skip-permissions` | CLI flag | Bypass permissions mode. Enable in Settings → Claude Code → "Allow bypass permissions mode" |

455| [Third-party providers](/en/third-party-integrations) | Bedrock, Vertex, Foundry | not available. Desktop connects to Anthropic's API directly. |

456| [MCP servers](/en/mcp) | configure in settings files | Connectors UI for local and SSH sessions, or settings files |

457| [Plugins](/en/plugins) | `/plugin` command | plugin manager UI |

458| @mention files | text-based | with autocomplete |

459| File attachments | not available | images, PDFs |

460| Session isolation | [`--worktree`](/en/cli-reference) flag | automatic worktrees |

461| Multiple sessions | separate terminals | sidebar tabs |

462| Scripting and automation | [`--print`](/en/cli-reference), [Agent SDK](/en/headless) | not available |

463 

464### What's not available in Desktop

465 

466* **Third-party providers**: Desktop connects to Anthropic's API directly. Use the [CLI](/en/quickstart) with Bedrock, Vertex, or Foundry instead.

467* **Linux**: the desktop app is available on macOS and Windows only.

468* **Inline code suggestions**: Desktop does not provide autocomplete-style suggestions. It works through conversational prompts and explicit code changes.

469* **Agent teams**: multi-agent orchestration is available via the [CLI](/en/agent-teams) and [Agent SDK](/en/headless), not in Desktop.

470 

471## Troubleshooting

472 

473### Check your version

474 

475To see which version of the desktop app you're running:

476 

477* **macOS**: click **Claude** in the menu bar, then **About Claude**

478* **Windows**: click **Help**, then **About**

479 

480Click the version number to copy it to your clipboard.

481 

482### 403 or authentication errors in the Code tab

483 

484If you see `Error 403: Forbidden` or other authentication failures when using the Code tab:

485 

4861. Sign out and back in from the app menu. This is the most common fix.

4872. Verify you have an active paid subscription: Pro, Max, Teams, or Enterprise.

4883. If the CLI works but Desktop does not, quit the desktop app completely, not just close the window, then reopen and sign in again.

4894. Check your internet connection and proxy settings.

490 

491### Blank or stuck screen on launch

492 

493If the app opens but shows a blank or unresponsive screen:

494 

4951. Restart the app.

4962. Check for pending updates. The app auto-updates on launch.

4973. On Windows, check Event Viewer for crash logs under **Windows Logs → Application**.

498 

499### "Failed to load session"

500 

501If you see `Failed to load session`, the selected folder may no longer exist, a Git repository may require Git LFS that isn't installed, or file permissions may prevent access. Try selecting a different folder or restarting the app.

502 

503### Session not finding installed tools

504 

505If Claude can't find tools like `npm`, `node`, or other CLI commands, verify the tools work in your regular terminal, check that your shell profile properly sets up PATH, and restart the desktop app to reload environment variables.

506 

507### Git and Git LFS errors

508 

509On Windows, Git is required for the Code tab to start local sessions. If you see "Git is required," install [Git for Windows](https://git-scm.com/downloads/win) and restart the app.

510 

511If you see "Git LFS is required by this repository but is not installed," install Git LFS from [git-lfs.com](https://git-lfs.com/), run `git lfs install`, and restart the app.

512 

513### MCP servers not working on Windows

514 

515If MCP server toggles don't respond or servers fail to connect on Windows, check that the server is properly configured in your settings, restart the app, verify the server process is running in Task Manager, and review server logs for connection errors.

516 

517### App won't quit

518 

519* **macOS**: press Cmd+Q. If the app doesn't respond, use Force Quit with Cmd+Option+Esc, select Claude, and click Force Quit.

520* **Windows**: use Task Manager with Ctrl+Shift+Esc to end the Claude process.

521 

522### Windows-specific issues

523 

524* **PATH not updated after install**: open a new terminal window. PATH updates only apply to new terminal sessions.

525* **Concurrent installation error**: if you see an error about another installation in progress but there isn't one, try running the installer as Administrator.

526* **ARM64**: Windows ARM64 devices are fully supported.

527 

528### Cowork tab unavailable on Intel Macs

529 

530The Cowork tab requires Apple Silicon (M1 or later) on macOS. On Windows, Cowork is available on all supported hardware. The Chat and Code tabs work normally on Intel Macs.

531 

532### "Branch doesn't exist yet" when opening in CLI

533 

534Remote sessions can create branches that don't exist on your local machine. Click the branch name in the session toolbar to copy it, then fetch it locally:

535 

536```bash theme={null}

537git fetch origin <branch-name>

538git checkout <branch-name>

539```

540 

541### Still stuck?

542 

543* Search or file a bug on [GitHub Issues](https://github.com/anthropics/claude-code/issues)

544* Visit the [Claude support center](https://support.claude.com/)

545 

546When filing a bug, include your desktop app version, your operating system, the exact error message, and relevant logs. On macOS, check Console.app. On Windows, check Event Viewer → Windows Logs → Application.

desktop-quickstart.md +137 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Get started with the desktop app

6 

7> Install Claude Code on desktop and start your first coding session

8 

9The desktop app gives you Claude Code with a graphical interface: visual diff review, live app preview, GitHub PR monitoring with auto-merge, parallel sessions with Git worktree isolation, and the ability to run tasks remotely. No terminal required.

10 

11This page walks through installing the app and starting your first session. If you're already set up, see [Use Claude Code Desktop](/en/desktop) for the full reference.

12 

13<Frame>

14 <img src="https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-light.png?fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=9a36a7a27b9f4c6f2e1c83bdb34f69ce" className="block dark:hidden" alt="The Claude Code Desktop interface showing the Code tab selected, with a prompt box, permission mode selector set to Ask permissions, model picker, folder selector, and Local environment option" data-og-width="2500" width="2500" data-og-height="1376" height="1376" data-path="images/desktop-code-tab-light.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-light.png?w=280&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=b4d1408a312d3ff3ac96dd133e4ef32b 280w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-light.png?w=560&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=c2d9f668767d4de33696b3de190c0024 560w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-light.png?w=840&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=89a78335d513c0ec2131feb11eeef6dc 840w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-light.png?w=1100&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=0ef93540eafcedd2fb0ad718553325f4 1100w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-light.png?w=1650&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=e7923c583f632de9f8a7e0e0da4f8c84 1650w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-light.png?w=2500&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=38d64bdceaba941a73446f258be336ea 2500w" />

15 

16 <img src="https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-dark.png?fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=5463defe81c459fb9b1f91f6a958cfb8" className="hidden dark:block" alt="The Claude Code Desktop interface in dark mode showing the Code tab selected, with a prompt box, permission mode selector set to Ask permissions, model picker, folder selector, and Local environment option" data-og-width="2504" width="2504" data-og-height="1374" height="1374" data-path="images/desktop-code-tab-dark.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-dark.png?w=280&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=f2a6322688262feb9d680b99c24817ab 280w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-dark.png?w=560&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=ffe9a3d1c4260fb12c66f533fdedc02e 560w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-dark.png?w=840&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=867b7997a910af3ffac1101559564dd7 840w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-dark.png?w=1100&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=976c9049c9e4cea2b02d4b6a1ef55142 1100w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-dark.png?w=1650&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=d8f3792ddadf66f61306dc41680aaa34 1650w, https://mintcdn.com/claude-code/CNLUpFGiXoc9mhvD/images/desktop-code-tab-dark.png?w=2500&fit=max&auto=format&n=CNLUpFGiXoc9mhvD&q=85&s=88d049488f547e483e8c4f59ea8b2fd8 2500w" />

17</Frame>

18 

19The desktop app has three tabs:

20 

21* **Chat**: General conversation with no file access, similar to claude.ai.

22* **Cowork**: An autonomous background agent that works on tasks in a cloud VM with its own environment. It can run independently while you do other work.

23* **Code**: An interactive coding assistant with direct access to your local files. You review and approve each change in real time.

24 

25Chat and Cowork are covered in the [Claude Desktop support articles](https://support.claude.com/en/collections/16163169-claude-desktop). This page focuses on the **Code** tab.

26 

27<Note>

28 Claude Code requires a [Pro, Max, Teams, or Enterprise subscription](https://claude.com/pricing).

29</Note>

30 

31## Install

32 

33<Steps>

34 <Step title="Download the app">

35 Download Claude for your platform.

36 

37 <CardGroup cols={2}>

38 <Card title="macOS" icon="apple" href="https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code&utm_medium=docs">

39 Universal build for Intel and Apple Silicon

40 </Card>

41 

42 <Card title="Windows" icon="windows" href="https://claude.ai/api/desktop/win32/x64/exe/latest/redirect?utm_source=claude_code&utm_medium=docs">

43 For x64 processors

44 </Card>

45 </CardGroup>

46 

47 For Windows ARM64, [download here](https://claude.ai/api/desktop/win32/arm64/exe/latest/redirect?utm_source=claude_code\&utm_medium=docs).

48 

49 Linux is not currently supported.

50 </Step>

51 

52 <Step title="Sign in">

53 Launch Claude from your Applications folder (macOS) or Start menu (Windows). Sign in with your Anthropic account.

54 </Step>

55 

56 <Step title="Open the Code tab">

57 Click the **Code** tab at the top center. If clicking Code prompts you to upgrade, you need to [subscribe to a paid plan](https://claude.com/pricing) first. If it prompts you to sign in online, complete the sign-in and restart the app. If you see a 403 error, see [authentication troubleshooting](/en/desktop#403-or-authentication-errors-in-the-code-tab).

58 </Step>

59</Steps>

60 

61The desktop app includes Claude Code. You don't need to install Node.js or the CLI separately. To use `claude` from the terminal, install the CLI separately. See [Get started with the CLI](/en/quickstart).

62 

63## Start your first session

64 

65With the Code tab open, choose a project and give Claude something to do.

66 

67<Steps>

68 <Step title="Choose an environment and folder">

69 Select **Local** to run Claude on your machine using your files directly. Click **Select folder** and choose your project directory.

70 

71 <Tip>

72 Start with a small project you know well. It's the fastest way to see what Claude Code can do. On Windows, [Git](https://git-scm.com/downloads/win) must be installed for local sessions to work. Most Macs include Git by default.

73 </Tip>

74 

75 You can also select:

76 

77 * **Remote**: Run sessions on Anthropic's cloud infrastructure that continue even if you close the app. Remote sessions use the same infrastructure as [Claude Code on the web](/en/claude-code-on-the-web).

78 * **SSH**: Connect to a remote machine over SSH (your own servers, cloud VMs, or dev containers). Claude Code must be installed on the remote machine.

79 </Step>

80 

81 <Step title="Choose a model">

82 Select a model from the dropdown next to the send button. See [models](/en/model-config#available-models) for a comparison of Opus, Sonnet, and Haiku. You cannot change the model after the session starts.

83 </Step>

84 

85 <Step title="Tell Claude what to do">

86 Type what you want Claude to do:

87 

88 * `Find a TODO comment and fix it`

89 * `Add tests for the main function`

90 * `Create a CLAUDE.md with instructions for this codebase`

91 

92 A [session](/en/desktop#work-in-parallel-with-sessions) is a conversation with Claude about your code. Each session tracks its own context and changes, so you can work on multiple tasks without them interfering with each other.

93 </Step>

94 

95 <Step title="Review and accept changes">

96 By default, the Code tab starts in [Ask permissions mode](/en/desktop#choose-a-permission-mode), where Claude proposes changes and waits for your approval before applying them. You'll see:

97 

98 1. A [diff view](/en/desktop#review-changes-with-diff-view) showing exactly what will change in each file

99 2. Accept/Reject buttons to approve or decline each change

100 3. Real-time updates as Claude works through your request

101 

102 If you reject a change, Claude will ask how you'd like to proceed differently. Your files aren't modified until you accept.

103 </Step>

104</Steps>

105 

106## Now what?

107 

108You've made your first edit. For the full reference on everything Desktop can do, see [Use Claude Code Desktop](/en/desktop). Here are some things to try next.

109 

110**Interrupt and steer.** You can interrupt Claude at any point. If it's going down the wrong path, click the stop button or type your correction and press **Enter**. Claude stops what it's doing and adjusts based on your input. You don't have to wait for it to finish or start over.

111 

112**Give Claude more context.** Type `@filename` in the prompt box to pull a specific file into the conversation, attach images and PDFs using the attachment button, or drag and drop files directly into the prompt. The more context Claude has, the better the results. See [Add files and context](/en/desktop#add-files-and-context-to-prompts).

113 

114**Use skills for repeatable tasks.** Type `/` or click **+** → **Slash commands** to browse [built-in commands](/en/interactive-mode#built-in-commands), [custom skills](/en/skills), and plugin skills. Skills are reusable prompts you can invoke whenever you need them, like code review checklists or deployment steps.

115 

116**Review changes before committing.** After Claude edits files, a `+12 -1` indicator appears. Click it to open the [diff view](/en/desktop#review-changes-with-diff-view), review modifications file by file, and comment on specific lines. Claude reads your comments and revises. Click **Review code** to have Claude evaluate the diffs itself and leave inline suggestions.

117 

118**Adjust how much control you have.** Your [permission mode](/en/desktop#choose-a-permission-mode) controls the balance. Ask permissions (default) requires approval before every edit. Auto accept edits auto-accepts file edits for faster iteration. Plan mode lets Claude map out an approach without touching any files, which is useful before a large refactor.

119 

120**Add plugins for more capabilities.** Click the **+** button next to the prompt box and select **Plugins** to browse and install [plugins](/en/desktop#install-plugins) that add skills, agents, MCP servers, and more.

121 

122**Preview your app.** Click the **Preview** dropdown to run your dev server directly in the desktop. Claude can view the running app, test endpoints, inspect logs, and iterate on what it sees. See [Preview your app](/en/desktop#preview-your-app).

123 

124**Track your pull request.** After opening a PR, Claude Code monitors CI check results and can automatically fix failures or merge the PR once all checks pass. See [Monitor pull request status](/en/desktop#monitor-pull-request-status).

125 

126**Scale up when you're ready.** Open [parallel sessions](/en/desktop#work-in-parallel-with-sessions) from the sidebar to work on multiple tasks at once, each in its own Git worktree. Send [long-running work to the cloud](/en/desktop#run-long-running-tasks-remotely) so it continues even if you close the app, or [continue a session on the web or in your IDE](/en/desktop#continue-in-another-surface) if a task takes longer than expected. [Connect external tools](/en/desktop#extend-claude-code) like GitHub, Slack, and Linear to bring your workflow together.

127 

128## Coming from the CLI?

129 

130Desktop runs the same engine as the CLI with a graphical interface. You can run both simultaneously on the same project, and they share configuration (CLAUDE.md files, MCP servers, hooks, skills, and settings). For a full comparison of features, flag equivalents, and what's not available in Desktop, see [CLI comparison](/en/desktop#coming-from-the-cli).

131 

132## What's next

133 

134* [Use Claude Code Desktop](/en/desktop): permission modes, parallel sessions, diff view, connectors, and enterprise configuration

135* [Troubleshooting](/en/desktop#troubleshooting): solutions to common errors and setup issues

136* [Best practices](/en/best-practices): tips for writing effective prompts and getting the most out of Claude Code

137* [Common workflows](/en/common-workflows): tutorials for debugging, refactoring, testing, and more

devcontainer.md +7 −3

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Development containers5# Development containers

2 6 

3> Learn about the Claude Code development container for teams that need consistent, secure environments.7> Learn about the Claude Code development container for teams that need consistent, secure environments.


8 12 

9<Warning>13<Warning>

10 While the devcontainer provides substantial protections, no system is completely immune to all attacks.14 While the devcontainer provides substantial protections, no system is completely immune to all attacks.

11 When executed with `--dangerously-skip-permissions`, devcontainers do not prevent a malicious project from exfiltrating anything accessible in the devcontainer including Claude Code credentials.15 When executed with `--dangerously-skip-permissions`, devcontainers don't prevent a malicious project from exfiltrating anything accessible in the devcontainer including Claude Code credentials.

12 We recommend only using devcontainers when developing with trusted repositories.16 We recommend only using devcontainers when developing with trusted repositories.

13 Always maintain good security practices and monitor Claude's activities.17 Always maintain good security practices and monitor Claude's activities.

14</Warning>18</Warning>


73## Related resources77## Related resources

74 78 

75* [VS Code devcontainers documentation](https://code.visualstudio.com/docs/devcontainers/containers)79* [VS Code devcontainers documentation](https://code.visualstudio.com/docs/devcontainers/containers)

76* [Claude Code security best practices](/en/docs/claude-code/security)80* [Claude Code security best practices](/en/security)

77* [Enterprise network configuration](/en/docs/claude-code/network-config)81* [Enterprise network configuration](/en/network-config)

discover-plugins.md +408 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Discover and install prebuilt plugins through marketplaces

6 

7> Find and install plugins from marketplaces to extend Claude Code with new commands, agents, and capabilities.

8 

9Plugins extend Claude Code with skills, agents, hooks, and MCP servers. Plugin marketplaces are catalogs that help you discover and install these extensions without building them yourself.

10 

11Looking to create and distribute your own marketplace? See [Create and distribute a plugin marketplace](/en/plugin-marketplaces).

12 

13## How marketplaces work

14 

15A marketplace is a catalog of plugins that someone else has created and shared. Using a marketplace is a two-step process:

16 

17<Steps>

18 <Step title="Add the marketplace">

19 This registers the catalog with Claude Code so you can browse what's available. No plugins are installed yet.

20 </Step>

21 

22 <Step title="Install individual plugins">

23 Browse the catalog and install the plugins you want.

24 </Step>

25</Steps>

26 

27Think of it like adding an app store: adding the store gives you access to browse its collection, but you still choose which apps to download individually.

28 

29## Official Anthropic marketplace

30 

31The official Anthropic marketplace (`claude-plugins-official`) is automatically available when you start Claude Code. Run `/plugin` and go to the **Discover** tab to browse what's available.

32 

33To install a plugin from the official marketplace:

34 

35```shell theme={null}

36/plugin install plugin-name@claude-plugins-official

37```

38 

39<Note>

40 The official marketplace is maintained by Anthropic. To distribute your own plugins, [create your own marketplace](/en/plugin-marketplaces) and share it with users.

41</Note>

42 

43The official marketplace includes several categories of plugins:

44 

45### Code intelligence

46 

47Code intelligence plugins enable Claude Code's built-in LSP tool, giving Claude the ability to jump to definitions, find references, and see type errors immediately after edits. These plugins configure [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) connections, the same technology that powers VS Code's code intelligence.

48 

49These plugins require the language server binary to be installed on your system. If you already have a language server installed, Claude may prompt you to install the corresponding plugin when you open a project.

50 

51| Language | Plugin | Binary required |

52| :--------- | :------------------ | :--------------------------- |

53| C/C++ | `clangd-lsp` | `clangd` |

54| C# | `csharp-lsp` | `csharp-ls` |

55| Go | `gopls-lsp` | `gopls` |

56| Java | `jdtls-lsp` | `jdtls` |

57| Kotlin | `kotlin-lsp` | `kotlin-language-server` |

58| Lua | `lua-lsp` | `lua-language-server` |

59| PHP | `php-lsp` | `intelephense` |

60| Python | `pyright-lsp` | `pyright-langserver` |

61| Rust | `rust-analyzer-lsp` | `rust-analyzer` |

62| Swift | `swift-lsp` | `sourcekit-lsp` |

63| TypeScript | `typescript-lsp` | `typescript-language-server` |

64 

65You can also [create your own LSP plugin](/en/plugins-reference#lsp-servers) for other languages.

66 

67<Note>

68 If you see `Executable not found in $PATH` in the `/plugin` Errors tab after installing a plugin, install the required binary from the table above.

69</Note>

70 

71#### What Claude gains from code intelligence plugins

72 

73Once a code intelligence plugin is installed and its language server binary is available, Claude gains two capabilities:

74 

75* **Automatic diagnostics**: after every file edit Claude makes, the language server analyzes the changes and reports errors and warnings back automatically. Claude sees type errors, missing imports, and syntax issues without needing to run a compiler or linter. If Claude introduces an error, it notices and fixes the issue in the same turn. This requires no configuration beyond installing the plugin. You can see diagnostics inline by pressing **Ctrl+O** when the "diagnostics found" indicator appears.

76* **Code navigation**: Claude can use the language server to jump to definitions, find references, get type info on hover, list symbols, find implementations, and trace call hierarchies. These operations give Claude more precise navigation than grep-based search, though availability may vary by language and environment.

77 

78If you run into issues, see [Code intelligence troubleshooting](#code-intelligence-issues).

79 

80### External integrations

81 

82These plugins bundle pre-configured [MCP servers](/en/mcp) so you can connect Claude to external services without manual setup:

83 

84* **Source control**: `github`, `gitlab`

85* **Project management**: `atlassian` (Jira/Confluence), `asana`, `linear`, `notion`

86* **Design**: `figma`

87* **Infrastructure**: `vercel`, `firebase`, `supabase`

88* **Communication**: `slack`

89* **Monitoring**: `sentry`

90 

91### Development workflows

92 

93Plugins that add commands and agents for common development tasks:

94 

95* **commit-commands**: Git commit workflows including commit, push, and PR creation

96* **pr-review-toolkit**: Specialized agents for reviewing pull requests

97* **agent-sdk-dev**: Tools for building with the Claude Agent SDK

98* **plugin-dev**: Toolkit for creating your own plugins

99 

100### Output styles

101 

102Customize how Claude responds:

103 

104* **explanatory-output-style**: Educational insights about implementation choices

105* **learning-output-style**: Interactive learning mode for skill building

106 

107## Try it: add the demo marketplace

108 

109Anthropic also maintains a [demo plugins marketplace](https://github.com/anthropics/claude-code/tree/main/plugins) (`claude-code-plugins`) with example plugins that show what's possible with the plugin system. Unlike the official marketplace, you need to add this one manually.

110 

111<Steps>

112 <Step title="Add the marketplace">

113 From within Claude Code, run the `plugin marketplace add` command for the `anthropics/claude-code` marketplace:

114 

115 ```shell theme={null}

116 /plugin marketplace add anthropics/claude-code

117 ```

118 

119 This downloads the marketplace catalog and makes its plugins available to you.

120 </Step>

121 

122 <Step title="Browse available plugins">

123 Run `/plugin` to open the plugin manager. This opens a tabbed interface with four tabs you can cycle through using **Tab** (or **Shift+Tab** to go backward):

124 

125 * **Discover**: browse available plugins from all your marketplaces

126 * **Installed**: view and manage your installed plugins

127 * **Marketplaces**: add, remove, or update your added marketplaces

128 * **Errors**: view any plugin loading errors

129 

130 Go to the **Discover** tab to see plugins from the marketplace you just added.

131 </Step>

132 

133 <Step title="Install a plugin">

134 Select a plugin to view its details, then choose an installation scope:

135 

136 * **User scope**: install for yourself across all projects

137 * **Project scope**: install for all collaborators on this repository

138 * **Local scope**: install for yourself in this repository only

139 

140 For example, select **commit-commands** (a plugin that adds git workflow commands) and install it to your user scope.

141 

142 You can also install directly from the command line:

143 

144 ```shell theme={null}

145 /plugin install commit-commands@anthropics-claude-code

146 ```

147 

148 See [Configuration scopes](/en/settings#configuration-scopes) to learn more about scopes.

149 </Step>

150 

151 <Step title="Use your new plugin">

152 After installing, the plugin's commands are immediately available. Plugin commands are namespaced by the plugin name, so **commit-commands** provides commands like `/commit-commands:commit`.

153 

154 Try it out by making a change to a file and running:

155 

156 ```shell theme={null}

157 /commit-commands:commit

158 ```

159 

160 This stages your changes, generates a commit message, and creates the commit.

161 

162 Each plugin works differently. Check the plugin's description in the **Discover** tab or its homepage to learn what commands and capabilities it provides.

163 </Step>

164</Steps>

165 

166The rest of this guide covers all the ways you can add marketplaces, install plugins, and manage your configuration.

167 

168## Add marketplaces

169 

170Use the `/plugin marketplace add` command to add marketplaces from different sources.

171 

172<Tip>

173 **Shortcuts**: You can use `/plugin market` instead of `/plugin marketplace`, and `rm` instead of `remove`.

174</Tip>

175 

176* **GitHub repositories**: `owner/repo` format (for example, `anthropics/claude-code`)

177* **Git URLs**: any git repository URL (GitLab, Bitbucket, self-hosted)

178* **Local paths**: directories or direct paths to `marketplace.json` files

179* **Remote URLs**: direct URLs to hosted `marketplace.json` files

180 

181### Add from GitHub

182 

183Add a GitHub repository that contains a `.claude-plugin/marketplace.json` file using the `owner/repo` format—where `owner` is the GitHub username or organization and `repo` is the repository name.

184 

185For example, `anthropics/claude-code` refers to the `claude-code` repository owned by `anthropics`:

186 

187```shell theme={null}

188/plugin marketplace add anthropics/claude-code

189```

190 

191### Add from other Git hosts

192 

193Add any git repository by providing the full URL. This works with any Git host, including GitLab, Bitbucket, and self-hosted servers:

194 

195Using HTTPS:

196 

197```shell theme={null}

198/plugin marketplace add https://gitlab.com/company/plugins.git

199```

200 

201Using SSH:

202 

203```shell theme={null}

204/plugin marketplace add git@gitlab.com:company/plugins.git

205```

206 

207To add a specific branch or tag, append `#` followed by the ref:

208 

209```shell theme={null}

210/plugin marketplace add https://gitlab.com/company/plugins.git#v1.0.0

211```

212 

213### Add from local paths

214 

215Add a local directory that contains a `.claude-plugin/marketplace.json` file:

216 

217```shell theme={null}

218/plugin marketplace add ./my-marketplace

219```

220 

221You can also add a direct path to a `marketplace.json` file:

222 

223```shell theme={null}

224/plugin marketplace add ./path/to/marketplace.json

225```

226 

227### Add from remote URLs

228 

229Add a remote `marketplace.json` file via URL:

230 

231```shell theme={null}

232/plugin marketplace add https://example.com/marketplace.json

233```

234 

235<Note>

236 URL-based marketplaces have some limitations compared to Git-based marketplaces. If you encounter "path not found" errors when installing plugins, see [Troubleshooting](/en/plugin-marketplaces#plugins-with-relative-paths-fail-in-url-based-marketplaces).

237</Note>

238 

239## Install plugins

240 

241Once you've added marketplaces, you can install plugins directly (installs to user scope by default):

242 

243```shell theme={null}

244/plugin install plugin-name@marketplace-name

245```

246 

247To choose a different [installation scope](/en/settings#configuration-scopes), use the interactive UI: run `/plugin`, go to the **Discover** tab, and press **Enter** on a plugin. You'll see options for:

248 

249* **User scope** (default): install for yourself across all projects

250* **Project scope**: install for all collaborators on this repository (adds to `.claude/settings.json`)

251* **Local scope**: install for yourself in this repository only (not shared with collaborators)

252 

253You may also see plugins with **managed** scope—these are installed by administrators via [managed settings](/en/settings#settings-files) and cannot be modified.

254 

255Run `/plugin` and go to the **Installed** tab to see your plugins grouped by scope.

256 

257<Warning>

258 Make sure you trust a plugin before installing it. Anthropic does not control what MCP servers, files, or other software are included in plugins and cannot verify that they work as intended. Check each plugin's homepage for more information.

259</Warning>

260 

261## Manage installed plugins

262 

263Run `/plugin` and go to the **Installed** tab to view, enable, disable, or uninstall your plugins. Type to filter the list by plugin name or description.

264 

265You can also manage plugins with direct commands.

266 

267Disable a plugin without uninstalling:

268 

269```shell theme={null}

270/plugin disable plugin-name@marketplace-name

271```

272 

273Re-enable a disabled plugin:

274 

275```shell theme={null}

276/plugin enable plugin-name@marketplace-name

277```

278 

279Completely remove a plugin:

280 

281```shell theme={null}

282/plugin uninstall plugin-name@marketplace-name

283```

284 

285The `--scope` option lets you target a specific scope with CLI commands:

286 

287```shell theme={null}

288claude plugin install formatter@your-org --scope project

289claude plugin uninstall formatter@your-org --scope project

290```

291 

292## Manage marketplaces

293 

294You can manage marketplaces through the interactive `/plugin` interface or with CLI commands.

295 

296### Use the interactive interface

297 

298Run `/plugin` and go to the **Marketplaces** tab to:

299 

300* View all your added marketplaces with their sources and status

301* Add new marketplaces

302* Update marketplace listings to fetch the latest plugins

303* Remove marketplaces you no longer need

304 

305### Use CLI commands

306 

307You can also manage marketplaces with direct commands.

308 

309List all configured marketplaces:

310 

311```shell theme={null}

312/plugin marketplace list

313```

314 

315Refresh plugin listings from a marketplace:

316 

317```shell theme={null}

318/plugin marketplace update marketplace-name

319```

320 

321Remove a marketplace:

322 

323```shell theme={null}

324/plugin marketplace remove marketplace-name

325```

326 

327<Warning>

328 Removing a marketplace will uninstall any plugins you installed from it.

329</Warning>

330 

331### Configure auto-updates

332 

333Claude Code can automatically update marketplaces and their installed plugins at startup. When auto-update is enabled for a marketplace, Claude Code refreshes the marketplace data and updates installed plugins to their latest versions. If any plugins were updated, you'll see a notification suggesting you restart Claude Code.

334 

335Toggle auto-update for individual marketplaces through the UI:

336 

3371. Run `/plugin` to open the plugin manager

3382. Select **Marketplaces**

3393. Choose a marketplace from the list

3404. Select **Enable auto-update** or **Disable auto-update**

341 

342Official Anthropic marketplaces have auto-update enabled by default. Third-party and local development marketplaces have auto-update disabled by default.

343 

344To disable all automatic updates entirely for both Claude Code and all plugins, set the `DISABLE_AUTOUPDATER` environment variable. See [Auto updates](/en/setup#auto-updates) for details.

345 

346To keep plugin auto-updates enabled while disabling Claude Code auto-updates, set `FORCE_AUTOUPDATE_PLUGINS=true` along with `DISABLE_AUTOUPDATER`:

347 

348```shell theme={null}

349export DISABLE_AUTOUPDATER=true

350export FORCE_AUTOUPDATE_PLUGINS=true

351```

352 

353This is useful when you want to manage Claude Code updates manually but still receive automatic plugin updates.

354 

355## Configure team marketplaces

356 

357Team admins can set up automatic marketplace installation for projects by adding marketplace configuration to `.claude/settings.json`. When team members trust the repository folder, Claude Code prompts them to install these marketplaces and plugins.

358 

359Add `extraKnownMarketplaces` to your project's `.claude/settings.json`:

360 

361```json theme={null}

362{

363 "extraKnownMarketplaces": {

364 "my-team-tools": {

365 "source": {

366 "source": "github",

367 "repo": "your-org/claude-plugins"

368 }

369 }

370 }

371}

372```

373 

374For full configuration options including `extraKnownMarketplaces` and `enabledPlugins`, see [Plugin settings](/en/settings#plugin-settings).

375 

376## Troubleshooting

377 

378### /plugin command not recognized

379 

380If you see "unknown command" or the `/plugin` command doesn't appear:

381 

3821. **Check your version**: Run `claude --version`. Plugins require version 1.0.33 or later.

3832. **Update Claude Code**:

384 * **Homebrew**: `brew upgrade claude-code`

385 * **npm**: `npm update -g @anthropic-ai/claude-code`

386 * **Native installer**: Re-run the install command from [Setup](/en/setup)

3873. **Restart Claude Code**: After updating, restart your terminal and run `claude` again.

388 

389### Common issues

390 

391* **Marketplace not loading**: Verify the URL is accessible and that `.claude-plugin/marketplace.json` exists at the path

392* **Plugin installation failures**: Check that plugin source URLs are accessible and repositories are public (or you have access)

393* **Files not found after installation**: Plugins are copied to a cache, so paths referencing files outside the plugin directory won't work

394* **Plugin skills not appearing**: Clear the cache with `rm -rf ~/.claude/plugins/cache`, restart Claude Code, and reinstall the plugin.

395 

396For detailed troubleshooting with solutions, see [Troubleshooting](/en/plugin-marketplaces#troubleshooting) in the marketplace guide. For debugging tools, see [Debugging and development tools](/en/plugins-reference#debugging-and-development-tools).

397 

398### Code intelligence issues

399 

400* **Language server not starting**: verify the binary is installed and available in your `$PATH`. Check the `/plugin` Errors tab for details.

401* **High memory usage**: language servers like `rust-analyzer` and `pyright` can consume significant memory on large projects. If you experience memory issues, disable the plugin with `/plugin disable <plugin-name>` and rely on Claude's built-in search tools instead.

402* **False positive diagnostics in monorepos**: language servers may report unresolved import errors for internal packages if the workspace isn't configured correctly. These don't affect Claude's ability to edit code.

403 

404## Next steps

405 

406* **Build your own plugins**: See [Plugins](/en/plugins) to create skills, agents, and hooks

407* **Create a marketplace**: See [Create a plugin marketplace](/en/plugin-marketplaces) to distribute plugins to your team or community

408* **Technical reference**: See [Plugins reference](/en/plugins-reference) for complete specifications

fast-mode.md +131 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Speed up responses with fast mode

6 

7> Get faster Opus 4.6 responses in Claude Code by toggling fast mode.

8 

9<Note>

10 Fast mode is in [research preview](#research-preview). The feature, pricing, and availability may change based on feedback.

11</Note>

12 

13Fast mode is a high-speed configuration for Claude Opus 4.6, making the model 2.5x faster at a higher cost per token. Toggle it on with `/fast` when you need speed for interactive work like rapid iteration or live debugging, and toggle it off when cost matters more than latency.

14 

15Fast mode is not a different model. It uses the same Opus 4.6 with a different API configuration that prioritizes speed over cost efficiency. You get identical quality and capabilities, just faster responses.

16 

17What to know:

18 

19* Use `/fast` to toggle on fast mode in Claude Code CLI. Also available via `/fast` in Claude Code VS Code Extension.

20* Fast mode for Opus 4.6 pricing starts at \$30/150 MTok. Fast mode is available at a 50% discount for all plans until 11:59pm PT on February 16.

21* Available to all Claude Code users on subscription plans (Pro/Max/Team/Enterprise) and Claude Console.

22* For Claude Code users on subscription plans (Pro/Max/Team/Enterprise), fast mode is available via extra usage only and not included in the subscription rate limits.

23 

24This page covers how to [toggle fast mode](#toggle-fast-mode), its [cost tradeoff](#understand-the-cost-tradeoff), [when to use it](#decide-when-to-use-fast-mode), [requirements](#requirements), and [rate limit behavior](#handle-rate-limits).

25 

26## Toggle fast mode

27 

28Toggle fast mode in either of these ways:

29 

30* Type `/fast` and press Tab to toggle on or off

31* Set `"fastMode": true` in your [user settings file](/en/settings)

32 

33Fast mode persists across sessions. For the best cost efficiency, enable fast mode at the start of a session rather than switching mid-conversation. See [understand the cost tradeoff](#understand-the-cost-tradeoff) for details.

34 

35When you enable fast mode:

36 

37* If you're on a different model, Claude Code automatically switches to Opus 4.6

38* You'll see a confirmation message: "Fast mode ON"

39* A small `↯` icon appears next to the prompt while fast mode is active

40* Run `/fast` again at any time to check whether fast mode is on or off

41 

42When you disable fast mode with `/fast` again, you remain on Opus 4.6. The model does not revert to your previous model. To switch to a different model, use `/model`.

43 

44## Understand the cost tradeoff

45 

46Fast mode has higher per-token pricing than standard Opus 4.6:

47 

48| Mode | Input (MTok) | Output (MTok) |

49| ------------------------------ | ------------ | ------------- |

50| Fast mode on Opus 4.6 (\<200K) | \$30 | \$150 |

51| Fast mode on Opus 4.6 (>200K) | \$60 | \$225 |

52 

53Fast mode is compatible with the 1M token extended context window.

54 

55When you switch into fast mode mid-conversation, you pay the full fast mode uncached input token price for the entire conversation context. This costs more than if you had enabled fast mode from the start.

56 

57## Decide when to use fast mode

58 

59Fast mode is best for interactive work where response latency matters more than cost:

60 

61* Rapid iteration on code changes

62* Live debugging sessions

63* Time-sensitive work with tight deadlines

64 

65Standard mode is better for:

66 

67* Long autonomous tasks where speed matters less

68* Batch processing or CI/CD pipelines

69* Cost-sensitive workloads

70 

71### Fast mode vs effort level

72 

73Fast mode and effort level both affect response speed, but differently:

74 

75| Setting | Effect |

76| ---------------------- | -------------------------------------------------------------------------------- |

77| **Fast mode** | Same model quality, lower latency, higher cost |

78| **Lower effort level** | Less thinking time, faster responses, potentially lower quality on complex tasks |

79 

80You can combine both: use fast mode with a lower [effort level](/en/model-config#adjust-effort-level) for maximum speed on straightforward tasks.

81 

82## Requirements

83 

84Fast mode requires all of the following:

85 

86* **Not available on third-party cloud providers**: fast mode is not available on Amazon Bedrock, Google Vertex AI, or Microsoft Azure Foundry. Fast mode is available through the Anthropic Console API and for Claude subscription plans using extra usage.

87* **Extra usage enabled**: your account must have extra usage enabled, which allows billing beyond your plan's included usage. For individual accounts, enable this in your [Console billing settings](https://platform.claude.com/settings/organization/billing). For Teams and Enterprise, an admin must enable extra usage for the organization.

88 

89<Note>

90 Fast mode usage is billed directly to extra usage, even if you have remaining usage on your plan. This means fast mode tokens do not count against your plan's included usage and are charged at the fast mode rate from the first token.

91</Note>

92 

93* **Admin enablement for Teams and Enterprise**: fast mode is disabled by default for Teams and Enterprise organizations. An admin must explicitly [enable fast mode](#enable-fast-mode-for-your-organization) before users can access it.

94 

95<Note>

96 If your admin has not enabled fast mode for your organization, the `/fast` command will show "Fast mode has been disabled by your organization."

97</Note>

98 

99### Enable fast mode for your organization

100 

101Admins can enable fast mode in:

102 

103* **Console** (API customers): [Claude Code preferences](https://platform.claude.com/claude-code/preferences)

104* **Claude AI** (Teams and Enterprise): [Admin Settings > Claude Code](https://claude.ai/admin-settings/claude-code)

105 

106## Handle rate limits

107 

108Fast mode has separate rate limits from standard Opus 4.6. When you hit the fast mode rate limit or run out of extra usage credits:

109 

1101. Fast mode automatically falls back to standard Opus 4.6

1112. The `↯` icon turns gray to indicate cooldown

1123. You continue working at standard speed and pricing

1134. When the cooldown expires, fast mode automatically re-enables

114 

115To disable fast mode manually instead of waiting for cooldown, run `/fast` again.

116 

117## Research preview

118 

119Fast mode is a research preview feature. This means:

120 

121* The feature may change based on feedback

122* Availability and pricing are subject to change

123* The underlying API configuration may evolve

124 

125Report issues or feedback through your usual Anthropic support channels.

126 

127## See also

128 

129* [Model configuration](/en/model-config): switch models and adjust effort levels

130* [Manage costs effectively](/en/costs): track token usage and reduce costs

131* [Status line configuration](/en/statusline): display model and context information

features-overview.md +278 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Extend Claude Code

6 

7> Understand when to use CLAUDE.md, Skills, subagents, hooks, MCP, and plugins.

8 

9Claude Code combines a model that reasons about your code with [built-in tools](/en/how-claude-code-works#tools) for file operations, search, execution, and web access. The built-in tools cover most coding tasks. This guide covers the extension layer: features you add to customize what Claude knows, connect it to external services, and automate workflows.

10 

11<Note>

12 For how the core agentic loop works, see [How Claude Code works](/en/how-claude-code-works).

13</Note>

14 

15**New to Claude Code?** Start with [CLAUDE.md](/en/memory) for project conventions. Add other extensions as you need them.

16 

17## Overview

18 

19Extensions plug into different parts of the agentic loop:

20 

21* **[CLAUDE.md](/en/memory)** adds persistent context Claude sees every session

22* **[Skills](/en/skills)** add reusable knowledge and invocable workflows

23* **[MCP](/en/mcp)** connects Claude to external services and tools

24* **[Subagents](/en/sub-agents)** run their own loops in isolated context, returning summaries

25* **[Agent teams](/en/agent-teams)** coordinate multiple independent sessions with shared tasks and peer-to-peer messaging

26* **[Hooks](/en/hooks)** run outside the loop entirely as deterministic scripts

27* **[Plugins](/en/plugins)** and **[marketplaces](/en/plugin-marketplaces)** package and distribute these features

28 

29[Skills](/en/skills) are the most flexible extension. A skill is a markdown file containing knowledge, workflows, or instructions. You can invoke skills with a slash command like `/deploy`, or Claude can load them automatically when relevant. Skills can run in your current conversation or in an isolated context via subagents.

30 

31## Match features to your goal

32 

33Features range from always-on context that Claude sees every session, to on-demand capabilities you or Claude can invoke, to background automation that runs on specific events. The table below shows what's available and when each one makes sense.

34 

35| Feature | What it does | When to use it | Example |

36| ---------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |

37| **CLAUDE.md** | Persistent context loaded every conversation | Project conventions, "always do X" rules | "Use pnpm, not npm. Run tests before committing." |

38| **Skill** | Instructions, knowledge, and workflows Claude can use | Reusable content, reference docs, repeatable tasks | `/review` runs your code review checklist; API docs skill with endpoint patterns |

39| **Subagent** | Isolated execution context that returns summarized results | Context isolation, parallel tasks, specialized workers | Research task that reads many files but returns only key findings |

40| **[Agent teams](/en/agent-teams)** | Coordinate multiple independent Claude Code sessions | Parallel research, new feature development, debugging with competing hypotheses | Spawn reviewers to check security, performance, and tests simultaneously |

41| **MCP** | Connect to external services | External data or actions | Query your database, post to Slack, control a browser |

42| **Hook** | Deterministic script that runs on events | Predictable automation, no LLM involved | Run ESLint after every file edit |

43 

44**[Plugins](/en/plugins)** are the packaging layer. A plugin bundles skills, hooks, subagents, and MCP servers into a single installable unit. Plugin skills are namespaced (like `/my-plugin:review`) so multiple plugins can coexist. Use plugins when you want to reuse the same setup across multiple repositories or distribute to others via a **[marketplace](/en/plugin-marketplaces)**.

45 

46### Compare similar features

47 

48Some features can seem similar. Here's how to tell them apart.

49 

50<Tabs>

51 <Tab title="Skill vs Subagent">

52 Skills and subagents solve different problems:

53 

54 * **Skills** are reusable content you can load into any context

55 * **Subagents** are isolated workers that run separately from your main conversation

56 

57 | Aspect | Skill | Subagent |

58 | --------------- | ---------------------------------------------- | ---------------------------------------------------------------- |

59 | **What it is** | Reusable instructions, knowledge, or workflows | Isolated worker with its own context |

60 | **Key benefit** | Share content across contexts | Context isolation. Work happens separately, only summary returns |

61 | **Best for** | Reference material, invocable workflows | Tasks that read many files, parallel work, specialized workers |

62 

63 **Skills can be reference or action.** Reference skills provide knowledge Claude uses throughout your session (like your API style guide). Action skills tell Claude to do something specific (like `/deploy` that runs your deployment workflow).

64 

65 **Use a subagent** when you need context isolation or when your context window is getting full. The subagent might read dozens of files or run extensive searches, but your main conversation only receives a summary. Since subagent work doesn't consume your main context, this is also useful when you don't need the intermediate work to remain visible. Custom subagents can have their own instructions and can preload skills.

66 

67 **They can combine.** A subagent can preload specific skills (`skills:` field). A skill can run in isolated context using `context: fork`. See [Skills](/en/skills) for details.

68 </Tab>

69 

70 <Tab title="CLAUDE.md vs Skill">

71 Both store instructions, but they load differently and serve different purposes.

72 

73 | Aspect | CLAUDE.md | Skill |

74 | ------------------------- | ---------------------------- | --------------------------------------- |

75 | **Loads** | Every session, automatically | On demand |

76 | **Can include files** | Yes, with `@path` imports | Yes, with `@path` imports |

77 | **Can trigger workflows** | No | Yes, with `/<name>` |

78 | **Best for** | "Always do X" rules | Reference material, invocable workflows |

79 

80 **Put it in CLAUDE.md** if Claude should always know it: coding conventions, build commands, project structure, "never do X" rules.

81 

82 **Put it in a skill** if it's reference material Claude needs sometimes (API docs, style guides) or a workflow you trigger with `/<name>` (deploy, review, release).

83 

84 **Rule of thumb:** Keep CLAUDE.md under \~500 lines. If it's growing, move reference content to skills.

85 </Tab>

86 

87 <Tab title="Subagent vs Agent team">

88 Both parallelize work, but they're architecturally different:

89 

90 * **Subagents** run inside your session and report results back to your main context

91 * **Agent teams** are independent Claude Code sessions that communicate with each other

92 

93 | Aspect | Subagent | Agent team |

94 | ----------------- | ------------------------------------------------ | --------------------------------------------------- |

95 | **Context** | Own context window; results return to the caller | Own context window; fully independent |

96 | **Communication** | Reports results back to the main agent only | Teammates message each other directly |

97 | **Coordination** | Main agent manages all work | Shared task list with self-coordination |

98 | **Best for** | Focused tasks where only the result matters | Complex work requiring discussion and collaboration |

99 | **Token cost** | Lower: results summarized back to main context | Higher: each teammate is a separate Claude instance |

100 

101 **Use a subagent** when you need a quick, focused worker: research a question, verify a claim, review a file. The subagent does the work and returns a summary. Your main conversation stays clean.

102 

103 **Use an agent team** when teammates need to share findings, challenge each other, and coordinate independently. Agent teams are best for research with competing hypotheses, parallel code review, and new feature development where each teammate owns a separate piece.

104 

105 **Transition point:** If you're running parallel subagents but hitting context limits, or if your subagents need to communicate with each other, agent teams are the natural next step.

106 

107 <Note>

108 Agent teams are experimental and disabled by default. See [agent teams](/en/agent-teams) for setup and current limitations.

109 </Note>

110 </Tab>

111 

112 <Tab title="MCP vs Skill">

113 MCP connects Claude to external services. Skills extend what Claude knows, including how to use those services effectively.

114 

115 | Aspect | MCP | Skill |

116 | -------------- | ---------------------------------------------------- | ------------------------------------------------------- |

117 | **What it is** | Protocol for connecting to external services | Knowledge, workflows, and reference material |

118 | **Provides** | Tools and data access | Knowledge, workflows, reference material |

119 | **Examples** | Slack integration, database queries, browser control | Code review checklist, deploy workflow, API style guide |

120 

121 These solve different problems and work well together:

122 

123 **MCP** gives Claude the ability to interact with external systems. Without MCP, Claude can't query your database or post to Slack.

124 

125 **Skills** give Claude knowledge about how to use those tools effectively, plus workflows you can trigger with `/<name>`. A skill might include your team's database schema and query patterns, or a `/post-to-slack` workflow with your team's message formatting rules.

126 

127 Example: An MCP server connects Claude to your database. A skill teaches Claude your data model, common query patterns, and which tables to use for different tasks.

128 </Tab>

129</Tabs>

130 

131### Understand how features layer

132 

133Features can be defined at multiple levels: user-wide, per-project, via plugins, or through managed policies. You can also nest CLAUDE.md files in subdirectories or place skills in specific packages of a monorepo. When the same feature exists at multiple levels, here's how they layer:

134 

135* **CLAUDE.md files** are additive: all levels contribute content to Claude's context simultaneously. Files from your working directory and above load at launch; subdirectories load as you work in them. When instructions conflict, Claude uses judgment to reconcile them, with more specific instructions typically taking precedence. See [how Claude looks up memories](/en/memory#how-claude-looks-up-memories).

136* **Skills and subagents** override by name: when the same name exists at multiple levels, one definition wins based on priority (managed > user > project for skills; managed > CLI flag > project > user > plugin for subagents). Plugin skills are [namespaced](/en/plugins#add-skills-to-your-plugin) to avoid conflicts. See [skill discovery](/en/skills#where-skills-live) and [subagent scope](/en/sub-agents#choose-the-subagent-scope).

137* **MCP servers** override by name: local > project > user. See [MCP scope](/en/mcp#scope-hierarchy-and-precedence).

138* **Hooks** merge: all registered hooks fire for their matching events regardless of source. See [hooks](/en/hooks).

139 

140### Combine features

141 

142Each extension solves a different problem: CLAUDE.md handles always-on context, skills handle on-demand knowledge and workflows, MCP handles external connections, subagents handle isolation, and hooks handle automation. Real setups combine them based on your workflow.

143 

144For example, you might use CLAUDE.md for project conventions, a skill for your deployment workflow, MCP to connect to your database, and a hook to run linting after every edit. Each feature handles what it's best at.

145 

146| Pattern | How it works | Example |

147| ---------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |

148| **Skill + MCP** | MCP provides the connection; a skill teaches Claude how to use it well | MCP connects to your database, a skill documents your schema and query patterns |

149| **Skill + Subagent** | A skill spawns subagents for parallel work | `/review` skill kicks off security, performance, and style subagents that work in isolated context |

150| **CLAUDE.md + Skills** | CLAUDE.md holds always-on rules; skills hold reference material loaded on demand | CLAUDE.md says "follow our API conventions," a skill contains the full API style guide |

151| **Hook + MCP** | A hook triggers external actions through MCP | Post-edit hook sends a Slack notification when Claude modifies critical files |

152 

153## Understand context costs

154 

155Every feature you add consumes some of Claude's context. Too much can fill up your context window, but it can also add noise that makes Claude less effective; skills may not trigger correctly, or Claude may lose track of your conventions. Understanding these trade-offs helps you build an effective setup.

156 

157### Context cost by feature

158 

159Each feature has a different loading strategy and context cost:

160 

161| Feature | When it loads | What loads | Context cost |

162| --------------- | ------------------------- | --------------------------------------------- | -------------------------------------------- |

163| **CLAUDE.md** | Session start | Full content | Every request |

164| **Skills** | Session start + when used | Descriptions at start, full content when used | Low (descriptions every request)\* |

165| **MCP servers** | Session start | All tool definitions and schemas | Every request |

166| **Subagents** | When spawned | Fresh context with specified skills | Isolated from main session |

167| **Hooks** | On trigger | Nothing (runs externally) | Zero, unless hook returns additional context |

168 

169\*By default, skill descriptions load at session start so Claude can decide when to use them. Set `disable-model-invocation: true` in a skill's frontmatter to hide it from Claude entirely until you invoke it manually. This reduces context cost to zero for skills you only trigger yourself.

170 

171### Understand how features load

172 

173Each feature loads at different points in your session. The tabs below explain when each one loads and what goes into context.

174 

175<img src="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/context-loading.svg?fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=43114d93ae62bdc1ab6aa64660e2ba3b" alt="Context loading: CLAUDE.md and MCP load at session start and stay in every request. Skills load descriptions at start, full content on invocation. Subagents get isolated context. Hooks run externally." data-og-width="720" width="720" data-og-height="410" height="410" data-path="images/context-loading.svg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/context-loading.svg?w=280&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=cc37ac2b6b486c75dea4cf64add648ec 280w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/context-loading.svg?w=560&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=22394bf8452988091802c6bc471a3153 560w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/context-loading.svg?w=840&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=aaf0301abbd63349b3f5ecf27f3bc4c5 840w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/context-loading.svg?w=1100&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=f262d974340400cfd964c555b523808a 1100w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/context-loading.svg?w=1650&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=430b76391f55ba65a0a3da569a52a450 1650w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/context-loading.svg?w=2500&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=46522043165b15cfef464d5f63c70f7c 2500w" />

176 

177<Tabs>

178 <Tab title="CLAUDE.md">

179 **When:** Session start

180 

181 **What loads:** Full content of all CLAUDE.md files (managed, user, and project levels).

182 

183 **Inheritance:** Claude reads CLAUDE.md files from your working directory up to the root, and discovers nested ones in subdirectories as it accesses those files. See [How Claude looks up memories](/en/memory#how-claude-looks-up-memories) for details.

184 

185 <Tip>Keep CLAUDE.md under \~500 lines. Move reference material to skills, which load on-demand.</Tip>

186 </Tab>

187 

188 <Tab title="Skills">

189 Skills are extra capabilities in Claude's toolkit. They can be reference material (like an API style guide) or invocable workflows you trigger with `/<name>` (like `/deploy`). Some are built-in; you can also create your own. Claude uses skills when appropriate, or you can invoke one directly.

190 

191 **When:** Depends on the skill's configuration. By default, descriptions load at session start and full content loads when used. For user-only skills (`disable-model-invocation: true`), nothing loads until you invoke them.

192 

193 **What loads:** For model-invocable skills, Claude sees names and descriptions in every request. When you invoke a skill with `/<name>` or Claude loads it automatically, the full content loads into your conversation.

194 

195 **How Claude chooses skills:** Claude matches your task against skill descriptions to decide which are relevant. If descriptions are vague or overlap, Claude may load the wrong skill or miss one that would help. To tell Claude to use a specific skill, invoke it with `/<name>`. Skills with `disable-model-invocation: true` are invisible to Claude until you invoke them.

196 

197 **Context cost:** Low until used. User-only skills have zero cost until invoked.

198 

199 **In subagents:** Skills work differently in subagents. Instead of on-demand loading, skills passed to a subagent are fully preloaded into its context at launch. Subagents don't inherit skills from the main session; you must specify them explicitly.

200 

201 <Tip>Use `disable-model-invocation: true` for skills with side effects. This saves context and ensures only you trigger them.</Tip>

202 </Tab>

203 

204 <Tab title="MCP servers">

205 **When:** Session start.

206 

207 **What loads:** All tool definitions and JSON schemas from connected servers.

208 

209 **Context cost:** [Tool search](/en/mcp#scale-with-mcp-tool-search) (enabled by default) loads MCP tools up to 10% of context and defers the rest until needed.

210 

211 **Reliability note:** MCP connections can fail silently mid-session. If a server disconnects, its tools disappear without warning. Claude may try to use a tool that no longer exists. If you notice Claude failing to use an MCP tool it previously could access, check the connection with `/mcp`.

212 

213 <Tip>Run `/mcp` to see token costs per server. Disconnect servers you're not actively using.</Tip>

214 </Tab>

215 

216 <Tab title="Subagents">

217 **When:** On demand, when you or Claude spawns one for a task.

218 

219 **What loads:** Fresh, isolated context containing:

220 

221 * The system prompt (shared with parent for cache efficiency)

222 * Full content of skills listed in the agent's `skills:` field

223 * CLAUDE.md and git status (inherited from parent)

224 * Whatever context the lead agent passes in the prompt

225 

226 **Context cost:** Isolated from main session. Subagents don't inherit your conversation history or invoked skills.

227 

228 <Tip>Use subagents for work that doesn't need your full conversation context. Their isolation prevents bloating your main session.</Tip>

229 </Tab>

230 

231 <Tab title="Hooks">

232 **When:** On trigger. Hooks fire at specific lifecycle events like tool execution, session boundaries, prompt submission, permission requests, and compaction. See [Hooks](/en/hooks) for the full list.

233 

234 **What loads:** Nothing by default. Hooks run as external scripts.

235 

236 **Context cost:** Zero, unless the hook returns output that gets added as messages to your conversation.

237 

238 <Tip>Hooks are ideal for side effects (linting, logging) that don't need to affect Claude's context.</Tip>

239 </Tab>

240</Tabs>

241 

242## Learn more

243 

244Each feature has its own guide with setup instructions, examples, and configuration options.

245 

246<CardGroup cols={2}>

247 <Card title="CLAUDE.md" icon="file-lines" href="/en/memory">

248 Store project context, conventions, and instructions

249 </Card>

250 

251 <Card title="Skills" icon="brain" href="/en/skills">

252 Give Claude domain expertise and reusable workflows

253 </Card>

254 

255 <Card title="Subagents" icon="users" href="/en/sub-agents">

256 Offload work to isolated context

257 </Card>

258 

259 <Card title="Agent teams" icon="network" href="/en/agent-teams">

260 Coordinate multiple sessions working in parallel

261 </Card>

262 

263 <Card title="MCP" icon="plug" href="/en/mcp">

264 Connect Claude to external services

265 </Card>

266 

267 <Card title="Hooks" icon="bolt" href="/en/hooks-guide">

268 Automate workflows with hooks

269 </Card>

270 

271 <Card title="Plugins" icon="puzzle-piece" href="/en/plugins">

272 Bundle and share feature sets

273 </Card>

274 

275 <Card title="Marketplaces" icon="store" href="/en/plugin-marketplaces">

276 Host and distribute plugin collections

277 </Card>

278</CardGroup>

github-actions.md +29 −22

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Claude Code GitHub Actions5# Claude Code GitHub Actions

2 6 

3> Learn about integrating Claude Code into your development workflow with Claude Code GitHub Actions7> Learn about integrating Claude Code into your development workflow with Claude Code GitHub Actions


5Claude Code GitHub Actions brings AI-powered automation to your GitHub workflow. With a simple `@claude` mention in any PR or issue, Claude can analyze your code, create pull requests, implement features, and fix bugs - all while following your project's standards.9Claude Code GitHub Actions brings AI-powered automation to your GitHub workflow. With a simple `@claude` mention in any PR or issue, Claude can analyze your code, create pull requests, implement features, and fix bugs - all while following your project's standards.

6 10 

7<Note>11<Note>

8 Claude Code GitHub Actions is built on top of the [Claude Code12 Claude Code GitHub Actions is built on top of the [Claude

9 SDK](/en/docs/claude-code/sdk), which enables programmatic integration of13 Agent SDK](https://platform.claude.com/docs/en/agent-sdk/overview), which enables programmatic integration of

10 Claude Code into your applications. You can use the SDK to build custom14 Claude Code into your applications. You can use the SDK to build custom

11 automation workflows beyond GitHub Actions.15 automation workflows beyond GitHub Actions.

12</Note>16</Note>

13 17 

18<Info>

19 **Claude Opus 4.6 is now available.** Claude Code GitHub Actions default to Sonnet. To use Opus 4.6, configure the [model parameter](#breaking-changes-reference) to use `claude-opus-4-6`.

20</Info>

21 

14## Why use Claude Code GitHub Actions?22## Why use Claude Code GitHub Actions?

15 23 

16* **Instant PR creation**: Describe what you need, and Claude creates a complete PR with all necessary changes24* **Instant PR creation**: Describe what you need, and Claude creates a complete PR with all necessary changes


633. **Copy the workflow file** from [examples/claude.yml](https://github.com/anthropics/claude-code-action/blob/main/examples/claude.yml) into your repository's `.github/workflows/`713. **Copy the workflow file** from [examples/claude.yml](https://github.com/anthropics/claude-code-action/blob/main/examples/claude.yml) into your repository's `.github/workflows/`

64 72 

65<Tip>73<Tip>

66 After completing either the quickstart or manual setup, test the action by74 After completing either the quickstart or manual setup, test the action by tagging `@claude` in an issue or PR comment.

67 tagging `@claude` in an issue or PR comment!

68</Tip>75</Tip>

69 76 

70## Upgrading from Beta77## Upgrading from Beta


87### Breaking Changes Reference94### Breaking Changes Reference

88 95 

89| Old Beta Input | New v1.0 Input |96| Old Beta Input | New v1.0 Input |

90| --------------------- | -------------------------------- |97| --------------------- | ------------------------------------- |

91| `mode` | *(Removed - auto-detected)* |98| `mode` | *(Removed - auto-detected)* |

92| `direct_prompt` | `prompt` |99| `direct_prompt` | `prompt` |

93| `override_prompt` | `prompt` with GitHub variables |100| `override_prompt` | `prompt` with GitHub variables |

94| `custom_instructions` | `claude_args: --system-prompt` |101| `custom_instructions` | `claude_args: --append-system-prompt` |

95| `max_turns` | `claude_args: --max-turns` |102| `max_turns` | `claude_args: --max-turns` |

96| `model` | `claude_args: --model` |103| `model` | `claude_args: --model` |

97| `allowed_tools` | `claude_args: --allowedTools` |104| `allowed_tools` | `claude_args: --allowedTools` |


110 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}117 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

111 custom_instructions: "Follow our coding standards"118 custom_instructions: "Follow our coding standards"

112 max_turns: "10"119 max_turns: "10"

113 model: "claude-sonnet-4-5-20250929"120 model: "claude-sonnet-4-6"

114```121```

115 122 

116**GA version (v1.0):**123**GA version (v1.0):**


121 prompt: "Review this PR for security issues"128 prompt: "Review this PR for security issues"

122 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}129 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

123 claude_args: |130 claude_args: |

124 --system-prompt "Follow our coding standards"131 --append-system-prompt "Follow our coding standards"

125 --max-turns 10132 --max-turns 10

126 --model claude-sonnet-4-5-20250929133 --model claude-sonnet-4-6

127```134```

128 135 

129<Tip>136<Tip>


153 # Responds to @claude mentions in comments160 # Responds to @claude mentions in comments

154```161```

155 162 

156### Using slash commands163### Using skills

157 164 

158```yaml theme={null}165```yaml theme={null}

159name: Code Review166name: Code Review


186 with:193 with:

187 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}194 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

188 prompt: "Generate a summary of yesterday's commits and open issues"195 prompt: "Generate a summary of yesterday's commits and open issues"

189 claude_args: "--model claude-opus-4-1-20250805"196 claude_args: "--model opus"

190```197```

191 198 

192### Common use cases199### Common use cases


209 216 

210### Security considerations217### Security considerations

211 218 

212<Warning>Never commit API keys directly to your repository!</Warning>219<Warning>Never commit API keys directly to your repository.</Warning>

213 220 

214For comprehensive security guidance including permissions, authentication, and best practices, see the [Claude Code Action security documentation](https://github.com/anthropics/claude-code-action/blob/main/docs/security.md).221For comprehensive security guidance including permissions, authentication, and best practices, see the [Claude Code Action security documentation](https://github.com/anthropics/claude-code-action/blob/main/docs/security.md).

215 222 


220* Limit action permissions to only what's necessary227* Limit action permissions to only what's necessary

221* Review Claude's suggestions before merging228* Review Claude's suggestions before merging

222 229 

223Always use GitHub Secrets (e.g., `${{ secrets.ANTHROPIC_API_KEY }}`) rather than hardcoding API keys directly in your workflow files.230Always use GitHub Secrets (for example, `${{ secrets.ANTHROPIC_API_KEY }}`) rather than hardcoding API keys directly in your workflow files.

224 231 

225### Optimizing performance232### Optimizing performance

226 233 


263Key features:270Key features:

264 271 

265* **Unified prompt interface** - Use `prompt` for all instructions272* **Unified prompt interface** - Use `prompt` for all instructions

266* **Slash commands** - Pre-built prompts like `/review` or `/fix`273* **Commands** - Prebuilt prompts like `/review` or `/fix`

267* **CLI passthrough** - Any Claude Code CLI argument via `claude_args`274* **CLI passthrough** - Any Claude Code CLI argument via `claude_args`

268* **Flexible triggers** - Works with any GitHub event275* **Flexible triggers** - Works with any GitHub event

269 276 


514 with:521 with:

515 github_token: ${{ steps.app-token.outputs.token }}522 github_token: ${{ steps.app-token.outputs.token }}

516 use_bedrock: "true"523 use_bedrock: "true"

517 claude_args: '--model us.anthropic.claude-sonnet-4-5-20250929-v1:0 --max-turns 10'524 claude_args: '--model us.anthropic.claude-sonnet-4-6 --max-turns 10'

518 ```525 ```

519 526 

520 <Tip>527 <Tip>

521 The model ID format for Bedrock includes the region prefix (e.g., `us.anthropic.claude...`) and version suffix.528 The model ID format for Bedrock includes a region prefix (for example, `us.anthropic.claude-sonnet-4-6`).

522 </Tip>529 </Tip>

523 </Accordion>530 </Accordion>

524 531 


621The Claude Code Action v1 uses a simplified configuration:628The Claude Code Action v1 uses a simplified configuration:

622 629 

623| Parameter | Description | Required |630| Parameter | Description | Required |

624| ------------------- | ----------------------------------------------- | -------- |631| ------------------- | ------------------------------------------------------ | -------- |

625| `prompt` | Instructions for Claude (text or slash command) | No\* |632| `prompt` | Instructions for Claude (text or skill like `/review`) | No\* |

626| `claude_args` | CLI arguments passed to Claude Code | No |633| `claude_args` | CLI arguments passed to Claude Code | No |

627| `anthropic_api_key` | Claude API key | Yes\*\* |634| `anthropic_api_key` | Claude API key | Yes\*\* |

628| `github_token` | GitHub token for API access | No |635| `github_token` | GitHub token for API access | No |


633\*Prompt is optional - when omitted for issue/PR comments, Claude responds to trigger phrase\640\*Prompt is optional - when omitted for issue/PR comments, Claude responds to trigger phrase\

634\*\*Required for direct Claude API, not for Bedrock/Vertex641\*\*Required for direct Claude API, not for Bedrock/Vertex

635 642 

636#### Using claude\_args643#### Pass CLI arguments

637 644 

638The `claude_args` parameter accepts any Claude Code CLI arguments:645The `claude_args` parameter accepts any Claude Code CLI arguments:

639 646 

640```yaml theme={null}647```yaml theme={null}

641claude_args: "--max-turns 5 --model claude-sonnet-4-5-20250929 --mcp-config /path/to/config.json"648claude_args: "--max-turns 5 --model claude-sonnet-4-6 --mcp-config /path/to/config.json"

642```649```

643 650 

644Common arguments:651Common arguments:

645 652 

646* `--max-turns`: Maximum conversation turns (default: 10)653* `--max-turns`: Maximum conversation turns (default: 10)

647* `--model`: Model to use (e.g., `claude-sonnet-4-5-20250929`)654* `--model`: Model to use (for example, `claude-sonnet-4-6`)

648* `--mcp-config`: Path to MCP configuration655* `--mcp-config`: Path to MCP configuration

649* `--allowed-tools`: Comma-separated list of allowed tools656* `--allowed-tools`: Comma-separated list of allowed tools

650* `--debug`: Enable debug output657* `--debug`: Enable debug output


663 670 

664You can configure Claude's behavior in two ways:671You can configure Claude's behavior in two ways:

665 672 

6661. **CLAUDE.md**: Define coding standards, review criteria, and project-specific rules in a `CLAUDE.md` file at the root of your repository. Claude will follow these guidelines when creating PRs and responding to requests. Check out our [Memory documentation](/en/docs/claude-code/memory) for more details.6731. **CLAUDE.md**: Define coding standards, review criteria, and project-specific rules in a `CLAUDE.md` file at the root of your repository. Claude will follow these guidelines when creating PRs and responding to requests. Check out our [Memory documentation](/en/memory) for more details.

6672. **Custom prompts**: Use the `prompt` parameter in the workflow file to provide workflow-specific instructions. This allows you to customize Claude's behavior for different workflows or tasks.6742. **Custom prompts**: Use the `prompt` parameter in the workflow file to provide workflow-specific instructions. This allows you to customize Claude's behavior for different workflows or tasks.

668 675 

669Claude will follow these guidelines when creating PRs and responding to requests.676Claude will follow these guidelines when creating PRs and responding to requests.

gitlab-ci-cd.md +17 −13

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Claude Code GitLab CI/CD5# Claude Code GitLab CI/CD

2 6 

3> Learn about integrating Claude Code into your development workflow with GitLab CI/CD7> Learn about integrating Claude Code into your development workflow with GitLab CI/CD


9</Info>13</Info>

10 14 

11<Note>15<Note>

12 This integration is built on top of the [Claude Code CLI and SDK](/en/docs/claude-code/sdk), enabling programmatic use of Claude in your CI/CD jobs and custom automation workflows.16 This integration is built on top of the [Claude Code CLI and Agent SDK](https://platform.claude.com/docs/en/agent-sdk/overview), enabling programmatic use of Claude in your CI/CD jobs and custom automation workflows.

13</Note>17</Note>

14 18 

15## Why use Claude Code with GitLab?19## Why use Claude Code with GitLab?


77 before_script:81 before_script:

78 - apk update82 - apk update

79 - apk add --no-cache git curl bash83 - apk add --no-cache git curl bash

80 - npm install -g @anthropic-ai/claude-code84 - curl -fsSL https://claude.ai/install.sh | bash

81 script:85 script:

82 # Optional: start a GitLab MCP server if your setup provides one86 # Optional: start a GitLab MCP server if your setup provides one

83 - /bin/gitlab-mcp-server || true87 - /bin/gitlab-mcp-server || true


87 claude91 claude

88 -p "${AI_FLOW_INPUT:-'Review this MR and implement the requested changes'}"92 -p "${AI_FLOW_INPUT:-'Review this MR and implement the requested changes'}"

89 --permission-mode acceptEdits93 --permission-mode acceptEdits

90 --allowedTools "Bash(*) Read(*) Edit(*) Write(*) mcp__gitlab"94 --allowedTools "Bash Read Edit Write mcp__gitlab"

91 --debug95 --debug

92```96```

93 97 


255 before_script:259 before_script:

256 - apk update260 - apk update

257 - apk add --no-cache git curl bash261 - apk add --no-cache git curl bash

258 - npm install -g @anthropic-ai/claude-code262 - curl -fsSL https://claude.ai/install.sh | bash

259 script:263 script:

260 - /bin/gitlab-mcp-server || true264 - /bin/gitlab-mcp-server || true

261 - >265 - >

262 claude266 claude

263 -p "${AI_FLOW_INPUT:-'Summarize recent changes and suggest improvements'}"267 -p "${AI_FLOW_INPUT:-'Summarize recent changes and suggest improvements'}"

264 --permission-mode acceptEdits268 --permission-mode acceptEdits

265 --allowedTools "Bash(*) Read(*) Edit(*) Write(*) mcp__gitlab"269 --allowedTools "Bash Read Edit Write mcp__gitlab"

266 --debug270 --debug

267 # Claude Code will use ANTHROPIC_API_KEY from CI/CD variables271 # Claude Code will use ANTHROPIC_API_KEY from CI/CD variables

268```272```


289 before_script:293 before_script:

290 - apk add --no-cache bash curl jq git python3 py3-pip294 - apk add --no-cache bash curl jq git python3 py3-pip

291 - pip install --no-cache-dir awscli295 - pip install --no-cache-dir awscli

292 - npm install -g @anthropic-ai/claude-code296 - curl -fsSL https://claude.ai/install.sh | bash

293 # Exchange GitLab OIDC token for AWS credentials297 # Exchange GitLab OIDC token for AWS credentials

294 - export AWS_WEB_IDENTITY_TOKEN_FILE="${CI_JOB_JWT_FILE:-/tmp/oidc_token}"298 - export AWS_WEB_IDENTITY_TOKEN_FILE="${CI_JOB_JWT_FILE:-/tmp/oidc_token}"

295 - if [ -n "${CI_JOB_JWT_V2}" ]; then printf "%s" "$CI_JOB_JWT_V2" > "$AWS_WEB_IDENTITY_TOKEN_FILE"; fi299 - if [ -n "${CI_JOB_JWT_V2}" ]; then printf "%s" "$CI_JOB_JWT_V2" > "$AWS_WEB_IDENTITY_TOKEN_FILE"; fi


308 claude312 claude

309 -p "${AI_FLOW_INPUT:-'Implement the requested changes and open an MR'}"313 -p "${AI_FLOW_INPUT:-'Implement the requested changes and open an MR'}"

310 --permission-mode acceptEdits314 --permission-mode acceptEdits

311 --allowedTools "Bash(*) Read(*) Edit(*) Write(*) mcp__gitlab"315 --allowedTools "Bash Read Edit Write mcp__gitlab"

312 --debug316 --debug

313 variables:317 variables:

314 AWS_REGION: "us-west-2"318 AWS_REGION: "us-west-2"

315```319```

316 320 

317<Note>321<Note>

318 Model IDs for Bedrock include region-specific prefixes and version suffixes (for example, `us.anthropic.claude-sonnet-4-5-20250929-v1:0`). Pass the desired model via your job configuration or prompt if your workflow supports it.322 Model IDs for Bedrock include region-specific prefixes (for example, `us.anthropic.claude-sonnet-4-6`). Pass the desired model via your job configuration or prompt if your workflow supports it.

319</Note>323</Note>

320 324 

321### Google Vertex AI job example (Workload Identity Federation)325### Google Vertex AI job example (Workload Identity Federation)


339 rules:343 rules:

340 - if: '$CI_PIPELINE_SOURCE == "web"'344 - if: '$CI_PIPELINE_SOURCE == "web"'

341 before_script:345 before_script:

342 - apt-get update && apt-get install -y git nodejs npm && apt-get clean346 - apt-get update && apt-get install -y git && apt-get clean

343 - npm install -g @anthropic-ai/claude-code347 - curl -fsSL https://claude.ai/install.sh | bash

344 # Authenticate to Google Cloud via WIF (no downloaded keys)348 # Authenticate to Google Cloud via WIF (no downloaded keys)

345 - >349 - >

346 gcloud auth login --cred-file=<(cat <<EOF350 gcloud auth login --cred-file=<(cat <<EOF


361 claude365 claude

362 -p "${AI_FLOW_INPUT:-'Review and update code as requested'}"366 -p "${AI_FLOW_INPUT:-'Review and update code as requested'}"

363 --permission-mode acceptEdits367 --permission-mode acceptEdits

364 --allowedTools "Bash(*) Read(*) Edit(*) Write(*) mcp__gitlab"368 --allowedTools "Bash Read Edit Write mcp__gitlab"

365 --debug369 --debug

366 variables:370 variables:

367 CLOUD_ML_REGION: "us-east5"371 CLOUD_ML_REGION: "us-east5"


379 383 

380### Security considerations384### Security considerations

381 385 

382Never commit API keys or cloud credentials to your repository! Always use GitLab CI/CD variables:386**Never commit API keys or cloud credentials to your repository**. Always use GitLab CI/CD variables:

383 387 

384* Add `ANTHROPIC_API_KEY` as a masked variable (and protect it if needed)388* Add `ANTHROPIC_API_KEY` as a masked variable (and protect it if needed)

385* Use provider-specific OIDC where possible (no long-lived keys)389* Use provider-specific OIDC where possible (no long-lived keys)


404* **API costs**:408* **API costs**:

405 * Each Claude interaction consumes tokens based on prompt and response size409 * Each Claude interaction consumes tokens based on prompt and response size

406 * Token usage varies by task complexity and codebase size410 * Token usage varies by task complexity and codebase size

407 * See [Anthropic pricing](/en/docs/about-claude/pricing) for details411 * See [Anthropic pricing](https://platform.claude.com/docs/en/about-claude/pricing) for details

408 412 

409* **Cost optimization tips**:413* **Cost optimization tips**:

410 * Use specific `@claude` commands to reduce unnecessary turns414 * Use specific `@claude` commands to reduce unnecessary turns

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Claude Code on Google Vertex AI5# Claude Code on Google Vertex AI

2 6 

3> Learn about configuring Claude Code through Google Vertex AI, including setup, IAM configuration, and troubleshooting.7> Learn about configuring Claude Code through Google Vertex AI, including setup, IAM configuration, and troubleshooting.


8 12 

9* A Google Cloud Platform (GCP) account with billing enabled13* A Google Cloud Platform (GCP) account with billing enabled

10* A GCP project with Vertex AI API enabled14* A GCP project with Vertex AI API enabled

11* Access to desired Claude models (e.g., Claude Sonnet 4.5)15* Access to desired Claude models (for example, Claude Sonnet 4.6)

12* Google Cloud SDK (`gcloud`) installed and configured16* Google Cloud SDK (`gcloud`) installed and configured

13* Quota allocated in desired GCP region17* Quota allocated in desired GCP region

14 18 

19<Note>

20 If you are deploying Claude Code to multiple users, [pin your model versions](#5-pin-model-versions) to prevent breakage when Anthropic releases new models.

21</Note>

22 

15## Region Configuration23## Region Configuration

16 24 

17Claude Code can be used with both Vertex AI [global](https://cloud.google.com/blog/products/ai-machine-learning/global-endpoint-for-claude-models-generally-available-on-vertex-ai) and regional endpoints.25Claude Code can be used with both Vertex AI [global](https://cloud.google.com/blog/products/ai-machine-learning/global-endpoint-for-claude-models-generally-available-on-vertex-ai) and regional endpoints.

18 26 

19<Note>27<Note>

20 Vertex AI may not support the Claude Code default models on all regions. You may need to switch to a [supported region or model](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations#genai-partner-models).28 Vertex AI may not support the Claude Code default models in all [regions](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations#genai-partner-models) or on [global endpoints](https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models#supported_models). You may need to switch to a supported region, use a regional endpoint, or specify a supported model.

21</Note>

22 

23<Note>

24 Vertex AI may not support the Claude Code default models on global endpoints. You may need to switch to a regional endpoint or [supported model](https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models#supported_models).

25</Note>29</Note>

26 30 

27## Setup31## Setup


44 48 

451. Navigate to the [Vertex AI Model Garden](https://console.cloud.google.com/vertex-ai/model-garden)491. Navigate to the [Vertex AI Model Garden](https://console.cloud.google.com/vertex-ai/model-garden)

462. Search for "Claude" models502. Search for "Claude" models

473. Request access to desired Claude models (e.g., Claude Sonnet 4.5)513. Request access to desired Claude models (for example, Claude Sonnet 4.6)

484. Wait for approval (may take 24-48 hours)524. Wait for approval (may take 24-48 hours)

49 53 

50### 3. Configure GCP credentials54### 3. Configure GCP credentials


81export VERTEX_REGION_CLAUDE_4_1_OPUS=europe-west185export VERTEX_REGION_CLAUDE_4_1_OPUS=europe-west1

82```86```

83 87 

84<Note>88[Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) is automatically supported when you specify the `cache_control` ephemeral flag. To disable it, set `DISABLE_PROMPT_CACHING=1`. For heightened rate limits, contact Google Cloud support. When using Vertex AI, the `/login` and `/logout` commands are disabled since authentication is handled through Google Cloud credentials.

85 [Prompt caching](/en/docs/build-with-claude/prompt-caching) is automatically supported when you specify the `cache_control` ephemeral flag. To disable it, set `DISABLE_PROMPT_CACHING=1`. For heightened rate limits, contact Google Cloud support.

86</Note>

87 89 

88<Note>90### 5. Pin model versions

89 When using Vertex AI, the `/login` and `/logout` commands are disabled since authentication is handled through Google Cloud credentials.91 

90</Note>92<Warning>

93 Pin specific model versions for every deployment. If you use model aliases (`sonnet`, `opus`, `haiku`) without pinning, Claude Code may attempt to use a newer model version that isn't enabled in your Vertex AI project, breaking existing users when Anthropic releases updates.

94</Warning>

95 

96Set these environment variables to specific Vertex AI model IDs:

91 97 

92### 5. Model configuration98```bash theme={null}

99export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-6'

100export ANTHROPIC_DEFAULT_SONNET_MODEL='claude-sonnet-4-6'

101export ANTHROPIC_DEFAULT_HAIKU_MODEL='claude-haiku-4-5@20251001'

102```

93 103 

94Claude Code uses these default models for Vertex AI:104For current and legacy model IDs, see [Models overview](https://platform.claude.com/docs/en/about-claude/models/overview). See [Model configuration](/en/model-config#pin-models-for-third-party-deployments) for the full list of environment variables.

105 

106Claude Code uses these default models when no pinning variables are set:

95 107 

96| Model type | Default value |108| Model type | Default value |

97| :--------------- | :--------------------------- |109| :--------------- | :-------------------------- |

98| Primary model | `claude-sonnet-4-5@20250929` |110| Primary model | `claude-sonnet-4-6` |

99| Small/fast model | `claude-haiku-4-5@20251001` |111| Small/fast model | `claude-haiku-4-5@20251001` |

100 112 

101<Note>113To customize models further:

102 For Vertex AI users, Claude Code will not automatically upgrade from Haiku 3.5 to Haiku 4.5. To manually switch to a newer Haiku model, set the `ANTHROPIC_DEFAULT_HAIKU_MODEL` environment variable to the full model name (e.g., `claude-haiku-4-5@20251001`).

103</Note>

104 

105To customize models:

106 114 

107```bash theme={null}115```bash theme={null}

108export ANTHROPIC_MODEL='claude-opus-4-1@20250805'116export ANTHROPIC_MODEL='claude-opus-4-6'

109export ANTHROPIC_SMALL_FAST_MODEL='claude-haiku-4-5@20251001'117export ANTHROPIC_SMALL_FAST_MODEL='claude-haiku-4-5@20251001'

110```118```

111 119 


122For details, see [Vertex IAM documentation](https://cloud.google.com/vertex-ai/docs/general/access-control).130For details, see [Vertex IAM documentation](https://cloud.google.com/vertex-ai/docs/general/access-control).

123 131 

124<Note>132<Note>

125 We recommend creating a dedicated GCP project for Claude Code to simplify cost tracking and access control.133 Create a dedicated GCP project for Claude Code to simplify cost tracking and access control.

126</Note>134</Note>

127 135 

128## 1M token context window136## 1M token context window

129 137 

130Claude Sonnet 4 and Sonnet 4.5 support the [1M token context window](/en/docs/build-with-claude/context-windows#1m-token-context-window) on Vertex AI.138Claude Sonnet 4 and Sonnet 4.6 support the [1M token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows#1m-token-context-window) on Vertex AI.

131 139 

132<Note>140<Note>

133 The 1M token context window is currently in beta. To use the extended context window, include the `context-1m-2025-08-07` beta header in your Vertex AI requests.141 The 1M token context window is currently in beta. To use the extended context window, include the `context-1m-2025-08-07` beta header in your Vertex AI requests.

headless.md +104 −137

Details

1# Headless mode1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Run Claude Code programmatically without interactive UI5# Run Claude Code programmatically

4 6 

5## Overview7> Use the Agent SDK to run Claude Code programmatically from the CLI, Python, or TypeScript.

6 8 

7The headless mode allows you to run Claude Code programmatically from command line scripts and automation tools without any interactive UI.9The [Agent SDK](https://platform.claude.com/docs/en/agent-sdk/overview) gives you the same tools, agent loop, and context management that power Claude Code. It's available as a CLI for scripts and CI/CD, or as [Python](https://platform.claude.com/docs/en/agent-sdk/python) and [TypeScript](https://platform.claude.com/docs/en/agent-sdk/typescript) packages for full programmatic control.

8 10 

9## Basic usage11<Note>

12 The CLI was previously called "headless mode." The `-p` flag and all CLI options work the same way.

13</Note>

10 14 

11The primary command-line interface to Claude Code is the `claude` command. Use the `--print` (or `-p`) flag to run in non-interactive mode and print the final result:15To run Claude Code programmatically from the CLI, pass `-p` with your prompt and any [CLI options](/en/cli-reference):

12 16 

13```bash theme={null}17```bash theme={null}

14claude -p "Stage my changes and write a set of commits for them" \18claude -p "Find and fix the bug in auth.py" --allowedTools "Read,Edit,Bash"

15 --allowedTools "Bash,Read" \

16 --permission-mode acceptEdits

17```19```

18 20 

19## Configuration Options21This page covers using the Agent SDK via the CLI (`claude -p`). For the Python and TypeScript SDK packages with structured outputs, tool approval callbacks, and native message objects, see the [full Agent SDK documentation](https://platform.claude.com/docs/en/agent-sdk/overview).

20 

21Headless mode leverages all the CLI options available in Claude Code. Here are the key ones for automation and scripting:

22 22 

23| Flag | Description | Example |23## Basic usage

24| :------------------------- | :----------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------ |

25| `--print`, `-p` | Run in non-interactive mode | `claude -p "query"` |

26| `--output-format` | Specify output format (`text`, `json`, `stream-json`) | `claude -p --output-format json` |

27| `--resume`, `-r` | Resume a conversation by session ID | `claude --resume abc123` |

28| `--continue`, `-c` | Continue the most recent conversation | `claude --continue` |

29| `--verbose` | Enable verbose logging | `claude --verbose` |

30| `--append-system-prompt` | Append to system prompt (only with `--print`) | `claude --append-system-prompt "Custom instruction"` |

31| `--allowedTools` | Space-separated list of allowed tools, or <br /><br /> string of comma-separated list of allowed tools | `claude --allowedTools mcp__slack mcp__filesystem`<br /><br />`claude --allowedTools "Bash(npm install),mcp__filesystem"` |

32| `--disallowedTools` | Space-separated list of denied tools, or <br /><br /> string of comma-separated list of denied tools | `claude --disallowedTools mcp__splunk mcp__github`<br /><br />`claude --disallowedTools "Bash(git commit),mcp__github"` |

33| `--mcp-config` | Load MCP servers from a JSON file | `claude --mcp-config servers.json` |

34| `--permission-prompt-tool` | MCP tool for handling permission prompts (only with `--print`) | `claude --permission-prompt-tool mcp__auth__prompt` |

35 24 

36For a complete list of CLI options and features, see the [CLI reference](/en/docs/claude-code/cli-reference) documentation.25Add the `-p` (or `--print`) flag to any `claude` command to run it non-interactively. All [CLI options](/en/cli-reference) work with `-p`, including:

37 26 

38## Multi-turn conversations27* `--continue` for [continuing conversations](#continue-conversations)

28* `--allowedTools` for [auto-approving tools](#auto-approve-tools)

29* `--output-format` for [structured output](#get-structured-output)

39 30 

40For multi-turn conversations, you can resume conversations or continue from the most recent session:31This example asks Claude a question about your codebase and prints the response:

41 32 

42```bash theme={null}33```bash theme={null}

43# Continue the most recent conversation34claude -p "What does the auth module do?"

44claude --continue "Now refactor this for better performance"35```

45 36 

46# Resume a specific conversation by session ID37## Examples

47claude --resume 550e8400-e29b-41d4-a716-446655440000 "Update the tests"

48 38 

49# Resume in non-interactive mode39These examples highlight common CLI patterns.

50claude --resume 550e8400-e29b-41d4-a716-446655440000 "Fix all linting issues" --no-interactive40 

51```41### Get structured output

42 

43Use `--output-format` to control how responses are returned:

52 44 

53## Output Formats45* `text` (default): plain text output

46* `json`: structured JSON with result, session ID, and metadata

47* `stream-json`: newline-delimited JSON for real-time streaming

54 48 

55### Text Output (Default)49This example returns a project summary as JSON with session metadata, with the text result in the `result` field:

56 50 

57```bash theme={null}51```bash theme={null}

58claude -p "Explain file src/components/Header.tsx"52claude -p "Summarize this project" --output-format json

59# Output: This is a React component showing...

60```53```

61 54 

62### JSON Output55To get output conforming to a specific schema, use `--output-format json` with `--json-schema` and a [JSON Schema](https://json-schema.org/) definition. The response includes metadata about the request (session ID, usage, etc.) with the structured output in the `structured_output` field.

63 56 

64Returns structured data including metadata:57This example extracts function names and returns them as an array of strings:

65 58 

66```bash theme={null}59```bash theme={null}

67claude -p "How does the data layer work?" --output-format json60claude -p "Extract the main function names from auth.py" \

61 --output-format json \

62 --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'

68```63```

69 64 

70Response format:65<Tip>

71 66 Use a tool like [jq](https://jqlang.github.io/jq/) to parse the response and extract specific fields:

72```json theme={null}

73{

74 "type": "result",

75 "subtype": "success",

76 "total_cost_usd": 0.003,

77 "is_error": false,

78 "duration_ms": 1234,

79 "duration_api_ms": 800,

80 "num_turns": 6,

81 "result": "The response text here...",

82 "session_id": "abc123"

83}

84```

85 67 

86### Streaming JSON Output68 ```bash theme={null}

69 # Extract the text result

70 claude -p "Summarize this project" --output-format json | jq -r '.result'

87 71 

88Streams each message as it is received:72 # Extract structured output

73 claude -p "Extract function names from auth.py" \

74 --output-format json \

75 --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}' \

76 | jq '.structured_output'

77 ```

78</Tip>

89 79 

90```bash theme={null}80### Stream responses

91claude -p "Build an application" --output-format stream-json

92```

93 81 

94Each conversation begins with an initial `init` system message, followed by a list of user and assistant messages, followed by a final `result` system message with stats. Each message is emitted as a separate JSON object.82Use `--output-format stream-json` with `--verbose` and `--include-partial-messages` to receive tokens as they're generated. Each line is a JSON object representing an event:

95 83 

96## Input Formats84```bash theme={null}

85claude -p "Explain recursion" --output-format stream-json --verbose --include-partial-messages

86```

97 87 

98### Text Input (Default)88The following example uses [jq](https://jqlang.github.io/jq/) to filter for text deltas and display just the streaming text. The `-r` flag outputs raw strings (no quotes) and `-j` joins without newlines so tokens stream continuously:

99 89 

100```bash theme={null}90```bash theme={null}

101# Direct argument91claude -p "Write a poem" --output-format stream-json --verbose --include-partial-messages | \

102claude -p "Explain this code"92 jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'

103 

104# From stdin

105echo "Explain this code" | claude -p

106```93```

107 94 

108### Streaming JSON Input95For programmatic streaming with callbacks and message objects, see [Stream responses in real-time](https://platform.claude.com/docs/en/agent-sdk/streaming-output) in the Agent SDK documentation.

109 96 

110A stream of messages provided via `stdin` where each message represents a user turn. This allows multiple turns of a conversation without re-launching the `claude` binary and allows providing guidance to the model while it is processing a request.97### Auto-approve tools

111 98 

112Each message is a JSON 'User message' object, following the same format as the output message schema. Messages are formatted using the [jsonl](https://jsonlines.org/) format where each line of input is a complete JSON object. Streaming JSON input requires `-p` and `--output-format stream-json`.99Use `--allowedTools` to let Claude use certain tools without prompting. This example runs a test suite and fixes failures, allowing Claude to execute Bash commands and read/edit files without asking for permission:

113 100 

114```bash theme={null}101```bash theme={null}

115echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Explain this code"}]}}' | claude -p --output-format=stream-json --input-format=stream-json --verbose102claude -p "Run the test suite and fix any failures" \

103 --allowedTools "Bash,Read,Edit"

116```104```

117 105 

118## Agent Integration Examples106### Create a commit

119 107 

120### SRE Incident Response Bot108This example reviews staged changes and creates a commit with an appropriate message:

121 109 

122```bash theme={null}110```bash theme={null}

123#!/bin/bash111claude -p "Look at my staged changes and create an appropriate commit" \

112 --allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"

113```

124 114 

125# Automated incident response agent115The `--allowedTools` flag uses [permission rule syntax](/en/settings#permission-rule-syntax). The trailing ` *` enables prefix matching, so `Bash(git diff *)` allows any command starting with `git diff`. The space before `*` is important: without it, `Bash(git diff*)` would also match `git diff-index`.

126investigate_incident() {

127 local incident_description="$1"

128 local severity="${2:-medium}"

129 116 

130 claude -p "Incident: $incident_description (Severity: $severity)" \117<Note>

131 --append-system-prompt "You are an SRE expert. Diagnose the issue, assess impact, and provide immediate action items." \118 User-invoked [skills](/en/skills) like `/commit` and [built-in commands](/en/interactive-mode#built-in-commands) are only available in interactive mode. In `-p` mode, describe the task you want to accomplish instead.

132 --output-format json \119</Note>

133 --allowedTools "Bash,Read,WebSearch,mcp__datadog" \

134 --mcp-config monitoring-tools.json

135}

136 120 

137# Usage121### Customize the system prompt

138investigate_incident "Payment API returning 500 errors" "high"

139```

140 122 

141### Automated Security Review123Use `--append-system-prompt` to add instructions while keeping Claude Code's default behavior. This example pipes a PR diff to Claude and instructs it to review for security vulnerabilities:

142 124 

143```bash theme={null}125```bash theme={null}

144# Security audit agent for pull requests126gh pr diff "$1" | claude -p \

145audit_pr() {127 --append-system-prompt "You are a security engineer. Review for vulnerabilities." \

146 local pr_number="$1"128 --output-format json

129```

147 130 

148 gh pr diff "$pr_number" | claude -p \131See [system prompt flags](/en/cli-reference#system-prompt-flags) for more options including `--system-prompt` to fully replace the default prompt.

149 --append-system-prompt "You are a security engineer. Review this PR for vulnerabilities, insecure patterns, and compliance issues." \

150 --output-format json \

151 --allowedTools "Read,Grep,WebSearch"

152}

153 132 

154# Usage and save to file133### Continue conversations

155audit_pr 123 > security-report.json

156```

157 134 

158### Multi-turn Legal Assistant135Use `--continue` to continue the most recent conversation, or `--resume` with a session ID to continue a specific conversation. This example runs a review, then sends follow-up prompts:

159 136 

160```bash theme={null}137```bash theme={null}

161# Legal document review with session persistence138# First request

162session_id=$(claude -p "Start legal review session" --output-format json | jq -r '.session_id')139claude -p "Review this codebase for performance issues"

163 140 

164# Review contract in multiple steps141# Continue the most recent conversation

165claude -p --resume "$session_id" "Review contract.pdf for liability clauses"142claude -p "Now focus on the database queries" --continue

166claude -p --resume "$session_id" "Check compliance with GDPR requirements"143claude -p "Generate a summary of all issues found" --continue

167claude -p --resume "$session_id" "Generate executive summary of risks"

168```144```

169 145 

170## Best Practices146If you're running multiple conversations, capture the session ID to resume a specific one:

171 

172* **Use JSON output format** for programmatic parsing of responses:

173 

174 ```bash theme={null}

175 # Parse JSON response with jq

176 result=$(claude -p "Generate code" --output-format json)

177 code=$(echo "$result" | jq -r '.result')

178 cost=$(echo "$result" | jq -r '.cost_usd')

179 ```

180 

181* **Handle errors gracefully** - check exit codes and stderr:

182 

183 ```bash theme={null}

184 if ! claude -p "$prompt" 2>error.log; then

185 echo "Error occurred:" >&2

186 cat error.log >&2

187 exit 1

188 fi

189 ```

190 147 

191* **Use session management** for maintaining context in multi-turn conversations148```bash theme={null}

149session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')

150claude -p "Continue that review" --resume "$session_id"

151```

192 152 

193* **Consider timeouts** for long-running operations:153## Next steps

194 154 

195 ```bash theme={null}155<CardGroup cols={2}>

196 timeout 300 claude -p "$complex_prompt" || echo "Timed out after 5 minutes"156 <Card title="Agent SDK quickstart" icon="play" href="https://platform.claude.com/docs/en/agent-sdk/quickstart">

197 ```157 Build your first agent with Python or TypeScript

158 </Card>

198 159 

199* **Respect rate limits** when making multiple requests by adding delays between calls160 <Card title="CLI reference" icon="terminal" href="/en/cli-reference">

161 Explore all CLI flags and options

162 </Card>

200 163 

201## Related Resources164 <Card title="GitHub Actions" icon="github" href="/en/github-actions">

165 Use the Agent SDK in GitHub workflows

166 </Card>

202 167 

203* [CLI usage and controls](/en/docs/claude-code/cli-reference) - Complete CLI documentation168 <Card title="GitLab CI/CD" icon="gitlab" href="/en/gitlab-ci-cd">

204* [Common workflows](/en/docs/claude-code/common-workflows) - Step-by-step guides for common use cases169 Use the Agent SDK in GitLab pipelines

170 </Card>

171</CardGroup>

hooks.md +1339 −495

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Hooks reference5# Hooks reference

2 6 

3> This page provides reference documentation for implementing hooks in Claude Code.7> Reference for Claude Code hook events, configuration schema, JSON input/output formats, exit codes, async hooks, prompt hooks, and MCP tool hooks.

4 8 

5<Tip>9<Tip>

6 For a quickstart guide with examples, see [Get started with Claude Code hooks](/en/docs/claude-code/hooks-guide).10 For a quickstart guide with examples, see [Automate workflows with hooks](/en/hooks-guide).

7</Tip>11</Tip>

8 12 

9## Configuration13Hooks are user-defined shell commands or LLM prompts that execute automatically at specific points in Claude Code's lifecycle. Use this reference to look up event schemas, configuration options, JSON input/output formats, and advanced features like async hooks and MCP tool hooks. If you're setting up hooks for the first time, start with the [guide](/en/hooks-guide) instead.

14 

15## Hook lifecycle

16 

17Hooks fire at specific points during a Claude Code session. When an event fires and a matcher matches, Claude Code passes JSON context about the event to your hook handler. For command hooks, this arrives on stdin. Your handler can then inspect the input, take action, and optionally return a decision. Some events fire once per session, while others fire repeatedly inside the agentic loop:

10 18 

11Claude Code hooks are configured in your [settings files](/en/docs/claude-code/settings):19<div style={{maxWidth: "500px", margin: "0 auto"}}>

20 <Frame>

21 <img src="https://mintcdn.com/claude-code/rsuu-ovdPNos9Dnn/images/hooks-lifecycle.svg?fit=max&auto=format&n=rsuu-ovdPNos9Dnn&q=85&s=ce5f1225339bbccdfbb52e99205db912" alt="Hook lifecycle diagram showing the sequence of hooks from SessionStart through the agentic loop to SessionEnd, with WorktreeCreate and WorktreeRemove as standalone setup and teardown events" data-og-width="520" width="520" data-og-height="1020" height="1020" data-path="images/hooks-lifecycle.svg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/rsuu-ovdPNos9Dnn/images/hooks-lifecycle.svg?w=280&fit=max&auto=format&n=rsuu-ovdPNos9Dnn&q=85&s=7c7143c65492c1beb6bc66f5d206ba15 280w, https://mintcdn.com/claude-code/rsuu-ovdPNos9Dnn/images/hooks-lifecycle.svg?w=560&fit=max&auto=format&n=rsuu-ovdPNos9Dnn&q=85&s=dafaebf8f789f94edbf6bd66853c69df 560w, https://mintcdn.com/claude-code/rsuu-ovdPNos9Dnn/images/hooks-lifecycle.svg?w=840&fit=max&auto=format&n=rsuu-ovdPNos9Dnn&q=85&s=2caa51d2d95596f1f80b92e3f5f534fa 840w, https://mintcdn.com/claude-code/rsuu-ovdPNos9Dnn/images/hooks-lifecycle.svg?w=1100&fit=max&auto=format&n=rsuu-ovdPNos9Dnn&q=85&s=614def559f34f9b0c1dec93739d96b64 1100w, https://mintcdn.com/claude-code/rsuu-ovdPNos9Dnn/images/hooks-lifecycle.svg?w=1650&fit=max&auto=format&n=rsuu-ovdPNos9Dnn&q=85&s=ca45b85fdd8b2da81c69d12c453230cb 1650w, https://mintcdn.com/claude-code/rsuu-ovdPNos9Dnn/images/hooks-lifecycle.svg?w=2500&fit=max&auto=format&n=rsuu-ovdPNos9Dnn&q=85&s=7fd92d6b9713493f59962c9f295c9d2f 2500w" />

22 </Frame>

23</div>

12 24 

13* `~/.claude/settings.json` - User settings25The table below summarizes when each event fires. The [Hook events](#hook-events) section documents the full input schema and decision control options for each one.

14* `.claude/settings.json` - Project settings

15* `.claude/settings.local.json` - Local project settings (not committed)

16* Enterprise managed policy settings

17 26 

18### Structure27| Event | When it fires |

28| :------------------- | :---------------------------------------------------------------------------------------------------------- |

29| `SessionStart` | When a session begins or resumes |

30| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |

31| `PreToolUse` | Before a tool call executes. Can block it |

32| `PermissionRequest` | When a permission dialog appears |

33| `PostToolUse` | After a tool call succeeds |

34| `PostToolUseFailure` | After a tool call fails |

35| `Notification` | When Claude Code sends a notification |

36| `SubagentStart` | When a subagent is spawned |

37| `SubagentStop` | When a subagent finishes |

38| `Stop` | When Claude finishes responding |

39| `TeammateIdle` | When an [agent team](/en/agent-teams) teammate is about to go idle |

40| `TaskCompleted` | When a task is being marked as completed |

41| `ConfigChange` | When a configuration file changes during a session |

42| `WorktreeCreate` | When a worktree is being created via `--worktree` or `isolation: "worktree"`. Replaces default git behavior |

43| `WorktreeRemove` | When a worktree is being removed, either at session exit or when a subagent finishes |

44| `PreCompact` | Before context compaction |

45| `SessionEnd` | When a session terminates |

19 46 

20Hooks are organized by matchers, where each matcher can have multiple hooks:47### How a hook resolves

48 

49To see how these pieces fit together, consider this `PreToolUse` hook that blocks destructive shell commands. The hook runs `block-rm.sh` before every Bash tool call:

21 50 

22```json theme={null}51```json theme={null}

23{52{

24 "hooks": {53 "hooks": {

25 "EventName": [54 "PreToolUse": [

26 {55 {

27 "matcher": "ToolPattern",56 "matcher": "Bash",

28 "hooks": [57 "hooks": [

29 {58 {

30 "type": "command",59 "type": "command",

31 "command": "your-command-here"60 "command": ".claude/hooks/block-rm.sh"

32 }61 }

33 ]62 ]

34 }63 }


37}66}

38```67```

39 68 

40* **matcher**: Pattern to match tool names, case-sensitive (only applicable for69The script reads the JSON input from stdin, extracts the command, and returns a `permissionDecision` of `"deny"` if it contains `rm -rf`:

41 `PreToolUse` and `PostToolUse`)70 

42 * Simple strings match exactly: `Write` matches only the Write tool71```bash theme={null}

43 * Supports regex: `Edit|Write` or `Notebook.*`72#!/bin/bash

44 * Use `*` to match all tools. You can also use empty string (`""`) or leave73# .claude/hooks/block-rm.sh

45 `matcher` blank.74COMMAND=$(jq -r '.tool_input.command')

46* **hooks**: Array of commands to execute when the pattern matches75 

47 * `type`: Currently only `"command"` is supported76if echo "$COMMAND" | grep -q 'rm -rf'; then

48 * `command`: The bash command to execute (can use `$CLAUDE_PROJECT_DIR`77 jq -n '{

49 environment variable)78 hookSpecificOutput: {

50 * `timeout`: (Optional) How long a command should run, in seconds, before79 hookEventName: "PreToolUse",

51 canceling that specific command.80 permissionDecision: "deny",

81 permissionDecisionReason: "Destructive command blocked by hook"

82 }

83 }'

84else

85 exit 0 # allow the command

86fi

87```

88 

89Now suppose Claude Code decides to run `Bash "rm -rf /tmp/build"`. Here's what happens:

90 

91<Frame>

92 <img src="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/hook-resolution.svg?fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=5bb890134390ecd0581477cf41ef730b" alt="Hook resolution flow: PreToolUse event fires, matcher checks for Bash match, hook handler runs, result returns to Claude Code" data-og-width="780" width="780" data-og-height="290" height="290" data-path="images/hook-resolution.svg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/hook-resolution.svg?w=280&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=5dcaecd24c260b8a90365d74e2c1fcda 280w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/hook-resolution.svg?w=560&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=c03d91c279f01d92e58ddd70fdbe66f2 560w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/hook-resolution.svg?w=840&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=1be57a4819cbb949a5ea9d08a05c9ecd 840w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/hook-resolution.svg?w=1100&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=0e9dd1807dc7a5c56011d0889b0d5208 1100w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/hook-resolution.svg?w=1650&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=69496ac02e70fabfece087ba31a1dcfc 1650w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/hook-resolution.svg?w=2500&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=a012346cb46a33b86580348802055267 2500w" />

93</Frame>

94 

95<Steps>

96 <Step title="Event fires">

97 The `PreToolUse` event fires. Claude Code sends the tool input as JSON on stdin to the hook:

98 

99 ```json theme={null}

100 { "tool_name": "Bash", "tool_input": { "command": "rm -rf /tmp/build" }, ... }

101 ```

102 </Step>

103 

104 <Step title="Matcher checks">

105 The matcher `"Bash"` matches the tool name, so `block-rm.sh` runs. If you omit the matcher or use `"*"`, the hook runs on every occurrence of the event. Hooks only skip when a matcher is defined and doesn't match.

106 </Step>

107 

108 <Step title="Hook handler runs">

109 The script extracts `"rm -rf /tmp/build"` from the input and finds `rm -rf`, so it prints a decision to stdout:

110 

111 ```json theme={null}

112 {

113 "hookSpecificOutput": {

114 "hookEventName": "PreToolUse",

115 "permissionDecision": "deny",

116 "permissionDecisionReason": "Destructive command blocked by hook"

117 }

118 }

119 ```

120 

121 If the command had been safe (like `npm test`), the script would hit `exit 0` instead, which tells Claude Code to allow the tool call with no further action.

122 </Step>

52 123 

53For events like `UserPromptSubmit`, `Notification`, `Stop`, and `SubagentStop`124 <Step title="Claude Code acts on the result">

54that don't use matchers, you can omit the matcher field:125 Claude Code reads the JSON decision, blocks the tool call, and shows Claude the reason.

126 </Step>

127</Steps>

128 

129The [Configuration](#configuration) section below documents the full schema, and each [hook event](#hook-events) section documents what input your command receives and what output it can return.

130 

131## Configuration

132 

133Hooks are defined in JSON settings files. The configuration has three levels of nesting:

134 

1351. Choose a [hook event](#hook-events) to respond to, like `PreToolUse` or `Stop`

1362. Add a [matcher group](#matcher-patterns) to filter when it fires, like "only for the Bash tool"

1373. Define one or more [hook handlers](#hook-handler-fields) to run when matched

138 

139See [How a hook resolves](#how-a-hook-resolves) above for a complete walkthrough with an annotated example.

140 

141<Note>

142 This page uses specific terms for each level: **hook event** for the lifecycle point, **matcher group** for the filter, and **hook handler** for the shell command, prompt, or agent that runs. "Hook" on its own refers to the general feature.

143</Note>

144 

145### Hook locations

146 

147Where you define a hook determines its scope:

148 

149| Location | Scope | Shareable |

150| :--------------------------------------------------------- | :---------------------------- | :--------------------------------- |

151| `~/.claude/settings.json` | All your projects | No, local to your machine |

152| `.claude/settings.json` | Single project | Yes, can be committed to the repo |

153| `.claude/settings.local.json` | Single project | No, gitignored |

154| Managed policy settings | Organization-wide | Yes, admin-controlled |

155| [Plugin](/en/plugins) `hooks/hooks.json` | When plugin is enabled | Yes, bundled with the plugin |

156| [Skill](/en/skills) or [agent](/en/sub-agents) frontmatter | While the component is active | Yes, defined in the component file |

157 

158For details on settings file resolution, see [settings](/en/settings). Enterprise administrators can use `allowManagedHooksOnly` to block user, project, and plugin hooks. See [Hook configuration](/en/settings#hook-configuration).

159 

160### Matcher patterns

161 

162The `matcher` field is a regex string that filters when hooks fire. Use `"*"`, `""`, or omit `matcher` entirely to match all occurrences. Each event type matches on a different field:

163 

164| Event | What the matcher filters | Example matcher values |

165| :---------------------------------------------------------------------------------------------- | :------------------------ | :--------------------------------------------------------------------------------- |

166| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest` | tool name | `Bash`, `Edit\|Write`, `mcp__.*` |

167| `SessionStart` | how the session started | `startup`, `resume`, `clear`, `compact` |

168| `SessionEnd` | why the session ended | `clear`, `logout`, `prompt_input_exit`, `bypass_permissions_disabled`, `other` |

169| `Notification` | notification type | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog` |

170| `SubagentStart` | agent type | `Bash`, `Explore`, `Plan`, or custom agent names |

171| `PreCompact` | what triggered compaction | `manual`, `auto` |

172| `SubagentStop` | agent type | same values as `SubagentStart` |

173| `ConfigChange` | configuration source | `user_settings`, `project_settings`, `local_settings`, `policy_settings`, `skills` |

174| `UserPromptSubmit`, `Stop`, `TeammateIdle`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove` | no matcher support | always fires on every occurrence |

175 

176The matcher is a regex, so `Edit|Write` matches either tool and `Notebook.*` matches any tool starting with Notebook. The matcher runs against a field from the [JSON input](#hook-input-and-output) that Claude Code sends to your hook on stdin. For tool events, that field is `tool_name`. Each [hook event](#hook-events) section lists the full set of matcher values and the input schema for that event.

177 

178This example runs a linting script only when Claude writes or edits a file:

55 179 

56```json theme={null}180```json theme={null}

57{181{

58 "hooks": {182 "hooks": {

59 "UserPromptSubmit": [183 "PostToolUse": [

60 {184 {

185 "matcher": "Edit|Write",

61 "hooks": [186 "hooks": [

62 {187 {

63 "type": "command",188 "type": "command",

64 "command": "/path/to/prompt-validator.py"189 "command": "/path/to/lint-check.sh"

65 }190 }

66 ]191 ]

67 }192 }


70}195}

71```196```

72 197 

73### Project-Specific Hook Scripts198`UserPromptSubmit`, `Stop`, `TeammateIdle`, `TaskCompleted`, `WorktreeCreate`, and `WorktreeRemove` don't support matchers and always fire on every occurrence. If you add a `matcher` field to these events, it is silently ignored.

199 

200#### Match MCP tools

201 

202[MCP](/en/mcp) server tools appear as regular tools in tool events (`PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`), so you can match them the same way you match any other tool name.

203 

204MCP tools follow the naming pattern `mcp__<server>__<tool>`, for example:

205 

206* `mcp__memory__create_entities`: Memory server's create entities tool

207* `mcp__filesystem__read_file`: Filesystem server's read file tool

208* `mcp__github__search_repositories`: GitHub server's search tool

209 

210Use regex patterns to target specific MCP tools or groups of tools:

211 

212* `mcp__memory__.*` matches all tools from the `memory` server

213* `mcp__.*__write.*` matches any tool containing "write" from any server

74 214 

75You can use the environment variable `CLAUDE_PROJECT_DIR` (only available when215This example logs all memory server operations and validates write operations from any MCP server:

76Claude Code spawns the hook command) to reference scripts stored in your project,

77ensuring they work regardless of Claude's current directory:

78 216 

79```json theme={null}217```json theme={null}

80{218{

81 "hooks": {219 "hooks": {

82 "PostToolUse": [220 "PreToolUse": [

83 {221 {

84 "matcher": "Write|Edit",222 "matcher": "mcp__memory__.*",

85 "hooks": [223 "hooks": [

86 {224 {

87 "type": "command",225 "type": "command",

88 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-style.sh"226 "command": "echo 'Memory operation initiated' >> ~/mcp-operations.log"

227 }

228 ]

229 },

230 {

231 "matcher": "mcp__.*__write.*",

232 "hooks": [

233 {

234 "type": "command",

235 "command": "/home/user/scripts/validate-mcp-write.py"

89 }236 }

90 ]237 ]

91 }238 }


94}241}

95```242```

96 243 

97### Plugin hooks244### Hook handler fields

98 245 

99[Plugins](/en/docs/claude-code/plugins) can provide hooks that integrate seamlessly with your user and project hooks. Plugin hooks are automatically merged with your configuration when plugins are enabled.246Each object in the inner `hooks` array is a hook handler: the shell command, LLM prompt, or agent that runs when the matcher matches. There are three types:

100 247 

101**How plugin hooks work**:248* **[Command hooks](#command-hook-fields)** (`type: "command"`): run a shell command. Your script receives the event's [JSON input](#hook-input-and-output) on stdin and communicates results back through exit codes and stdout.

249* **[Prompt hooks](#prompt-and-agent-hook-fields)** (`type: "prompt"`): send a prompt to a Claude model for single-turn evaluation. The model returns a yes/no decision as JSON. See [Prompt-based hooks](#prompt-based-hooks).

250* **[Agent hooks](#prompt-and-agent-hook-fields)** (`type: "agent"`): spawn a subagent that can use tools like Read, Grep, and Glob to verify conditions before returning a decision. See [Agent-based hooks](#agent-based-hooks).

102 251 

103* Plugin hooks are defined in the plugin's `hooks/hooks.json` file or in a file given by a custom path to the `hooks` field.252#### Common fields

104* When a plugin is enabled, its hooks are merged with user and project hooks

105* Multiple hooks from different sources can respond to the same event

106* Plugin hooks use the `${CLAUDE_PLUGIN_ROOT}` environment variable to reference plugin files

107 253 

108**Example plugin hook configuration**:254These fields apply to all hook types:

109 255 

110```json theme={null}256| Field | Required | Description |

111{257| :-------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------- |

258| `type` | yes | `"command"`, `"prompt"`, or `"agent"` |

259| `timeout` | no | Seconds before canceling. Defaults: 600 for command, 30 for prompt, 60 for agent |

260| `statusMessage` | no | Custom spinner message displayed while the hook runs |

261| `once` | no | If `true`, runs only once per session then is removed. Skills only, not agents. See [Hooks in skills and agents](#hooks-in-skills-and-agents) |

262 

263#### Command hook fields

264 

265In addition to the [common fields](#common-fields), command hooks accept these fields:

266 

267| Field | Required | Description |

268| :-------- | :------- | :------------------------------------------------------------------------------------------------------------------ |

269| `command` | yes | Shell command to execute |

270| `async` | no | If `true`, runs in the background without blocking. See [Run hooks in the background](#run-hooks-in-the-background) |

271 

272#### Prompt and agent hook fields

273 

274In addition to the [common fields](#common-fields), prompt and agent hooks accept these fields:

275 

276| Field | Required | Description |

277| :------- | :------- | :------------------------------------------------------------------------------------------ |

278| `prompt` | yes | Prompt text to send to the model. Use `$ARGUMENTS` as a placeholder for the hook input JSON |

279| `model` | no | Model to use for evaluation. Defaults to a fast model |

280 

281All matching hooks run in parallel, and identical handlers are deduplicated automatically. Handlers run in the current directory with Claude Code's environment. The `$CLAUDE_CODE_REMOTE` environment variable is set to `"true"` in remote web environments and not set in the local CLI.

282 

283### Reference scripts by path

284 

285Use environment variables to reference hook scripts relative to the project or plugin root, regardless of the working directory when the hook runs:

286 

287* `$CLAUDE_PROJECT_DIR`: the project root. Wrap in quotes to handle paths with spaces.

288* `${CLAUDE_PLUGIN_ROOT}`: the plugin's root directory, for scripts bundled with a [plugin](/en/plugins).

289 

290<Tabs>

291 <Tab title="Project scripts">

292 This example uses `$CLAUDE_PROJECT_DIR` to run a style checker from the project's `.claude/hooks/` directory after any `Write` or `Edit` tool call:

293 

294 ```json theme={null}

295 {

296 "hooks": {

297 "PostToolUse": [

298 {

299 "matcher": "Write|Edit",

300 "hooks": [

301 {

302 "type": "command",

303 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-style.sh"

304 }

305 ]

306 }

307 ]

308 }

309 }

310 ```

311 </Tab>

312 

313 <Tab title="Plugin scripts">

314 Define plugin hooks in `hooks/hooks.json` with an optional top-level `description` field. When a plugin is enabled, its hooks merge with your user and project hooks.

315 

316 This example runs a formatting script bundled with the plugin:

317 

318 ```json theme={null}

319 {

112 "description": "Automatic code formatting",320 "description": "Automatic code formatting",

113 "hooks": {321 "hooks": {

114 "PostToolUse": [322 "PostToolUse": [


124 }332 }

125 ]333 ]

126 }334 }

335 }

336 ```

337 

338 See the [plugin components reference](/en/plugins-reference#hooks) for details on creating plugin hooks.

339 </Tab>

340</Tabs>

341 

342### Hooks in skills and agents

343 

344In addition to settings files and plugins, hooks can be defined directly in [skills](/en/skills) and [subagents](/en/sub-agents) using frontmatter. These hooks are scoped to the component's lifecycle and only run when that component is active.

345 

346All hook events are supported. For subagents, `Stop` hooks are automatically converted to `SubagentStop` since that is the event that fires when a subagent completes.

347 

348Hooks use the same configuration format as settings-based hooks but are scoped to the component's lifetime and cleaned up when it finishes.

349 

350This skill defines a `PreToolUse` hook that runs a security validation script before each `Bash` command:

351 

352```yaml theme={null}

353---

354name: secure-operations

355description: Perform operations with security checks

356hooks:

357 PreToolUse:

358 - matcher: "Bash"

359 hooks:

360 - type: command

361 command: "./scripts/security-check.sh"

362---

363```

364 

365Agents use the same format in their YAML frontmatter.

366 

367### The `/hooks` menu

368 

369Type `/hooks` in Claude Code to open the interactive hooks manager, where you can view, add, and delete hooks without editing settings files directly. For a step-by-step walkthrough, see [Set up your first hook](/en/hooks-guide#set-up-your-first-hook) in the guide.

370 

371Each hook in the menu is labeled with a bracket prefix indicating its source:

372 

373* `[User]`: from `~/.claude/settings.json`

374* `[Project]`: from `.claude/settings.json`

375* `[Local]`: from `.claude/settings.local.json`

376* `[Plugin]`: from a plugin's `hooks/hooks.json`, read-only

377 

378### Disable or remove hooks

379 

380To remove a hook, delete its entry from the settings JSON file, or use the `/hooks` menu and select the hook to delete it.

381 

382To temporarily disable all hooks without removing them, set `"disableAllHooks": true` in your settings file or use the toggle in the `/hooks` menu. There is no way to disable an individual hook while keeping it in the configuration.

383 

384The `disableAllHooks` setting respects the managed settings hierarchy. If an administrator has configured hooks through managed policy settings, `disableAllHooks` set in user, project, or local settings cannot disable those managed hooks. Only `disableAllHooks` set at the managed settings level can disable managed hooks.

385 

386Direct edits to hooks in settings files don't take effect immediately. Claude Code captures a snapshot of hooks at startup and uses it throughout the session. This prevents malicious or accidental hook modifications from taking effect mid-session without your review. If hooks are modified externally, Claude Code warns you and requires review in the `/hooks` menu before changes apply.

387 

388## Hook input and output

389 

390Hooks receive JSON data via stdin and communicate results through exit codes, stdout, and stderr. This section covers fields and behavior common to all events. Each event's section under [Hook events](#hook-events) includes its specific input schema and decision control options.

391 

392### Common input fields

393 

394All hook events receive these fields via stdin as JSON, in addition to event-specific fields documented in each [hook event](#hook-events) section:

395 

396| Field | Description |

397| :---------------- | :----------------------------------------------------------------------------------------------------------------------------------------- |

398| `session_id` | Current session identifier |

399| `transcript_path` | Path to conversation JSON |

400| `cwd` | Current working directory when the hook is invoked |

401| `permission_mode` | Current [permission mode](/en/permissions#permission-modes): `"default"`, `"plan"`, `"acceptEdits"`, `"dontAsk"`, or `"bypassPermissions"` |

402| `hook_event_name` | Name of the event that fired |

403 

404For example, a `PreToolUse` hook for a Bash command receives this on stdin:

405 

406```json theme={null}

407{

408 "session_id": "abc123",

409 "transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",

410 "cwd": "/home/user/my-project",

411 "permission_mode": "default",

412 "hook_event_name": "PreToolUse",

413 "tool_name": "Bash",

414 "tool_input": {

415 "command": "npm test"

416 }

127}417}

128```418```

129 419 

130<Note>420The `tool_name` and `tool_input` fields are event-specific. Each [hook event](#hook-events) section documents the additional fields for that event.

131 Plugin hooks use the same format as regular hooks with an optional `description` field to explain the hook's purpose.421 

132</Note>422### Exit code output

423 

424The exit code from your hook command tells Claude Code whether the action should proceed, be blocked, or be ignored.

425 

426**Exit 0** means success. Claude Code parses stdout for [JSON output fields](#json-output). JSON output is only processed on exit 0. For most events, stdout is only shown in verbose mode (`Ctrl+O`). The exceptions are `UserPromptSubmit` and `SessionStart`, where stdout is added as context that Claude can see and act on.

427 

428**Exit 2** means a blocking error. Claude Code ignores stdout and any JSON in it. Instead, stderr text is fed back to Claude as an error message. The effect depends on the event: `PreToolUse` blocks the tool call, `UserPromptSubmit` rejects the prompt, and so on. See [exit code 2 behavior](#exit-code-2-behavior-per-event) for the full list.

429 

430**Any other exit code** is a non-blocking error. stderr is shown in verbose mode (`Ctrl+O`) and execution continues.

431 

432For example, a hook command script that blocks dangerous Bash commands:

433 

434```bash theme={null}

435#!/bin/bash

436# Reads JSON input from stdin, checks the command

437command=$(jq -r '.tool_input.command' < /dev/stdin)

438 

439if [[ "$command" == rm* ]]; then

440 echo "Blocked: rm commands are not allowed" >&2

441 exit 2 # Blocking error: tool call is prevented

442fi

443 

444exit 0 # Success: tool call proceeds

445```

446 

447#### Exit code 2 behavior per event

448 

449Exit code 2 is the way a hook signals "stop, don't do this." The effect depends on the event, because some events represent actions that can be blocked (like a tool call that hasn't happened yet) and others represent things that already happened or can't be prevented.

450 

451| Hook event | Can block? | What happens on exit 2 |

452| :------------------- | :--------- | :---------------------------------------------------------------------------- |

453| `PreToolUse` | Yes | Blocks the tool call |

454| `PermissionRequest` | Yes | Denies the permission |

455| `UserPromptSubmit` | Yes | Blocks prompt processing and erases the prompt |

456| `Stop` | Yes | Prevents Claude from stopping, continues the conversation |

457| `SubagentStop` | Yes | Prevents the subagent from stopping |

458| `TeammateIdle` | Yes | Prevents the teammate from going idle (teammate continues working) |

459| `TaskCompleted` | Yes | Prevents the task from being marked as completed |

460| `ConfigChange` | Yes | Blocks the configuration change from taking effect (except `policy_settings`) |

461| `PostToolUse` | No | Shows stderr to Claude (tool already ran) |

462| `PostToolUseFailure` | No | Shows stderr to Claude (tool already failed) |

463| `Notification` | No | Shows stderr to user only |

464| `SubagentStart` | No | Shows stderr to user only |

465| `SessionStart` | No | Shows stderr to user only |

466| `SessionEnd` | No | Shows stderr to user only |

467| `PreCompact` | No | Shows stderr to user only |

468| `WorktreeCreate` | Yes | Any non-zero exit code causes worktree creation to fail |

469| `WorktreeRemove` | No | Failures are logged in debug mode only |

470 

471### JSON output

472 

473Exit codes let you allow or block, but JSON output gives you finer-grained control. Instead of exiting with code 2 to block, exit 0 and print a JSON object to stdout. Claude Code reads specific fields from that JSON to control behavior, including [decision control](#decision-control) for blocking, allowing, or escalating to the user.

133 474 

134<Note>475<Note>

135 Plugin hooks run alongside your custom hooks. If multiple hooks match an event, they all execute in parallel.476 You must choose one approach per hook, not both: either use exit codes alone for signaling, or exit 0 and print JSON for structured control. Claude Code only processes JSON on exit 0. If you exit 2, any JSON is ignored.

136</Note>477</Note>

137 478 

138**Environment variables for plugins**:479Your hook's stdout must contain only the JSON object. If your shell profile prints text on startup, it can interfere with JSON parsing. See [JSON validation failed](/en/hooks-guide#json-validation-failed) in the troubleshooting guide.

139 480 

140* `${CLAUDE_PLUGIN_ROOT}`: Absolute path to the plugin directory481The JSON object supports three kinds of fields:

141* `${CLAUDE_PROJECT_DIR}`: Project root directory (same as for project hooks)

142* All standard environment variables are available

143 482 

144See the [plugin components reference](/en/docs/claude-code/plugins-reference#hooks) for details on creating plugin hooks.483* **Universal fields** like `continue` work across all events. These are listed in the table below.

484* **Top-level `decision` and `reason`** are used by some events to block or provide feedback.

485* **`hookSpecificOutput`** is a nested object for events that need richer control. It requires a `hookEventName` field set to the event name.

145 486 

146## Hook Events487| Field | Default | Description |

488| :--------------- | :------ | :------------------------------------------------------------------------------------------------------------------------- |

489| `continue` | `true` | If `false`, Claude stops processing entirely after the hook runs. Takes precedence over any event-specific decision fields |

490| `stopReason` | none | Message shown to the user when `continue` is `false`. Not shown to Claude |

491| `suppressOutput` | `false` | If `true`, hides stdout from verbose mode output |

492| `systemMessage` | none | Warning message shown to the user |

147 493 

148### PreToolUse494To stop Claude entirely regardless of event type:

149 495 

150Runs after Claude creates tool parameters and before processing the tool call.496```json theme={null}

497{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }

498```

151 499 

152**Common matchers:**500#### Decision control

153 501 

154* `Task` - Subagent tasks (see [subagents documentation](/en/docs/claude-code/sub-agents))502Not every event supports blocking or controlling behavior through JSON. The events that do each use a different set of fields to express that decision. Use this table as a quick reference before writing a hook:

155* `Bash` - Shell commands

156* `Glob` - File pattern matching

157* `Grep` - Content search

158* `Read` - File reading

159* `Edit` - File editing

160* `Write` - File writing

161* `WebFetch`, `WebSearch` - Web operations

162 503 

163### PostToolUse504| Events | Decision pattern | Key fields |

505| :---------------------------------------------------------------------------------- | :------------------- | :-------------------------------------------------------------------------- |

506| UserPromptSubmit, PostToolUse, PostToolUseFailure, Stop, SubagentStop, ConfigChange | Top-level `decision` | `decision: "block"`, `reason` |

507| TeammateIdle, TaskCompleted | Exit code only | Exit code 2 blocks the action, stderr is fed back as feedback |

508| PreToolUse | `hookSpecificOutput` | `permissionDecision` (allow/deny/ask), `permissionDecisionReason` |

509| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |

510| WorktreeCreate | stdout path | Hook prints absolute path to created worktree. Non-zero exit fails creation |

511| WorktreeRemove, Notification, SessionEnd, PreCompact | None | No decision control. Used for side effects like logging or cleanup |

164 512 

165Runs immediately after a tool completes successfully.513Here are examples of each pattern in action:

166 514 

167Recognizes the same matcher values as PreToolUse.515<Tabs>

516 <Tab title="Top-level decision">

517 Used by `UserPromptSubmit`, `PostToolUse`, `PostToolUseFailure`, `Stop`, `SubagentStop`, and `ConfigChange`. The only value is `"block"`. To allow the action to proceed, omit `decision` from your JSON, or exit 0 without any JSON at all:

168 518 

169### Notification519 ```json theme={null}

520 {

521 "decision": "block",

522 "reason": "Test suite must pass before proceeding"

523 }

524 ```

525 </Tab>

170 526 

171Runs when Claude Code sends notifications. Notifications are sent when:527 <Tab title="PreToolUse">

528 Uses `hookSpecificOutput` for richer control: allow, deny, or escalate to the user. You can also modify tool input before it runs or inject additional context for Claude. See [PreToolUse decision control](#pretooluse-decision-control) for the full set of options.

172 529 

1731. Claude needs your permission to use a tool. Example: "Claude needs your530 ```json theme={null}

174 permission to use Bash"531 {

1752. The prompt input has been idle for at least 60 seconds. "Claude is waiting532 "hookSpecificOutput": {

176 for your input"533 "hookEventName": "PreToolUse",

534 "permissionDecision": "deny",

535 "permissionDecisionReason": "Database writes are not allowed"

536 }

537 }

538 ```

539 </Tab>

177 540 

178### UserPromptSubmit541 <Tab title="PermissionRequest">

542 Uses `hookSpecificOutput` to allow or deny a permission request on behalf of the user. When allowing, you can also modify the tool's input or apply permission rules so the user isn't prompted again. See [PermissionRequest decision control](#permissionrequest-decision-control) for the full set of options.

179 543 

180Runs when the user submits a prompt, before Claude processes it. This allows you544 ```json theme={null}

181to add additional context based on the prompt/conversation, validate prompts, or545 {

182block certain types of prompts.546 "hookSpecificOutput": {

547 "hookEventName": "PermissionRequest",

548 "decision": {

549 "behavior": "allow",

550 "updatedInput": {

551 "command": "npm run lint"

552 }

553 }

554 }

555 }

556 ```

557 </Tab>

558</Tabs>

183 559 

184### Stop560For extended examples including Bash command validation, prompt filtering, and auto-approval scripts, see [What you can automate](/en/hooks-guide#what-you-can-automate) in the guide and the [Bash command validator reference implementation](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).

185 561 

186Runs when the main Claude Code agent has finished responding. Does not run if562## Hook events

187the stoppage occurred due to a user interrupt.

188 563 

189### SubagentStop564Each event corresponds to a point in Claude Code's lifecycle where hooks can run. The sections below are ordered to match the lifecycle: from session setup through the agentic loop to session end. Each section describes when the event fires, what matchers it supports, the JSON input it receives, and how to control behavior through output.

190 565 

191Runs when a Claude Code subagent (Task tool call) has finished responding.566### SessionStart

192 567 

193### PreCompact568Runs when Claude Code starts a new session or resumes an existing session. Useful for loading development context like existing issues or recent changes to your codebase, or setting up environment variables. For static context that does not require a script, use [CLAUDE.md](/en/memory) instead.

194 569 

195Runs before Claude Code is about to run a compact operation.570SessionStart runs on every session, so keep these hooks fast.

196 571 

197**Matchers:**572The matcher value corresponds to how the session was initiated:

198 573 

199* `manual` - Invoked from `/compact`574| Matcher | When it fires |

200* `auto` - Invoked from auto-compact (due to full context window)575| :-------- | :------------------------------------- |

576| `startup` | New session |

577| `resume` | `--resume`, `--continue`, or `/resume` |

578| `clear` | `/clear` |

579| `compact` | Auto or manual compaction |

201 580 

202### SessionStart581#### SessionStart input

582 

583In addition to the [common input fields](#common-input-fields), SessionStart hooks receive `source`, `model`, and optionally `agent_type`. The `source` field indicates how the session started: `"startup"` for new sessions, `"resume"` for resumed sessions, `"clear"` after `/clear`, or `"compact"` after compaction. The `model` field contains the model identifier. If you start Claude Code with `claude --agent <name>`, an `agent_type` field contains the agent name.

584 

585```json theme={null}

586{

587 "session_id": "abc123",

588 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

589 "cwd": "/Users/...",

590 "permission_mode": "default",

591 "hook_event_name": "SessionStart",

592 "source": "startup",

593 "model": "claude-sonnet-4-6"

594}

595```

203 596 

204Runs when Claude Code starts a new session or resumes an existing session (which597#### SessionStart decision control

205currently does start a new session under the hood). Useful for loading in

206development context like existing issues or recent changes to your codebase, installing dependencies, or setting up environment variables.

207 598 

208**Matchers:**599Any text your hook script prints to stdout is added as context for Claude. In addition to the [JSON output fields](#json-output) available to all hooks, you can return these event-specific fields:

209 600 

210* `startup` - Invoked from startup601| Field | Description |

211* `resume` - Invoked from `--resume`, `--continue`, or `/resume`602| :------------------ | :------------------------------------------------------------------------ |

212* `clear` - Invoked from `/clear`603| `additionalContext` | String added to Claude's context. Multiple hooks' values are concatenated |

213* `compact` - Invoked from auto or manual compact.

214 604 

215#### Persisting environment variables605```json theme={null}

606{

607 "hookSpecificOutput": {

608 "hookEventName": "SessionStart",

609 "additionalContext": "My additional context here"

610 }

611}

612```

216 613 

217SessionStart hooks have access to the `CLAUDE_ENV_FILE` environment variable, which provides a file path where you can persist environment variables for subsequent bash commands.614#### Persist environment variables

218 615 

219**Example: Setting individual environment variables**616SessionStart hooks have access to the `CLAUDE_ENV_FILE` environment variable, which provides a file path where you can persist environment variables for subsequent Bash commands.

617 

618To set individual environment variables, write `export` statements to `CLAUDE_ENV_FILE`. Use append (`>>`) to preserve variables set by other hooks:

220 619 

221```bash theme={null}620```bash theme={null}

222#!/bin/bash621#!/bin/bash

223 622 

224if [ -n "$CLAUDE_ENV_FILE" ]; then623if [ -n "$CLAUDE_ENV_FILE" ]; then

225 echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"624 echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"

226 echo 'export API_KEY=your-api-key' >> "$CLAUDE_ENV_FILE"625 echo 'export DEBUG_LOG=true' >> "$CLAUDE_ENV_FILE"

227 echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"626 echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"

228fi627fi

229 628 

230exit 0629exit 0

231```630```

232 631 

233**Example: Persisting all environment changes from the hook**632To capture all environment changes from setup commands, compare the exported variables before and after:

234 

235When your setup modifies the environment (e.g., `nvm use`), capture and persist all changes by diffing the environment:

236 633 

237```bash theme={null}634```bash theme={null}

238#!/bin/bash635#!/bin/bash


251exit 0648exit 0

252```649```

253 650 

254Any variables written to this file will be available in all subsequent bash commands that Claude Code executes during the session.651Any variables written to this file will be available in all subsequent Bash commands that Claude Code executes during the session.

255 652 

256<Note>653<Note>

257 `CLAUDE_ENV_FILE` is only available for SessionStart hooks. Other hook types do not have access to this variable.654 `CLAUDE_ENV_FILE` is available for SessionStart hooks. Other hook types do not have access to this variable.

258</Note>655</Note>

259 656 

260### SessionEnd657### UserPromptSubmit

261 658 

262Runs when a Claude Code session ends. Useful for cleanup tasks, logging session659Runs when the user submits a prompt, before Claude processes it. This allows you

263statistics, or saving session state.660to add additional context based on the prompt/conversation, validate prompts, or

661block certain types of prompts.

264 662 

265The `reason` field in the hook input will be one of:663#### UserPromptSubmit input

266 664 

267* `clear` - Session cleared with /clear command665In addition to the [common input fields](#common-input-fields), UserPromptSubmit hooks receive the `prompt` field containing the text the user submitted.

268* `logout` - User logged out

269* `prompt_input_exit` - User exited while prompt input was visible

270* `other` - Other exit reasons

271 666 

272## Hook Input667```json theme={null}

668{

669 "session_id": "abc123",

670 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

671 "cwd": "/Users/...",

672 "permission_mode": "default",

673 "hook_event_name": "UserPromptSubmit",

674 "prompt": "Write a function to calculate the factorial of a number"

675}

676```

677 

678#### UserPromptSubmit decision control

273 679 

274Hooks receive JSON data via stdin containing session information and680`UserPromptSubmit` hooks can control whether a user prompt is processed and add context. All [JSON output fields](#json-output) are available.

275event-specific data:

276 681 

277```typescript theme={null}682There are two ways to add context to the conversation on exit code 0:

683 

684* **Plain text stdout**: any non-JSON text written to stdout is added as context

685* **JSON with `additionalContext`**: use the JSON format below for more control. The `additionalContext` field is added as context

686 

687Plain stdout is shown as hook output in the transcript. The `additionalContext` field is added more discretely.

688 

689To block a prompt, return a JSON object with `decision` set to `"block"`:

690 

691| Field | Description |

692| :------------------ | :----------------------------------------------------------------------------------------------------------------- |

693| `decision` | `"block"` prevents the prompt from being processed and erases it from context. Omit to allow the prompt to proceed |

694| `reason` | Shown to the user when `decision` is `"block"`. Not added to context |

695| `additionalContext` | String added to Claude's context |

696 

697```json theme={null}

278{698{

279 // Common fields699 "decision": "block",

280 session_id: string700 "reason": "Explanation for decision",

281 transcript_path: string // Path to conversation JSON701 "hookSpecificOutput": {

282 cwd: string // The current working directory when the hook is invoked702 "hookEventName": "UserPromptSubmit",

283 permission_mode: string // Current permission mode: "default", "plan", "acceptEdits", or "bypassPermissions"703 "additionalContext": "My additional context here"

704 }

705}

706```

707 

708<Note>

709 The JSON format isn't required for simple use cases. To add context, you can print plain text to stdout with exit code 0. Use JSON when you need to

710 block prompts or want more structured control.

711</Note>

712 

713### PreToolUse

714 

715Runs after Claude creates tool parameters and before processing the tool call. Matches on tool name: `Bash`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Task`, `WebFetch`, `WebSearch`, and any [MCP tool names](#match-mcp-tools).

716 

717Use [PreToolUse decision control](#pretooluse-decision-control) to allow, deny, or ask for permission to use the tool.

718 

719#### PreToolUse input

720 

721In addition to the [common input fields](#common-input-fields), PreToolUse hooks receive `tool_name`, `tool_input`, and `tool_use_id`. The `tool_input` fields depend on the tool:

722 

723##### Bash

724 

725Executes shell commands.

726 

727| Field | Type | Example | Description |

728| :------------------ | :------ | :----------------- | :-------------------------------------------- |

729| `command` | string | `"npm test"` | The shell command to execute |

730| `description` | string | `"Run test suite"` | Optional description of what the command does |

731| `timeout` | number | `120000` | Optional timeout in milliseconds |

732| `run_in_background` | boolean | `false` | Whether to run the command in background |

733 

734##### Write

735 

736Creates or overwrites a file.

737 

738| Field | Type | Example | Description |

739| :---------- | :----- | :-------------------- | :--------------------------------- |

740| `file_path` | string | `"/path/to/file.txt"` | Absolute path to the file to write |

741| `content` | string | `"file content"` | Content to write to the file |

742 

743##### Edit

744 

745Replaces a string in an existing file.

284 746 

285 // Event-specific fields747| Field | Type | Example | Description |

286 hook_event_name: string748| :------------ | :------ | :-------------------- | :--------------------------------- |

287 ...749| `file_path` | string | `"/path/to/file.txt"` | Absolute path to the file to edit |

750| `old_string` | string | `"original text"` | Text to find and replace |

751| `new_string` | string | `"replacement text"` | Replacement text |

752| `replace_all` | boolean | `false` | Whether to replace all occurrences |

753 

754##### Read

755 

756Reads file contents.

757 

758| Field | Type | Example | Description |

759| :---------- | :----- | :-------------------- | :----------------------------------------- |

760| `file_path` | string | `"/path/to/file.txt"` | Absolute path to the file to read |

761| `offset` | number | `10` | Optional line number to start reading from |

762| `limit` | number | `50` | Optional number of lines to read |

763 

764##### Glob

765 

766Finds files matching a glob pattern.

767 

768| Field | Type | Example | Description |

769| :-------- | :----- | :--------------- | :--------------------------------------------------------------------- |

770| `pattern` | string | `"**/*.ts"` | Glob pattern to match files against |

771| `path` | string | `"/path/to/dir"` | Optional directory to search in. Defaults to current working directory |

772 

773##### Grep

774 

775Searches file contents with regular expressions.

776 

777| Field | Type | Example | Description |

778| :------------ | :------ | :--------------- | :------------------------------------------------------------------------------------ |

779| `pattern` | string | `"TODO.*fix"` | Regular expression pattern to search for |

780| `path` | string | `"/path/to/dir"` | Optional file or directory to search in |

781| `glob` | string | `"*.ts"` | Optional glob pattern to filter files |

782| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"`, or `"count"`. Defaults to `"files_with_matches"` |

783| `-i` | boolean | `true` | Case insensitive search |

784| `multiline` | boolean | `false` | Enable multiline matching |

785 

786##### WebFetch

787 

788Fetches and processes web content.

789 

790| Field | Type | Example | Description |

791| :------- | :----- | :---------------------------- | :----------------------------------- |

792| `url` | string | `"https://example.com/api"` | URL to fetch content from |

793| `prompt` | string | `"Extract the API endpoints"` | Prompt to run on the fetched content |

794 

795##### WebSearch

796 

797Searches the web.

798 

799| Field | Type | Example | Description |

800| :---------------- | :----- | :----------------------------- | :------------------------------------------------ |

801| `query` | string | `"react hooks best practices"` | Search query |

802| `allowed_domains` | array | `["docs.example.com"]` | Optional: only include results from these domains |

803| `blocked_domains` | array | `["spam.example.com"]` | Optional: exclude results from these domains |

804 

805##### Task

806 

807Spawns a [subagent](/en/sub-agents).

808 

809| Field | Type | Example | Description |

810| :-------------- | :----- | :------------------------- | :------------------------------------------- |

811| `prompt` | string | `"Find all API endpoints"` | The task for the agent to perform |

812| `description` | string | `"Find API endpoints"` | Short description of the task |

813| `subagent_type` | string | `"Explore"` | Type of specialized agent to use |

814| `model` | string | `"sonnet"` | Optional model alias to override the default |

815 

816#### PreToolUse decision control

817 

818`PreToolUse` hooks can control whether a tool call proceeds. Unlike other hooks that use a top-level `decision` field, PreToolUse returns its decision inside a `hookSpecificOutput` object. This gives it richer control: three outcomes (allow, deny, or ask) plus the ability to modify tool input before execution.

819 

820| Field | Description |

821| :------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- |

822| `permissionDecision` | `"allow"` bypasses the permission system, `"deny"` prevents the tool call, `"ask"` prompts the user to confirm |

823| `permissionDecisionReason` | For `"allow"` and `"ask"`, shown to the user but not Claude. For `"deny"`, shown to Claude |

824| `updatedInput` | Modifies the tool's input parameters before execution. Combine with `"allow"` to auto-approve, or `"ask"` to show the modified input to the user |

825| `additionalContext` | String added to Claude's context before the tool executes |

826 

827```json theme={null}

828{

829 "hookSpecificOutput": {

830 "hookEventName": "PreToolUse",

831 "permissionDecision": "allow",

832 "permissionDecisionReason": "My reason here",

833 "updatedInput": {

834 "field_to_modify": "new value"

835 },

836 "additionalContext": "Current environment: production. Proceed with caution."

837 }

288}838}

289```839```

290 840 

291### PreToolUse Input841<Note>

842 PreToolUse previously used top-level `decision` and `reason` fields, but these are deprecated for this event. Use `hookSpecificOutput.permissionDecision` and `hookSpecificOutput.permissionDecisionReason` instead. The deprecated values `"approve"` and `"block"` map to `"allow"` and `"deny"` respectively. Other events like PostToolUse and Stop continue to use top-level `decision` and `reason` as their current format.

843</Note>

844 

845### PermissionRequest

846 

847Runs when the user is shown a permission dialog.

848Use [PermissionRequest decision control](#permissionrequest-decision-control) to allow or deny on behalf of the user.

849 

850Matches on tool name, same values as PreToolUse.

851 

852#### PermissionRequest input

292 853 

293The exact schema for `tool_input` depends on the tool.854PermissionRequest hooks receive `tool_name` and `tool_input` fields like PreToolUse hooks, but without `tool_use_id`. An optional `permission_suggestions` array contains the "always allow" options the user would normally see in the permission dialog. The difference is when the hook fires: PermissionRequest hooks run when a permission dialog is about to be shown to the user, while PreToolUse hooks run before tool execution regardless of permission status.

294 855 

295```json theme={null}856```json theme={null}

296{857{


298 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",859 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

299 "cwd": "/Users/...",860 "cwd": "/Users/...",

300 "permission_mode": "default",861 "permission_mode": "default",

301 "hook_event_name": "PreToolUse",862 "hook_event_name": "PermissionRequest",

302 "tool_name": "Write",863 "tool_name": "Bash",

303 "tool_input": {864 "tool_input": {

304 "file_path": "/path/to/file.txt",865 "command": "rm -rf node_modules",

305 "content": "file content"866 "description": "Remove node_modules directory"

867 },

868 "permission_suggestions": [

869 { "type": "toolAlwaysAllow", "tool": "Bash" }

870 ]

871}

872```

873 

874#### PermissionRequest decision control

875 

876`PermissionRequest` hooks can allow or deny permission requests. In addition to the [JSON output fields](#json-output) available to all hooks, your hook script can return a `decision` object with these event-specific fields:

877 

878| Field | Description |

879| :------------------- | :------------------------------------------------------------------------------------------------------------- |

880| `behavior` | `"allow"` grants the permission, `"deny"` denies it |

881| `updatedInput` | For `"allow"` only: modifies the tool's input parameters before execution |

882| `updatedPermissions` | For `"allow"` only: applies permission rule updates, equivalent to the user selecting an "always allow" option |

883| `message` | For `"deny"` only: tells Claude why the permission was denied |

884| `interrupt` | For `"deny"` only: if `true`, stops Claude |

885 

886```json theme={null}

887{

888 "hookSpecificOutput": {

889 "hookEventName": "PermissionRequest",

890 "decision": {

891 "behavior": "allow",

892 "updatedInput": {

893 "command": "npm run lint"

894 }

895 }

306 }896 }

307}897}

308```898```

309 899 

310### PostToolUse Input900### PostToolUse

311 901 

312The exact schema for `tool_input` and `tool_response` depends on the tool.902Runs immediately after a tool completes successfully.

903 

904Matches on tool name, same values as PreToolUse.

905 

906#### PostToolUse input

907 

908`PostToolUse` hooks fire after a tool has already executed successfully. The input includes both `tool_input`, the arguments sent to the tool, and `tool_response`, the result it returned. The exact schema for both depends on the tool.

313 909 

314```json theme={null}910```json theme={null}

315{911{


326 "tool_response": {922 "tool_response": {

327 "filePath": "/path/to/file.txt",923 "filePath": "/path/to/file.txt",

328 "success": true924 "success": true

925 },

926 "tool_use_id": "toolu_01ABC123..."

927}

928```

929 

930#### PostToolUse decision control

931 

932`PostToolUse` hooks can provide feedback to Claude after tool execution. In addition to the [JSON output fields](#json-output) available to all hooks, your hook script can return these event-specific fields:

933 

934| Field | Description |

935| :--------------------- | :----------------------------------------------------------------------------------------- |

936| `decision` | `"block"` prompts Claude with the `reason`. Omit to allow the action to proceed |

937| `reason` | Explanation shown to Claude when `decision` is `"block"` |

938| `additionalContext` | Additional context for Claude to consider |

939| `updatedMCPToolOutput` | For [MCP tools](#match-mcp-tools) only: replaces the tool's output with the provided value |

940 

941```json theme={null}

942{

943 "decision": "block",

944 "reason": "Explanation for decision",

945 "hookSpecificOutput": {

946 "hookEventName": "PostToolUse",

947 "additionalContext": "Additional information for Claude"

329 }948 }

330}949}

331```950```

332 951 

333### Notification Input952### PostToolUseFailure

953 

954Runs when a tool execution fails. This event fires for tool calls that throw errors or return failure results. Use this to log failures, send alerts, or provide corrective feedback to Claude.

955 

956Matches on tool name, same values as PreToolUse.

957 

958#### PostToolUseFailure input

959 

960PostToolUseFailure hooks receive the same `tool_name` and `tool_input` fields as PostToolUse, along with error information as top-level fields:

961 

962```json theme={null}

963{

964 "session_id": "abc123",

965 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

966 "cwd": "/Users/...",

967 "permission_mode": "default",

968 "hook_event_name": "PostToolUseFailure",

969 "tool_name": "Bash",

970 "tool_input": {

971 "command": "npm test",

972 "description": "Run test suite"

973 },

974 "tool_use_id": "toolu_01ABC123...",

975 "error": "Command exited with non-zero status code 1",

976 "is_interrupt": false

977}

978```

979 

980| Field | Description |

981| :------------- | :------------------------------------------------------------------------------ |

982| `error` | String describing what went wrong |

983| `is_interrupt` | Optional boolean indicating whether the failure was caused by user interruption |

984 

985#### PostToolUseFailure decision control

986 

987`PostToolUseFailure` hooks can provide context to Claude after a tool failure. In addition to the [JSON output fields](#json-output) available to all hooks, your hook script can return these event-specific fields:

988 

989| Field | Description |

990| :------------------ | :------------------------------------------------------------ |

991| `additionalContext` | Additional context for Claude to consider alongside the error |

992 

993```json theme={null}

994{

995 "hookSpecificOutput": {

996 "hookEventName": "PostToolUseFailure",

997 "additionalContext": "Additional information about the failure for Claude"

998 }

999}

1000```

1001 

1002### Notification

1003 

1004Runs when Claude Code sends notifications. Matches on notification type: `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`. Omit the matcher to run hooks for all notification types.

1005 

1006Use separate matchers to run different handlers depending on the notification type. This configuration triggers a permission-specific alert script when Claude needs permission approval and a different notification when Claude has been idle:

1007 

1008```json theme={null}

1009{

1010 "hooks": {

1011 "Notification": [

1012 {

1013 "matcher": "permission_prompt",

1014 "hooks": [

1015 {

1016 "type": "command",

1017 "command": "/path/to/permission-alert.sh"

1018 }

1019 ]

1020 },

1021 {

1022 "matcher": "idle_prompt",

1023 "hooks": [

1024 {

1025 "type": "command",

1026 "command": "/path/to/idle-notification.sh"

1027 }

1028 ]

1029 }

1030 ]

1031 }

1032}

1033```

1034 

1035#### Notification input

1036 

1037In addition to the [common input fields](#common-input-fields), Notification hooks receive `message` with the notification text, an optional `title`, and `notification_type` indicating which type fired.

334 1038 

335```json theme={null}1039```json theme={null}

336{1040{


339 "cwd": "/Users/...",1043 "cwd": "/Users/...",

340 "permission_mode": "default",1044 "permission_mode": "default",

341 "hook_event_name": "Notification",1045 "hook_event_name": "Notification",

342 "message": "Task completed successfully"1046 "message": "Claude needs your permission to use Bash",

1047 "title": "Permission needed",

1048 "notification_type": "permission_prompt"

1049}

1050```

1051 

1052Notification hooks cannot block or modify notifications. In addition to the [JSON output fields](#json-output) available to all hooks, you can return `additionalContext` to add context to the conversation:

1053 

1054| Field | Description |

1055| :------------------ | :------------------------------- |

1056| `additionalContext` | String added to Claude's context |

1057 

1058### SubagentStart

1059 

1060Runs when a Claude Code subagent is spawned via the Task tool. Supports matchers to filter by agent type name (built-in agents like `Bash`, `Explore`, `Plan`, or custom agent names from `.claude/agents/`).

1061 

1062#### SubagentStart input

1063 

1064In addition to the [common input fields](#common-input-fields), SubagentStart hooks receive `agent_id` with the unique identifier for the subagent and `agent_type` with the agent name (built-in agents like `"Bash"`, `"Explore"`, `"Plan"`, or custom agent names).

1065 

1066```json theme={null}

1067{

1068 "session_id": "abc123",

1069 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1070 "cwd": "/Users/...",

1071 "permission_mode": "default",

1072 "hook_event_name": "SubagentStart",

1073 "agent_id": "agent-abc123",

1074 "agent_type": "Explore"

1075}

1076```

1077 

1078SubagentStart hooks cannot block subagent creation, but they can inject context into the subagent. In addition to the [JSON output fields](#json-output) available to all hooks, you can return:

1079 

1080| Field | Description |

1081| :------------------ | :------------------------------------- |

1082| `additionalContext` | String added to the subagent's context |

1083 

1084```json theme={null}

1085{

1086 "hookSpecificOutput": {

1087 "hookEventName": "SubagentStart",

1088 "additionalContext": "Follow security guidelines for this task"

1089 }

343}1090}

344```1091```

345 1092 

346### UserPromptSubmit Input1093### SubagentStop

1094 

1095Runs when a Claude Code subagent has finished responding. Matches on agent type, same values as SubagentStart.

1096 

1097#### SubagentStop input

1098 

1099In addition to the [common input fields](#common-input-fields), SubagentStop hooks receive `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path`, and `last_assistant_message`. The `agent_type` field is the value used for matcher filtering. The `transcript_path` is the main session's transcript, while `agent_transcript_path` is the subagent's own transcript stored in a nested `subagents/` folder. The `last_assistant_message` field contains the text content of the subagent's final response, so hooks can access it without parsing the transcript file.

347 1100 

348```json theme={null}1101```json theme={null}

349{1102{

350 "session_id": "abc123",1103 "session_id": "abc123",

351 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",1104 "transcript_path": "~/.claude/projects/.../abc123.jsonl",

352 "cwd": "/Users/...",1105 "cwd": "/Users/...",

353 "permission_mode": "default",1106 "permission_mode": "default",

354 "hook_event_name": "UserPromptSubmit",1107 "hook_event_name": "SubagentStop",

355 "prompt": "Write a function to calculate the factorial of a number"1108 "stop_hook_active": false,

1109 "agent_id": "def456",

1110 "agent_type": "Explore",

1111 "agent_transcript_path": "~/.claude/projects/.../abc123/subagents/agent-def456.jsonl",

1112 "last_assistant_message": "Analysis complete. Found 3 potential issues..."

356}1113}

357```1114```

358 1115 

359### Stop and SubagentStop Input1116SubagentStop hooks use the same decision control format as [Stop hooks](#stop-decision-control).

1117 

1118### Stop

1119 

1120Runs when the main Claude Code agent has finished responding. Does not run if

1121the stoppage occurred due to a user interrupt.

1122 

1123#### Stop input

360 1124 

361`stop_hook_active` is true when Claude Code is already continuing as a result of1125In addition to the [common input fields](#common-input-fields), Stop hooks receive `stop_hook_active` and `last_assistant_message`. The `stop_hook_active` field is `true` when Claude Code is already continuing as a result of a stop hook. Check this value or process the transcript to prevent Claude Code from running indefinitely. The `last_assistant_message` field contains the text content of Claude's final response, so hooks can access it without parsing the transcript file.

362a stop hook. Check this value or process the transcript to prevent Claude Code

363from running indefinitely.

364 1126 

365```json theme={null}1127```json theme={null}

366{1128{

367 "session_id": "abc123",1129 "session_id": "abc123",

368 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",1130 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1131 "cwd": "/Users/...",

369 "permission_mode": "default",1132 "permission_mode": "default",

370 "hook_event_name": "Stop",1133 "hook_event_name": "Stop",

371 "stop_hook_active": true1134 "stop_hook_active": true,

1135 "last_assistant_message": "I've completed the refactoring. Here's a summary..."

372}1136}

373```1137```

374 1138 

375### PreCompact Input1139#### Stop decision control

376 1140 

377For `manual`, `custom_instructions` comes from what the user passes into1141`Stop` and `SubagentStop` hooks can control whether Claude continues. In addition to the [JSON output fields](#json-output) available to all hooks, your hook script can return these event-specific fields:

378`/compact`. For `auto`, `custom_instructions` is empty.1142 

1143| Field | Description |

1144| :--------- | :------------------------------------------------------------------------- |

1145| `decision` | `"block"` prevents Claude from stopping. Omit to allow Claude to stop |

1146| `reason` | Required when `decision` is `"block"`. Tells Claude why it should continue |

379 1147 

380```json theme={null}1148```json theme={null}

381{1149{

382 "session_id": "abc123",1150 "decision": "block",

383 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",1151 "reason": "Must be provided when Claude is blocked from stopping"

384 "permission_mode": "default",

385 "hook_event_name": "PreCompact",

386 "trigger": "manual",

387 "custom_instructions": ""

388}1152}

389```1153```

390 1154 

391### SessionStart Input1155### TeammateIdle

1156 

1157Runs when an [agent team](/en/agent-teams) teammate is about to go idle after finishing its turn. Use this to enforce quality gates before a teammate stops working, such as requiring passing lint checks or verifying that output files exist.

1158 

1159When a `TeammateIdle` hook exits with code 2, the teammate receives the stderr message as feedback and continues working instead of going idle. TeammateIdle hooks do not support matchers and fire on every occurrence.

1160 

1161#### TeammateIdle input

1162 

1163In addition to the [common input fields](#common-input-fields), TeammateIdle hooks receive `teammate_name` and `team_name`.

392 1164 

393```json theme={null}1165```json theme={null}

394{1166{

395 "session_id": "abc123",1167 "session_id": "abc123",

396 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",1168 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1169 "cwd": "/Users/...",

397 "permission_mode": "default",1170 "permission_mode": "default",

398 "hook_event_name": "SessionStart",1171 "hook_event_name": "TeammateIdle",

399 "source": "startup"1172 "teammate_name": "researcher",

1173 "team_name": "my-project"

400}1174}

401```1175```

402 1176 

403### SessionEnd Input1177| Field | Description |

1178| :-------------- | :-------------------------------------------- |

1179| `teammate_name` | Name of the teammate that is about to go idle |

1180| `team_name` | Name of the team |

1181 

1182#### TeammateIdle decision control

1183 

1184TeammateIdle hooks use exit codes only, not JSON decision control. This example checks that a build artifact exists before allowing a teammate to go idle:

1185 

1186```bash theme={null}

1187#!/bin/bash

1188 

1189if [ ! -f "./dist/output.js" ]; then

1190 echo "Build artifact missing. Run the build before stopping." >&2

1191 exit 2

1192fi

1193 

1194exit 0

1195```

1196 

1197### TaskCompleted

1198 

1199Runs when a task is being marked as completed. This fires in two situations: when any agent explicitly marks a task as completed through the TaskUpdate tool, or when an [agent team](/en/agent-teams) teammate finishes its turn with in-progress tasks. Use this to enforce completion criteria like passing tests or lint checks before a task can close.

1200 

1201When a `TaskCompleted` hook exits with code 2, the task is not marked as completed and the stderr message is fed back to the model as feedback. TaskCompleted hooks do not support matchers and fire on every occurrence.

1202 

1203#### TaskCompleted input

1204 

1205In addition to the [common input fields](#common-input-fields), TaskCompleted hooks receive `task_id`, `task_subject`, and optionally `task_description`, `teammate_name`, and `team_name`.

404 1206 

405```json theme={null}1207```json theme={null}

406{1208{

407 "session_id": "abc123",1209 "session_id": "abc123",

408 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",1210 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

409 "cwd": "/Users/...",1211 "cwd": "/Users/...",

410 "permission_mode": "default",1212 "permission_mode": "default",

411 "hook_event_name": "SessionEnd",1213 "hook_event_name": "TaskCompleted",

412 "reason": "exit"1214 "task_id": "task-001",

1215 "task_subject": "Implement user authentication",

1216 "task_description": "Add login and signup endpoints",

1217 "teammate_name": "implementer",

1218 "team_name": "my-project"

413}1219}

414```1220```

415 1221 

416## Hook Output1222| Field | Description |

1223| :----------------- | :------------------------------------------------------ |

1224| `task_id` | Identifier of the task being completed |

1225| `task_subject` | Title of the task |

1226| `task_description` | Detailed description of the task. May be absent |

1227| `teammate_name` | Name of the teammate completing the task. May be absent |

1228| `team_name` | Name of the team. May be absent |

417 1229 

418There are two ways for hooks to return output back to Claude Code. The output1230#### TaskCompleted decision control

419communicates whether to block and any feedback that should be shown to Claude

420and the user.

421 1231 

422### Simple: Exit Code1232TaskCompleted hooks use exit codes only, not JSON decision control. This example runs tests and blocks task completion if they fail:

423 1233 

424Hooks communicate status through exit codes, stdout, and stderr:1234```bash theme={null}

1235#!/bin/bash

1236INPUT=$(cat)

1237TASK_SUBJECT=$(echo "$INPUT" | jq -r '.task_subject')

425 1238 

426* **Exit code 0**: Success. `stdout` is shown to the user in transcript mode1239# Run the test suite

427 (CTRL-R), except for `UserPromptSubmit` and `SessionStart`, where stdout is1240if ! npm test 2>&1; then

428 added to the context.1241 echo "Tests not passing. Fix failing tests before completing: $TASK_SUBJECT" >&2

429* **Exit code 2**: Blocking error. `stderr` is fed back to Claude to process1242 exit 2

430 automatically. See per-hook-event behavior below.1243fi

431* **Other exit codes**: Non-blocking error. `stderr` is shown to the user and

432 execution continues.

433 1244 

434<Warning>1245exit 0

435 Reminder: Claude Code does not see stdout if the exit code is 0, except for1246```

436 the `UserPromptSubmit` hook where stdout is injected as context.

437</Warning>

438 1247 

439#### Exit Code 2 Behavior1248### ConfigChange

440 1249 

441| Hook Event | Behavior |1250Runs when a configuration file changes during a session. Use this to audit settings changes, enforce security policies, or block unauthorized modifications to configuration files.

442| ------------------ | ------------------------------------------------------------------ |

443| `PreToolUse` | Blocks the tool call, shows stderr to Claude |

444| `PostToolUse` | Shows stderr to Claude (tool already ran) |

445| `Notification` | N/A, shows stderr to user only |

446| `UserPromptSubmit` | Blocks prompt processing, erases prompt, shows stderr to user only |

447| `Stop` | Blocks stoppage, shows stderr to Claude |

448| `SubagentStop` | Blocks stoppage, shows stderr to Claude subagent |

449| `PreCompact` | N/A, shows stderr to user only |

450| `SessionStart` | N/A, shows stderr to user only |

451| `SessionEnd` | N/A, shows stderr to user only |

452 1251 

453### Advanced: JSON Output1252ConfigChange hooks fire for changes to settings files, managed policy settings, and skill files. The `source` field in the input tells you which type of configuration changed, and the optional `file_path` field provides the path to the changed file.

454 1253 

455Hooks can return structured JSON in `stdout` for more sophisticated control:1254The matcher filters on the configuration source:

456 1255 

457#### Common JSON Fields1256| Matcher | When it fires |

1257| :----------------- | :---------------------------------------- |

1258| `user_settings` | `~/.claude/settings.json` changes |

1259| `project_settings` | `.claude/settings.json` changes |

1260| `local_settings` | `.claude/settings.local.json` changes |

1261| `policy_settings` | Managed policy settings change |

1262| `skills` | A skill file in `.claude/skills/` changes |

458 1263 

459All hook types can include these optional fields:1264This example logs all configuration changes for security auditing:

460 1265 

461```json theme={null}1266```json theme={null}

462{1267{

463 "continue": true, // Whether Claude should continue after hook execution (default: true)1268 "hooks": {

464 "stopReason": "string", // Message shown when continue is false1269 "ConfigChange": [

1270 {

1271 "hooks": [

1272 {

1273 "type": "command",

1274 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/audit-config-change.sh"

1275 }

1276 ]

1277 }

1278 ]

1279 }

1280}

1281```

465 1282 

466 "suppressOutput": true, // Hide stdout from transcript mode (default: false)1283#### ConfigChange input

467 "systemMessage": "string" // Optional warning message shown to the user1284 

1285In addition to the [common input fields](#common-input-fields), ConfigChange hooks receive `source` and optionally `file_path`. The `source` field indicates which configuration type changed, and `file_path` provides the path to the specific file that was modified.

1286 

1287```json theme={null}

1288{

1289 "session_id": "abc123",

1290 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1291 "cwd": "/Users/...",

1292 "permission_mode": "default",

1293 "hook_event_name": "ConfigChange",

1294 "source": "project_settings",

1295 "file_path": "/Users/.../my-project/.claude/settings.json"

468}1296}

469```1297```

470 1298 

471If `continue` is false, Claude stops processing after the hooks run.1299#### ConfigChange decision control

472 1300 

473* For `PreToolUse`, this is different from `"permissionDecision": "deny"`, which1301ConfigChange hooks can block configuration changes from taking effect. Use exit code 2 or a JSON `decision` to prevent the change. When blocked, the new settings are not applied to the running session.

474 only blocks a specific tool call and provides automatic feedback to Claude.

475* For `PostToolUse`, this is different from `"decision": "block"`, which

476 provides automated feedback to Claude.

477* For `UserPromptSubmit`, this prevents the prompt from being processed.

478* For `Stop` and `SubagentStop`, this takes precedence over any

479 `"decision": "block"` output.

480* In all cases, `"continue" = false` takes precedence over any

481 `"decision": "block"` output.

482 1302 

483`stopReason` accompanies `continue` with a reason shown to the user, not shown1303| Field | Description |

484to Claude.1304| :--------- | :--------------------------------------------------------------------------------------- |

1305| `decision` | `"block"` prevents the configuration change from being applied. Omit to allow the change |

1306| `reason` | Explanation shown to the user when `decision` is `"block"` |

485 1307 

486#### `PreToolUse` Decision Control1308```json theme={null}

1309{

1310 "decision": "block",

1311 "reason": "Configuration changes to project settings require admin approval"

1312}

1313```

1314 

1315`policy_settings` changes cannot be blocked. Hooks still fire for `policy_settings` sources, so you can use them for audit logging, but any blocking decision is ignored. This ensures enterprise-managed settings always take effect.

487 1316 

488`PreToolUse` hooks can control whether a tool call proceeds.1317### WorktreeCreate

489 1318 

490* `"allow"` bypasses the permission system. `permissionDecisionReason` is shown1319When you run `claude --worktree` or a [subagent uses `isolation: "worktree"`](/en/sub-agents#choose-the-subagent-scope), Claude Code creates an isolated working copy using `git worktree`. If you configure a WorktreeCreate hook, it replaces the default git behavior, letting you use a different version control system like SVN, Perforce, or Mercurial.

491 to the user but not to Claude.

492* `"deny"` prevents the tool call from executing. `permissionDecisionReason` is

493 shown to Claude.

494* `"ask"` asks the user to confirm the tool call in the UI.

495 `permissionDecisionReason` is shown to the user but not to Claude.

496 1320 

497Additionally, hooks can modify tool inputs before execution using `updatedInput`:1321The hook must print the absolute path to the created worktree directory on stdout. Claude Code uses this path as the working directory for the isolated session.

498 1322 

499* `updatedInput` allows you to modify the tool's input parameters before the tool executes. This is a `Record<string, unknown>` object containing the fields you want to change or add.1323This example creates an SVN working copy and prints the path for Claude Code to use. Replace the repository URL with your own:

500* This is most useful with `"permissionDecision": "allow"` to modify and approve tool calls.

501 1324 

502```json theme={null}1325```json theme={null}

503{1326{

504 "hookSpecificOutput": {1327 "hooks": {

505 "hookEventName": "PreToolUse",1328 "WorktreeCreate": [

506 "permissionDecision": "allow"1329 {

507 "permissionDecisionReason": "My reason here",1330 "hooks": [

508 "updatedInput": {1331 {

509 "field_to_modify": "new value"1332 "type": "command",

1333 "command": "bash -c 'NAME=$(jq -r .name); DIR=\"$HOME/.claude/worktrees/$NAME\"; svn checkout https://svn.example.com/repo/trunk \"$DIR\" >&2 && echo \"$DIR\"'"

510 }1334 }

1335 ]

1336 }

1337 ]

511 }1338 }

512}1339}

513```1340```

514 1341 

515<Note>1342The hook reads the worktree `name` from the JSON input on stdin, checks out a fresh copy into a new directory, and prints the directory path. The `echo` on the last line is what Claude Code reads as the worktree path. Redirect any other output to stderr so it doesn't interfere with the path.

516 The `decision` and `reason` fields are deprecated for PreToolUse hooks.

517 Use `hookSpecificOutput.permissionDecision` and

518 `hookSpecificOutput.permissionDecisionReason` instead. The deprecated fields

519 `"approve"` and `"block"` map to `"allow"` and `"deny"` respectively.

520</Note>

521 

522#### `PostToolUse` Decision Control

523 1343 

524`PostToolUse` hooks can provide feedback to Claude after tool execution.1344#### WorktreeCreate input

525 1345 

526* `"block"` automatically prompts Claude with `reason`.1346In addition to the [common input fields](#common-input-fields), WorktreeCreate hooks receive the `name` field. This is a slug identifier for the new worktree, either specified by the user or auto-generated (for example, `bold-oak-a3f2`).

527* `undefined` does nothing. `reason` is ignored.

528* `"hookSpecificOutput.additionalContext"` adds context for Claude to consider.

529 1347 

530```json theme={null}1348```json theme={null}

531{1349{

532 "decision": "block" | undefined,1350 "session_id": "abc123",

533 "reason": "Explanation for decision",1351 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

534 "hookSpecificOutput": {1352 "cwd": "/Users/...",

535 "hookEventName": "PostToolUse",1353 "hook_event_name": "WorktreeCreate",

536 "additionalContext": "Additional information for Claude"1354 "name": "feature-auth"

537 }

538}1355}

539```1356```

540 1357 

541#### `UserPromptSubmit` Decision Control1358#### WorktreeCreate output

1359 

1360The hook must print the absolute path to the created worktree directory on stdout. If the hook fails or produces no output, worktree creation fails with an error.

1361 

1362WorktreeCreate hooks do not use the standard allow/block decision model. Instead, the hook's success or failure determines the outcome. Only `type: "command"` hooks are supported.

542 1363 

543`UserPromptSubmit` hooks can control whether a user prompt is processed.1364### WorktreeRemove

544 1365 

545* `"block"` prevents the prompt from being processed. The submitted prompt is1366The cleanup counterpart to [WorktreeCreate](#worktreecreate). This hook fires when a worktree is being removed, either when you exit a `--worktree` session and choose to remove it, or when a subagent with `isolation: "worktree"` finishes. For git-based worktrees, Claude handles cleanup automatically with `git worktree remove`. If you configured a WorktreeCreate hook for a non-git version control system, pair it with a WorktreeRemove hook to handle cleanup. Without one, the worktree directory is left on disk.

546 erased from context. `"reason"` is shown to the user but not added to context.1367 

547* `undefined` allows the prompt to proceed normally. `"reason"` is ignored.1368Claude Code passes the path that WorktreeCreate printed on stdout as `worktree_path` in the hook input. This example reads that path and removes the directory:

548* `"hookSpecificOutput.additionalContext"` adds the string to the context if not

549 blocked.

550 1369 

551```json theme={null}1370```json theme={null}

552{1371{

553 "decision": "block" | undefined,1372 "hooks": {

554 "reason": "Explanation for decision",1373 "WorktreeRemove": [

555 "hookSpecificOutput": {1374 {

556 "hookEventName": "UserPromptSubmit",1375 "hooks": [

557 "additionalContext": "My additional context here"1376 {

1377 "type": "command",

1378 "command": "bash -c 'jq -r .worktree_path | xargs rm -rf'"

1379 }

1380 ]

1381 }

1382 ]

558 }1383 }

559}1384}

560```1385```

561 1386 

562#### `Stop`/`SubagentStop` Decision Control1387#### WorktreeRemove input

563 1388 

564`Stop` and `SubagentStop` hooks can control whether Claude must continue.1389In addition to the [common input fields](#common-input-fields), WorktreeRemove hooks receive the `worktree_path` field, which is the absolute path to the worktree being removed.

565 

566* `"block"` prevents Claude from stopping. You must populate `reason` for Claude

567 to know how to proceed.

568* `undefined` allows Claude to stop. `reason` is ignored.

569 1390 

570```json theme={null}1391```json theme={null}

571{1392{

572 "decision": "block" | undefined,1393 "session_id": "abc123",

573 "reason": "Must be provided when Claude is blocked from stopping"1394 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1395 "cwd": "/Users/...",

1396 "hook_event_name": "WorktreeRemove",

1397 "worktree_path": "/Users/.../my-project/.claude/worktrees/feature-auth"

574}1398}

575```1399```

576 1400 

577#### `SessionStart` Decision Control1401WorktreeRemove hooks have no decision control. They cannot block worktree removal but can perform cleanup tasks like removing version control state or archiving changes. Hook failures are logged in debug mode only. Only `type: "command"` hooks are supported.

1402 

1403### PreCompact

1404 

1405Runs before Claude Code is about to run a compact operation.

1406 

1407The matcher value indicates whether compaction was triggered manually or automatically:

578 1408 

579`SessionStart` hooks allow you to load in context at the start of a session.1409| Matcher | When it fires |

1410| :------- | :------------------------------------------- |

1411| `manual` | `/compact` |

1412| `auto` | Auto-compact when the context window is full |

580 1413 

581* `"hookSpecificOutput.additionalContext"` adds the string to the context.1414#### PreCompact input

582* Multiple hooks' `additionalContext` values are concatenated.1415 

1416In addition to the [common input fields](#common-input-fields), PreCompact hooks receive `trigger` and `custom_instructions`. For `manual`, `custom_instructions` contains what the user passes into `/compact`. For `auto`, `custom_instructions` is empty.

583 1417 

584```json theme={null}1418```json theme={null}

585{1419{

586 "hookSpecificOutput": {1420 "session_id": "abc123",

587 "hookEventName": "SessionStart",1421 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

588 "additionalContext": "My additional context here"1422 "cwd": "/Users/...",

589 }1423 "permission_mode": "default",

1424 "hook_event_name": "PreCompact",

1425 "trigger": "manual",

1426 "custom_instructions": ""

590}1427}

591```1428```

592 1429 

593#### `SessionEnd` Decision Control1430### SessionEnd

594 1431 

595`SessionEnd` hooks run when a session ends. They cannot block session termination1432Runs when a Claude Code session ends. Useful for cleanup tasks, logging session

596but can perform cleanup tasks.1433statistics, or saving session state. Supports matchers to filter by exit reason.

597 1434 

598#### Exit Code Example: Bash Command Validation1435The `reason` field in the hook input indicates why the session ended:

599 1436 

600```python theme={null}1437| Reason | Description |

601#!/usr/bin/env python31438| :---------------------------- | :----------------------------------------- |

602import json1439| `clear` | Session cleared with `/clear` command |

603import re1440| `logout` | User logged out |

604import sys1441| `prompt_input_exit` | User exited while prompt input was visible |

1442| `bypass_permissions_disabled` | Bypass permissions mode was disabled |

1443| `other` | Other exit reasons |

605 1444 

606# Define validation rules as a list of (regex pattern, message) tuples1445#### SessionEnd input

607VALIDATION_RULES = [

608 (

609 r"\bgrep\b(?!.*\|)",

610 "Use 'rg' (ripgrep) instead of 'grep' for better performance and features",

611 ),

612 (

613 r"\bfind\s+\S+\s+-name\b",

614 "Use 'rg --files | rg pattern' or 'rg --files -g pattern' instead of 'find -name' for better performance",

615 ),

616]

617 1446 

1447In addition to the [common input fields](#common-input-fields), SessionEnd hooks receive a `reason` field indicating why the session ended. See the [reason table](#sessionend) above for all values.

618 1448 

619def validate_command(command: str) -> list[str]:1449```json theme={null}

620 issues = []1450{

621 for pattern, message in VALIDATION_RULES:1451 "session_id": "abc123",

622 if re.search(pattern, command):1452 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

623 issues.append(message)1453 "cwd": "/Users/...",

624 return issues1454 "permission_mode": "default",

1455 "hook_event_name": "SessionEnd",

1456 "reason": "other"

1457}

1458```

625 1459 

1460SessionEnd hooks have no decision control. They cannot block session termination but can perform cleanup tasks.

626 1461 

627try:1462## Prompt-based hooks

628 input_data = json.load(sys.stdin)

629except json.JSONDecodeError as e:

630 print(f"Error: Invalid JSON input: {e}", file=sys.stderr)

631 sys.exit(1)

632 1463 

633tool_name = input_data.get("tool_name", "")1464In addition to Bash command hooks (`type: "command"`), Claude Code supports prompt-based hooks (`type: "prompt"`) that use an LLM to evaluate whether to allow or block an action, and agent hooks (`type: "agent"`) that spawn an agentic verifier with tool access. Not all events support every hook type.

634tool_input = input_data.get("tool_input", {})

635command = tool_input.get("command", "")

636 1465 

637if tool_name != "Bash" or not command:1466Events that support all three hook types (`command`, `prompt`, and `agent`):

638 sys.exit(1)

639 1467 

640# Validate the command1468* `PermissionRequest`

641issues = validate_command(command)1469* `PostToolUse`

1470* `PostToolUseFailure`

1471* `PreToolUse`

1472* `Stop`

1473* `SubagentStop`

1474* `TaskCompleted`

1475* `UserPromptSubmit`

642 1476 

643if issues:1477Events that only support `type: "command"` hooks:

644 for message in issues:

645 print(f"• {message}", file=sys.stderr)

646 # Exit code 2 blocks tool call and shows stderr to Claude

647 sys.exit(2)

648```

649 1478 

650#### JSON Output Example: UserPromptSubmit to Add Context and Validation1479* `ConfigChange`

1480* `Notification`

1481* `PreCompact`

1482* `SessionEnd`

1483* `SessionStart`

1484* `SubagentStart`

1485* `TeammateIdle`

1486* `WorktreeCreate`

1487* `WorktreeRemove`

651 1488 

652<Note>1489### How prompt-based hooks work

653 For `UserPromptSubmit` hooks, you can inject context using either method:

654 1490 

655 * Exit code 0 with stdout: Claude sees the context (special case for `UserPromptSubmit`)1491Instead of executing a Bash command, prompt-based hooks:

656 * JSON output: Provides more control over the behavior

657</Note>

658 1492 

659```python theme={null}14931. Send the hook input and your prompt to a Claude model, Haiku by default

660#!/usr/bin/env python314942. The LLM responds with structured JSON containing a decision

661import json14953. Claude Code processes the decision automatically

662import sys

663import re

664import datetime

665 

666# Load input from stdin

667try:

668 input_data = json.load(sys.stdin)

669except json.JSONDecodeError as e:

670 print(f"Error: Invalid JSON input: {e}", file=sys.stderr)

671 sys.exit(1)

672 

673prompt = input_data.get("prompt", "")

674 

675# Check for sensitive patterns

676sensitive_patterns = [

677 (r"(?i)\b(password|secret|key|token)\s*[:=]", "Prompt contains potential secrets"),

678]

679 

680for pattern, message in sensitive_patterns:

681 if re.search(pattern, prompt):

682 # Use JSON output to block with a specific reason

683 output = {

684 "decision": "block",

685 "reason": f"Security policy violation: {message}. Please rephrase your request without sensitive information."

686 }

687 print(json.dumps(output))

688 sys.exit(0)

689 1496 

690# Add current time to context1497### Prompt hook configuration

691context = f"Current time: {datetime.datetime.now()}"

692print(context)

693 1498 

694"""1499Set `type` to `"prompt"` and provide a `prompt` string instead of a `command`. Use the `$ARGUMENTS` placeholder to inject the hook's JSON input data into your prompt text. Claude Code sends the combined prompt and input to a fast Claude model, which returns a JSON decision.

695The following is also equivalent:1500 

696print(json.dumps({1501This `Stop` hook asks the LLM to evaluate whether all tasks are complete before allowing Claude to finish:

697 "hookSpecificOutput": {

698 "hookEventName": "UserPromptSubmit",

699 "additionalContext": context,

700 },

701}))

702"""

703 1502 

704# Allow the prompt to proceed with the additional context1503```json theme={null}

705sys.exit(0)1504{

1505 "hooks": {

1506 "Stop": [

1507 {

1508 "hooks": [

1509 {

1510 "type": "prompt",

1511 "prompt": "Evaluate if Claude should stop: $ARGUMENTS. Check if all tasks are complete."

1512 }

1513 ]

1514 }

1515 ]

1516 }

1517}

706```1518```

707 1519 

708#### JSON Output Example: PreToolUse with Approval1520| Field | Required | Description |

1521| :-------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

1522| `type` | yes | Must be `"prompt"` |

1523| `prompt` | yes | The prompt text to send to the LLM. Use `$ARGUMENTS` as a placeholder for the hook input JSON. If `$ARGUMENTS` is not present, input JSON is appended to the prompt |

1524| `model` | no | Model to use for evaluation. Defaults to a fast model |

1525| `timeout` | no | Timeout in seconds. Default: 30 |

709 1526 

710```python theme={null}1527### Response schema

711#!/usr/bin/env python31528 

712import json1529The LLM must respond with JSON containing:

713import sys1530 

1531```json theme={null}

1532{

1533 "ok": true | false,

1534 "reason": "Explanation for the decision"

1535}

1536```

714 1537 

715# Load input from stdin1538| Field | Description |

716try:1539| :------- | :--------------------------------------------------------- |

717 input_data = json.load(sys.stdin)1540| `ok` | `true` allows the action, `false` prevents it |

718except json.JSONDecodeError as e:1541| `reason` | Required when `ok` is `false`. Explanation shown to Claude |

719 print(f"Error: Invalid JSON input: {e}", file=sys.stderr)

720 sys.exit(1)

721 1542 

722tool_name = input_data.get("tool_name", "")1543### Example: Multi-criteria Stop hook

723tool_input = input_data.get("tool_input", {})

724 1544 

725# Example: Auto-approve file reads for documentation files1545This `Stop` hook uses a detailed prompt to check three conditions before allowing Claude to stop. If `"ok"` is `false`, Claude continues working with the provided reason as its next instruction. `SubagentStop` hooks use the same format to evaluate whether a [subagent](/en/sub-agents) should stop:

726if tool_name == "Read":

727 file_path = tool_input.get("file_path", "")

728 if file_path.endswith((".md", ".mdx", ".txt", ".json")):

729 # Use JSON output to auto-approve the tool call

730 output = {

731 "decision": "approve",

732 "reason": "Documentation file auto-approved",

733 "suppressOutput": True # Don't show in transcript mode

734 }

735 print(json.dumps(output))

736 sys.exit(0)

737 1546 

738# For other cases, let the normal permission flow proceed1547```json theme={null}

739sys.exit(0)1548{

1549 "hooks": {

1550 "Stop": [

1551 {

1552 "hooks": [

1553 {

1554 "type": "prompt",

1555 "prompt": "You are evaluating whether Claude should stop working. Context: $ARGUMENTS\n\nAnalyze the conversation and determine if:\n1. All user-requested tasks are complete\n2. Any errors need to be addressed\n3. Follow-up work is needed\n\nRespond with JSON: {\"ok\": true} to allow stopping, or {\"ok\": false, \"reason\": \"your explanation\"} to continue working.",

1556 "timeout": 30

1557 }

1558 ]

1559 }

1560 ]

1561 }

1562}

740```1563```

741 1564 

742## Working with MCP Tools1565## Agent-based hooks

743 1566 

744Claude Code hooks work seamlessly with1567Agent-based hooks (`type: "agent"`) are like prompt-based hooks but with multi-turn tool access. Instead of a single LLM call, an agent hook spawns a subagent that can read files, search code, and inspect the codebase to verify conditions. Agent hooks support the same events as prompt-based hooks.

745[Model Context Protocol (MCP) tools](/en/docs/claude-code/mcp). When MCP servers

746provide tools, they appear with a special naming pattern that you can match in

747your hooks.

748 1568 

749### MCP Tool Naming1569### How agent hooks work

750 1570 

751MCP tools follow the pattern `mcp__<server>__<tool>`, for example:1571When an agent hook fires:

752 1572 

753* `mcp__memory__create_entities` - Memory server's create entities tool15731. Claude Code spawns a subagent with your prompt and the hook's JSON input

754* `mcp__filesystem__read_file` - Filesystem server's read file tool15742. The subagent can use tools like Read, Grep, and Glob to investigate

755* `mcp__github__search_repositories` - GitHub server's search tool15753. After up to 50 turns, the subagent returns a structured `{ "ok": true/false }` decision

15764. Claude Code processes the decision the same way as a prompt hook

756 1577 

757### Configuring Hooks for MCP Tools1578Agent hooks are useful when verification requires inspecting actual files or test output, not just evaluating the hook input data alone.

758 1579 

759You can target specific MCP tools or entire MCP servers:1580### Agent hook configuration

1581 

1582Set `type` to `"agent"` and provide a `prompt` string. The configuration fields are the same as [prompt hooks](#prompt-hook-configuration), with a longer default timeout:

1583 

1584| Field | Required | Description |

1585| :-------- | :------- | :------------------------------------------------------------------------------------------ |

1586| `type` | yes | Must be `"agent"` |

1587| `prompt` | yes | Prompt describing what to verify. Use `$ARGUMENTS` as a placeholder for the hook input JSON |

1588| `model` | no | Model to use. Defaults to a fast model |

1589| `timeout` | no | Timeout in seconds. Default: 60 |

1590 

1591The response schema is the same as prompt hooks: `{ "ok": true }` to allow or `{ "ok": false, "reason": "..." }` to block.

1592 

1593This `Stop` hook verifies that all unit tests pass before allowing Claude to finish:

760 1594 

761```json theme={null}1595```json theme={null}

762{1596{

763 "hooks": {1597 "hooks": {

764 "PreToolUse": [1598 "Stop": [

765 {1599 {

766 "matcher": "mcp__memory__.*",

767 "hooks": [1600 "hooks": [

768 {1601 {

769 "type": "command",1602 "type": "agent",

770 "command": "echo 'Memory operation initiated' >> ~/mcp-operations.log"1603 "prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",

1604 "timeout": 120

771 }1605 }

772 ]1606 ]

773 },1607 }

1608 ]

1609 }

1610}

1611```

1612 

1613## Run hooks in the background

1614 

1615By default, hooks block Claude's execution until they complete. For long-running tasks like deployments, test suites, or external API calls, set `"async": true` to run the hook in the background while Claude continues working. Async hooks cannot block or control Claude's behavior: response fields like `decision`, `permissionDecision`, and `continue` have no effect, because the action they would have controlled has already completed.

1616 

1617### Configure an async hook

1618 

1619Add `"async": true` to a command hook's configuration to run it in the background without blocking Claude. This field is only available on `type: "command"` hooks.

1620 

1621This hook runs a test script after every `Write` tool call. Claude continues working immediately while `run-tests.sh` executes for up to 120 seconds. When the script finishes, its output is delivered on the next conversation turn:

1622 

1623```json theme={null}

1624{

1625 "hooks": {

1626 "PostToolUse": [

774 {1627 {

775 "matcher": "mcp__.*__write.*",1628 "matcher": "Write",

776 "hooks": [1629 "hooks": [

777 {1630 {

778 "type": "command",1631 "type": "command",

779 "command": "/home/user/scripts/validate-mcp-write.py"1632 "command": "/path/to/run-tests.sh",

1633 "async": true,

1634 "timeout": 120

780 }1635 }

781 ]1636 ]

782 }1637 }


785}1640}

786```1641```

787 1642 

788## Examples1643The `timeout` field sets the maximum time in seconds for the background process. If not specified, async hooks use the same 10-minute default as sync hooks.

789 

790<Tip>

791 For practical examples including code formatting, notifications, and file protection, see [More Examples](/en/docs/claude-code/hooks-guide#more-examples) in the get started guide.

792</Tip>

793 

794## Security Considerations

795 1644 

796### Disclaimer1645### How async hooks execute

797 1646 

798**USE AT YOUR OWN RISK**: Claude Code hooks execute arbitrary shell commands on1647When an async hook fires, Claude Code starts the hook process and immediately continues without waiting for it to finish. The hook receives the same JSON input via stdin as a synchronous hook.

799your system automatically. By using hooks, you acknowledge that:

800 1648 

801* You are solely responsible for the commands you configure1649After the background process exits, if the hook produced a JSON response with a `systemMessage` or `additionalContext` field, that content is delivered to Claude as context on the next conversation turn.

802* Hooks can modify, delete, or access any files your user account can access

803* Malicious or poorly written hooks can cause data loss or system damage

804* Anthropic provides no warranty and assumes no liability for any damages

805 resulting from hook usage

806* You should thoroughly test hooks in a safe environment before production use

807 1650 

808Always review and understand any hook commands before adding them to your1651### Example: run tests after file changes

809configuration.

810 1652 

811### Security Best Practices1653This hook starts a test suite in the background whenever Claude writes a file, then reports the results back to Claude when the tests finish. Save this script to `.claude/hooks/run-tests-async.sh` in your project and make it executable with `chmod +x`:

812 1654 

813Here are some key practices for writing more secure hooks:1655```bash theme={null}

1656#!/bin/bash

1657# run-tests-async.sh

814 1658 

8151. **Validate and sanitize inputs** - Never trust input data blindly1659# Read hook input from stdin

8162. **Always quote shell variables** - Use `"$VAR"` not `$VAR`1660INPUT=$(cat)

8173. **Block path traversal** - Check for `..` in file paths1661FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

8184. **Use absolute paths** - Specify full paths for scripts (use

819 "\$CLAUDE\_PROJECT\_DIR" for the project path)

8205. **Skip sensitive files** - Avoid `.env`, `.git/`, keys, etc.

821 1662 

822### Configuration Safety1663# Only run tests for source files

1664if [[ "$FILE_PATH" != *.ts && "$FILE_PATH" != *.js ]]; then

1665 exit 0

1666fi

823 1667 

824Direct edits to hooks in settings files don't take effect immediately. Claude1668# Run tests and report results via systemMessage

825Code:1669RESULT=$(npm test 2>&1)

1670EXIT_CODE=$?

826 1671 

8271. Captures a snapshot of hooks at startup1672if [ $EXIT_CODE -eq 0 ]; then

8282. Uses this snapshot throughout the session1673 echo "{\"systemMessage\": \"Tests passed after editing $FILE_PATH\"}"

8293. Warns if hooks are modified externally1674else

8304. Requires review in `/hooks` menu for changes to apply1675 echo "{\"systemMessage\": \"Tests failed after editing $FILE_PATH: $RESULT\"}"

1676fi

1677```

831 1678 

832This prevents malicious hook modifications from affecting your current session.1679Then add this configuration to `.claude/settings.json` in your project root. The `async: true` flag lets Claude keep working while tests run:

833 1680 

834## Hook Execution Details1681```json theme={null}

1682{

1683 "hooks": {

1684 "PostToolUse": [

1685 {

1686 "matcher": "Write|Edit",

1687 "hooks": [

1688 {

1689 "type": "command",

1690 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/run-tests-async.sh",

1691 "async": true,

1692 "timeout": 300

1693 }

1694 ]

1695 }

1696 ]

1697 }

1698}

1699```

835 1700 

836* **Timeout**: 60-second execution limit by default, configurable per command.1701### Limitations

837 * A timeout for an individual command does not affect the other commands.

838* **Parallelization**: All matching hooks run in parallel

839* **Deduplication**: Multiple identical hook commands are deduplicated automatically

840* **Environment**: Runs in current directory with Claude Code's environment

841 * The `CLAUDE_PROJECT_DIR` environment variable is available and contains the

842 absolute path to the project root directory (where Claude Code was started)

843 * The `CLAUDE_CODE_REMOTE` environment variable indicates whether the hook is running in a remote (web) environment (`"true"`) or local CLI environment (not set or empty). Use this to run different logic based on execution context.

844* **Input**: JSON via stdin

845* **Output**:

846 * PreToolUse/PostToolUse/Stop/SubagentStop: Progress shown in transcript (Ctrl-R)

847 * Notification/SessionEnd: Logged to debug only (`--debug`)

848 * UserPromptSubmit/SessionStart: stdout added as context for Claude

849 1702 

850## Debugging1703Async hooks have several constraints compared to synchronous hooks:

851 1704 

852### Basic Troubleshooting1705* Only `type: "command"` hooks support `async`. Prompt-based hooks cannot run asynchronously.

1706* Async hooks cannot block tool calls or return decisions. By the time the hook completes, the triggering action has already proceeded.

1707* Hook output is delivered on the next conversation turn. If the session is idle, the response waits until the next user interaction.

1708* Each execution creates a separate background process. There is no deduplication across multiple firings of the same async hook.

853 1709 

854If your hooks aren't working:1710## Security considerations

855 1711 

8561. **Check configuration** - Run `/hooks` to see if your hook is registered1712### Disclaimer

8572. **Verify syntax** - Ensure your JSON settings are valid

8583. **Test commands** - Run hook commands manually first

8594. **Check permissions** - Make sure scripts are executable

8605. **Review logs** - Use `claude --debug` to see hook execution details

861 1713 

862Common issues:1714Hooks run with your system user's full permissions.

863 1715 

864* **Quotes not escaped** - Use `\"` inside JSON strings1716<Warning>

865* **Wrong matcher** - Check tool names match exactly (case-sensitive)1717 Hooks execute shell commands with your full user permissions. They can modify, delete, or access any files your user account can access. Review and test all hook commands before adding them to your configuration.

866* **Command not found** - Use full paths for scripts1718</Warning>

867 1719 

868### Advanced Debugging1720### Security best practices

869 1721 

870For complex hook issues:1722Keep these practices in mind when writing hooks:

871 1723 

8721. **Inspect hook execution** - Use `claude --debug` to see detailed hook1724* **Validate and sanitize inputs**: never trust input data blindly

873 execution1725* **Always quote shell variables**: use `"$VAR"` not `$VAR`

8742. **Validate JSON schemas** - Test hook input/output with external tools1726* **Block path traversal**: check for `..` in file paths

8753. **Check environment variables** - Verify Claude Code's environment is correct1727* **Use absolute paths**: specify full paths for scripts, using `"$CLAUDE_PROJECT_DIR"` for the project root

8764. **Test edge cases** - Try hooks with unusual file paths or inputs1728* **Skip sensitive files**: avoid `.env`, `.git/`, keys, etc.

8775. **Monitor system resources** - Check for resource exhaustion during hook

878 execution

8796. **Use structured logging** - Implement logging in your hook scripts

880 1729 

881### Debug Output Example1730## Debug hooks

882 1731 

883Use `claude --debug` to see hook execution details:1732Run `claude --debug` to see hook execution details, including which hooks matched, their exit codes, and output. Toggle verbose mode with `Ctrl+O` to see hook progress in the transcript.

884 1733 

885```1734```

886[DEBUG] Executing hooks for PostToolUse:Write1735[DEBUG] Executing hooks for PostToolUse:Write


888[DEBUG] Found 1 hook matchers in settings1737[DEBUG] Found 1 hook matchers in settings

889[DEBUG] Matched 1 hooks for query "Write"1738[DEBUG] Matched 1 hooks for query "Write"

890[DEBUG] Found 1 hook commands to execute1739[DEBUG] Found 1 hook commands to execute

891[DEBUG] Executing hook command: <Your command> with timeout 60000ms1740[DEBUG] Executing hook command: <Your command> with timeout 600000ms

892[DEBUG] Hook command completed with status 0: <Your stdout>1741[DEBUG] Hook command completed with status 0: <Your stdout>

893```1742```

894 1743 

895Progress messages appear in transcript mode (Ctrl-R) showing:1744For troubleshooting common issues like hooks not firing, infinite Stop hook loops, or configuration errors, see [Limitations and troubleshooting](/en/hooks-guide#limitations-and-troubleshooting) in the guide.

896 

897* Which hook is running

898* Command being executed

899* Success/failure status

900* Output or error messages

hooks-guide.md +534 −202

Details

1# Get started with Claude Code hooks1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Learn how to customize and extend Claude Code's behavior by registering shell commands5# Automate workflows with hooks

4 6 

5Claude Code hooks are user-defined shell commands that execute at various points7> Run shell commands automatically when Claude Code edits files, finishes tasks, or needs input. Format code, send notifications, validate commands, and enforce project rules.

6in Claude Code's lifecycle. Hooks provide deterministic control over Claude8 

7Code's behavior, ensuring certain actions always happen rather than relying on9Hooks are user-defined shell commands that execute at specific points in Claude Code's lifecycle. They provide deterministic control over Claude Code's behavior, ensuring certain actions always happen rather than relying on the LLM to choose to run them. Use hooks to enforce project rules, automate repetitive tasks, and integrate Claude Code with your existing tools.

8the LLM to choose to run them.10 

11For decisions that require judgment rather than deterministic rules, you can also use [prompt-based hooks](#prompt-based-hooks) or [agent-based hooks](#agent-based-hooks) that use a Claude model to evaluate conditions.

12 

13For other ways to extend Claude Code, see [skills](/en/skills) for giving Claude additional instructions and executable commands, [subagents](/en/sub-agents) for running tasks in isolated contexts, and [plugins](/en/plugins) for packaging extensions to share across projects.

9 14 

10<Tip>15<Tip>

11 For reference documentation on hooks, see [Hooks reference](/en/docs/claude-code/hooks).16 This guide covers common use cases and how to get started. For full event schemas, JSON input/output formats, and advanced features like async hooks and MCP tool hooks, see the [Hooks reference](/en/hooks).

12</Tip>17</Tip>

13 18 

14Example use cases for hooks include:19## Set up your first hook

20 

21The fastest way to create a hook is through the `/hooks` interactive menu in Claude Code. This walkthrough creates a desktop notification hook, so you get alerted whenever Claude is waiting for your input instead of watching the terminal.

15 22 

16* **Notifications**: Customize how you get notified when Claude Code is awaiting23<Steps>

17 your input or permission to run something.24 <Step title="Open the hooks menu">

18* **Automatic formatting**: Run `prettier` on .ts files, `gofmt` on .go files,25 Type `/hooks` in the Claude Code CLI. You'll see a list of all available hook events, plus an option to disable all hooks. Each event corresponds to a point in Claude's lifecycle where you can run custom code. Select `Notification` to create a hook that fires when Claude needs your attention.

19 etc. after every file edit.26 </Step>

20* **Logging**: Track and count all executed commands for compliance or

21 debugging.

22* **Feedback**: Provide automated feedback when Claude Code produces code that

23 does not follow your codebase conventions.

24* **Custom permissions**: Block modifications to production files or sensitive

25 directories.

26 27 

27By encoding these rules as hooks rather than prompting instructions, you turn28 <Step title="Configure the matcher">

28suggestions into app-level code that executes every time it is expected to run.29 The menu shows a list of matchers, which filter when the hook fires. Set the matcher to `*` to fire on all notification types. You can narrow it later by changing the matcher to a specific value like `permission_prompt` or `idle_prompt`.

30 </Step>

29 31 

30<Warning>32 <Step title="Add your command">

31 You must consider the security implication of hooks as you add them, because hooks run automatically during the agent loop with your current environment's credentials.33 Select `+ Add new hook…`. The menu prompts you for a shell command to run when the event fires. Hooks run any shell command you provide, so you can use your platform's built-in notification tool. Copy the command for your OS:

32 For example, malicious hooks code can exfiltrate your data. Always review your hooks implementation before registering them.

33 34 

34 For full security best practices, see [Security Considerations](/en/docs/claude-code/hooks#security-considerations) in the hooks reference documentation.35 <Tabs>

35</Warning>36 <Tab title="macOS">

37 Uses [`osascript`](https://ss64.com/mac/osascript.html) to trigger a native macOS notification through AppleScript:

36 38 

37## Hook Events Overview39 ```

40 osascript -e 'display notification "Claude Code needs your attention" with title "Claude Code"'

41 ```

42 </Tab>

38 43 

39Claude Code provides several hook events that run at different points in the44 <Tab title="Linux">

40workflow:45 Uses `notify-send`, which is pre-installed on most Linux desktops with a notification daemon:

41 46 

42* **PreToolUse**: Runs before tool calls (can block them)47 ```

43* **PostToolUse**: Runs after tool calls complete48 notify-send 'Claude Code' 'Claude Code needs your attention'

44* **UserPromptSubmit**: Runs when the user submits a prompt, before Claude processes it49 ```

45* **Notification**: Runs when Claude Code sends notifications50 </Tab>

46* **Stop**: Runs when Claude Code finishes responding

47* **SubagentStop**: Runs when subagent tasks complete

48* **PreCompact**: Runs before Claude Code is about to run a compact operation

49* **SessionStart**: Runs when Claude Code starts a new session or resumes an existing session

50* **SessionEnd**: Runs when Claude Code session ends

51 51 

52Each event receives different data and can control Claude's behavior in52 <Tab title="Windows (PowerShell)">

53different ways.53 Uses PowerShell to show a native message box through .NET's Windows Forms:

54 54 

55## Quickstart55 ```

56 powershell.exe -Command "[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')"

57 ```

58 </Tab>

59 </Tabs>

60 </Step>

56 61 

57In this quickstart, you'll add a hook that logs the shell commands that Claude62 <Step title="Choose a storage location">

58Code runs.63 The menu asks where to save the hook configuration. Select `User settings` to store it in `~/.claude/settings.json`, which applies the hook to all your projects. You could also choose `Project settings` to scope it to the current project. See [Configure hook location](#configure-hook-location) for all available scopes.

64 </Step>

59 65 

60### Prerequisites66 <Step title="Test the hook">

67 Press `Esc` to return to the CLI. Ask Claude to do something that requires permission, then switch away from the terminal. You should receive a desktop notification.

68 </Step>

69</Steps>

61 70 

62Install `jq` for JSON processing in the command line.71## What you can automate

63 72 

64### Step 1: Open hooks configuration73Hooks let you run code at key points in Claude Code's lifecycle: format files after edits, block commands before they execute, send notifications when Claude needs input, inject context at session start, and more. For the full list of hook events, see the [Hooks reference](/en/hooks#hook-lifecycle).

65 74 

66Run the `/hooks` [slash command](/en/docs/claude-code/slash-commands) and select75Each example includes a ready-to-use configuration block that you add to a [settings file](#configure-hook-location). The most common patterns:

67the `PreToolUse` hook event.

68 76 

69`PreToolUse` hooks run before tool calls and can block them while providing77* [Get notified when Claude needs input](#get-notified-when-claude-needs-input)

70Claude feedback on what to do differently.78* [Auto-format code after edits](#auto-format-code-after-edits)

79* [Block edits to protected files](#block-edits-to-protected-files)

80* [Re-inject context after compaction](#re-inject-context-after-compaction)

81* [Audit configuration changes](#audit-configuration-changes)

71 82 

72### Step 2: Add a matcher83### Get notified when Claude needs input

84 

85Get a desktop notification whenever Claude finishes working and needs your input, so you can switch to other tasks without checking the terminal.

86 

87This hook uses the `Notification` event, which fires when Claude is waiting for input or permission. Each tab below uses the platform's native notification command. Add this to `~/.claude/settings.json`, or use the [interactive walkthrough](#set-up-your-first-hook) above to configure it with `/hooks`:

88 

89<Tabs>

90 <Tab title="macOS">

91 ```json theme={null}

92 {

93 "hooks": {

94 "Notification": [

95 {

96 "matcher": "",

97 "hooks": [

98 {

99 "type": "command",

100 "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"

101 }

102 ]

103 }

104 ]

105 }

106 }

107 ```

108 </Tab>

73 109 

74Select `+ Add new matcher…` to run your hook only on Bash tool calls.110 <Tab title="Linux">

111 ```json theme={null}

112 {

113 "hooks": {

114 "Notification": [

115 {

116 "matcher": "",

117 "hooks": [

118 {

119 "type": "command",

120 "command": "notify-send 'Claude Code' 'Claude Code needs your attention'"

121 }

122 ]

123 }

124 ]

125 }

126 }

127 ```

128 </Tab>

75 129 

76Type `Bash` for the matcher.130 <Tab title="Windows (PowerShell)">

131 ```json theme={null}

132 {

133 "hooks": {

134 "Notification": [

135 {

136 "matcher": "",

137 "hooks": [

138 {

139 "type": "command",

140 "command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')\""

141 }

142 ]

143 }

144 ]

145 }

146 }

147 ```

148 </Tab>

149</Tabs>

77 150 

78<Note>You can use `*` to match all tools.</Note>151### Auto-format code after edits

79 152 

80### Step 3: Add the hook153Automatically run [Prettier](https://prettier.io/) on every file Claude edits, so formatting stays consistent without manual intervention.

81 154 

82Select `+ Add new hook…` and enter this command:155This hook uses the `PostToolUse` event with an `Edit|Write` matcher, so it runs only after file-editing tools. The command extracts the edited file path with [`jq`](https://jqlang.github.io/jq/) and passes it to Prettier. Add this to `.claude/settings.json` in your project root:

83 156 

84```bash theme={null}157```json theme={null}

85jq -r '"\(.tool_input.command) - \(.tool_input.description // "No description")"' >> ~/.claude/bash-command-log.txt158{

159 "hooks": {

160 "PostToolUse": [

161 {

162 "matcher": "Edit|Write",

163 "hooks": [

164 {

165 "type": "command",

166 "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"

167 }

168 ]

169 }

170 ]

171 }

172}

86```173```

87 174 

88### Step 4: Save your configuration175<Note>

176 The Bash examples on this page use `jq` for JSON parsing. Install it with `brew install jq` (macOS), `apt-get install jq` (Debian/Ubuntu), or see [`jq` downloads](https://jqlang.github.io/jq/download/).

177</Note>

178 

179### Block edits to protected files

180 

181Prevent Claude from modifying sensitive files like `.env`, `package-lock.json`, or anything in `.git/`. Claude receives feedback explaining why the edit was blocked, so it can adjust its approach.

182 

183This example uses a separate script file that the hook calls. The script checks the target file path against a list of protected patterns and exits with code 2 to block the edit.

184 

185<Steps>

186 <Step title="Create the hook script">

187 Save this to `.claude/hooks/protect-files.sh`:

188 

189 ```bash theme={null}

190 #!/bin/bash

191 # protect-files.sh

192 

193 INPUT=$(cat)

194 FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

195 

196 PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/")

197 

198 for pattern in "${PROTECTED_PATTERNS[@]}"; do

199 if [[ "$FILE_PATH" == *"$pattern"* ]]; then

200 echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2

201 exit 2

202 fi

203 done

89 204 

90For storage location, select `User settings` since you're logging to your home205 exit 0

91directory. This hook will then apply to all projects, not just your current206 ```

92project.207 </Step>

93 208 

94Then press Esc until you return to the REPL. Your hook is now registered!209 <Step title="Make the script executable (macOS/Linux)">

210 Hook scripts must be executable for Claude Code to run them:

95 211 

96### Step 5: Verify your hook212 ```bash theme={null}

213 chmod +x .claude/hooks/protect-files.sh

214 ```

215 </Step>

97 216 

98Run `/hooks` again or check `~/.claude/settings.json` to see your configuration:217 <Step title="Register the hook">

218 Add a `PreToolUse` hook to `.claude/settings.json` that runs the script before any `Edit` or `Write` tool call:

219 

220 ```json theme={null}

221 {

222 "hooks": {

223 "PreToolUse": [

224 {

225 "matcher": "Edit|Write",

226 "hooks": [

227 {

228 "type": "command",

229 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"

230 }

231 ]

232 }

233 ]

234 }

235 }

236 ```

237 </Step>

238</Steps>

239 

240### Re-inject context after compaction

241 

242When Claude's context window fills up, compaction summarizes the conversation to free space. This can lose important details. Use a `SessionStart` hook with a `compact` matcher to re-inject critical context after every compaction.

243 

244Any text your command writes to stdout is added to Claude's context. This example reminds Claude of project conventions and recent work. Add this to `.claude/settings.json` in your project root:

99 245 

100```json theme={null}246```json theme={null}

101{247{

102 "hooks": {248 "hooks": {

103 "PreToolUse": [249 "SessionStart": [

104 {250 {

105 "matcher": "Bash",251 "matcher": "compact",

106 "hooks": [252 "hooks": [

107 {253 {

108 "type": "command",254 "type": "command",

109 "command": "jq -r '\"\\(.tool_input.command) - \\(.tool_input.description // \"No description\")\"' >> ~/.claude/bash-command-log.txt"255 "command": "echo 'Reminder: use Bun, not npm. Run bun test before committing. Current sprint: auth refactor.'"

110 }256 }

111 ]257 ]

112 }258 }


115}261}

116```262```

117 263 

118### Step 6: Test your hook264You can replace the `echo` with any command that produces dynamic output, like `git log --oneline -5` to show recent commits. For injecting context on every session start, consider using [CLAUDE.md](/en/memory) instead. For environment variables, see [`CLAUDE_ENV_FILE`](/en/hooks#persist-environment-variables) in the reference.

119 265 

120Ask Claude to run a simple command like `ls` and check your log file:266### Audit configuration changes

121 267 

122```bash theme={null}268Track when settings or skills files change during a session. The `ConfigChange` event fires when an external process or editor modifies a configuration file, so you can log changes for compliance or block unauthorized modifications.

123cat ~/.claude/bash-command-log.txt269 

270This example appends each change to an audit log. Add this to `~/.claude/settings.json`:

271 

272```json theme={null}

273{

274 "hooks": {

275 "ConfigChange": [

276 {

277 "matcher": "",

278 "hooks": [

279 {

280 "type": "command",

281 "command": "jq -c '{timestamp: now | todate, source: .source, file: .file_path}' >> ~/claude-config-audit.log"

282 }

283 ]

284 }

285 ]

286 }

287}

124```288```

125 289 

126You should see entries like:290The matcher filters by configuration type: `user_settings`, `project_settings`, `local_settings`, `policy_settings`, or `skills`. To block a change from taking effect, exit with code 2 or return `{"decision": "block"}`. See the [ConfigChange reference](/en/hooks#configchange) for the full input schema.

291 

292## How hooks work

293 

294Hook events fire at specific lifecycle points in Claude Code. When an event fires, all matching hooks run in parallel, and identical hook commands are automatically deduplicated. The table below shows each event and when it triggers:

295 

296| Event | When it fires |

297| :------------------- | :---------------------------------------------------------------------------------------------------------- |

298| `SessionStart` | When a session begins or resumes |

299| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |

300| `PreToolUse` | Before a tool call executes. Can block it |

301| `PermissionRequest` | When a permission dialog appears |

302| `PostToolUse` | After a tool call succeeds |

303| `PostToolUseFailure` | After a tool call fails |

304| `Notification` | When Claude Code sends a notification |

305| `SubagentStart` | When a subagent is spawned |

306| `SubagentStop` | When a subagent finishes |

307| `Stop` | When Claude finishes responding |

308| `TeammateIdle` | When an [agent team](/en/agent-teams) teammate is about to go idle |

309| `TaskCompleted` | When a task is being marked as completed |

310| `ConfigChange` | When a configuration file changes during a session |

311| `WorktreeCreate` | When a worktree is being created via `--worktree` or `isolation: "worktree"`. Replaces default git behavior |

312| `WorktreeRemove` | When a worktree is being removed, either at session exit or when a subagent finishes |

313| `PreCompact` | Before context compaction |

314| `SessionEnd` | When a session terminates |

315 

316Each hook has a `type` that determines how it runs. Most hooks use `"type": "command"`, which runs a shell command. Two other options use a Claude model to make decisions: `"type": "prompt"` for single-turn evaluation and `"type": "agent"` for multi-turn verification with tool access. See [Prompt-based hooks](#prompt-based-hooks) and [Agent-based hooks](#agent-based-hooks) for details.

317 

318### Read input and return output

319 

320Hooks communicate with Claude Code through stdin, stdout, stderr, and exit codes. When an event fires, Claude Code passes event-specific data as JSON to your script's stdin. Your script reads that data, does its work, and tells Claude Code what to do next via the exit code.

321 

322#### Hook input

127 323 

324Every event includes common fields like `session_id` and `cwd`, but each event type adds different data. For example, when Claude runs a Bash command, a `PreToolUse` hook receives something like this on stdin:

325 

326```json theme={null}

327{

328 "session_id": "abc123", // unique ID for this session

329 "cwd": "/Users/sarah/myproject", // working directory when the event fired

330 "hook_event_name": "PreToolUse", // which event triggered this hook

331 "tool_name": "Bash", // the tool Claude is about to use

332 "tool_input": { // the arguments Claude passed to the tool

333 "command": "npm test" // for Bash, this is the shell command

334 }

335}

128```336```

129ls - Lists files and directories337 

338Your script can parse that JSON and act on any of those fields. `UserPromptSubmit` hooks get the `prompt` text instead, `SessionStart` hooks get the `source` (startup, resume, clear, compact), and so on. See [Common input fields](/en/hooks#common-input-fields) in the reference for shared fields, and each event's section for event-specific schemas.

339 

340#### Hook output

341 

342Your script tells Claude Code what to do next by writing to stdout or stderr and exiting with a specific code. For example, a `PreToolUse` hook that wants to block a command:

343 

344```bash theme={null}

345#!/bin/bash

346INPUT=$(cat)

347COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')

348 

349if echo "$COMMAND" | grep -q "drop table"; then

350 echo "Blocked: dropping tables is not allowed" >&2 # stderr becomes Claude's feedback

351 exit 2 # exit 2 = block the action

352fi

353 

354exit 0 # exit 0 = let it proceed

130```355```

131 356 

132## More Examples357The exit code determines what happens next:

358 

359* **Exit 0**: the action proceeds. For `UserPromptSubmit` and `SessionStart` hooks, anything you write to stdout is added to Claude's context.

360* **Exit 2**: the action is blocked. Write a reason to stderr, and Claude receives it as feedback so it can adjust.

361* **Any other exit code**: the action proceeds. Stderr is logged but not shown to Claude. Toggle verbose mode with `Ctrl+O` to see these messages in the transcript.

362 

363#### Structured JSON output

364 

365Exit codes give you two options: allow or block. For more control, exit 0 and print a JSON object to stdout instead.

133 366 

134<Note>367<Note>

135 For a complete example implementation, see the [bash command validator example](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py) in our public codebase.368 Use exit 2 to block with a stderr message, or exit 0 with JSON for structured control. Don't mix them: Claude Code ignores JSON when you exit 2.

136</Note>369</Note>

137 370 

138### Code Formatting Hook371For example, a `PreToolUse` hook can deny a tool call and tell Claude why, or escalate it to the user for approval:

139 372 

140Automatically format TypeScript files after editing:373```json theme={null}

374{

375 "hookSpecificOutput": {

376 "hookEventName": "PreToolUse",

377 "permissionDecision": "deny",

378 "permissionDecisionReason": "Use rg instead of grep for better performance"

379 }

380}

381```

382 

383Claude Code reads `permissionDecision` and cancels the tool call, then feeds `permissionDecisionReason` back to Claude as feedback. These three options are specific to `PreToolUse`:

384 

385* `"allow"`: proceed without showing a permission prompt

386* `"deny"`: cancel the tool call and send the reason to Claude

387* `"ask"`: show the permission prompt to the user as normal

388 

389Other events use different decision patterns. For example, `PostToolUse` and `Stop` hooks use a top-level `decision: "block"` field, while `PermissionRequest` uses `hookSpecificOutput.decision.behavior`. See the [summary table](/en/hooks#decision-control) in the reference for a full breakdown by event.

390 

391For `UserPromptSubmit` hooks, use `additionalContext` instead to inject text into Claude's context. Prompt-based hooks (`type: "prompt"`) handle output differently: see [Prompt-based hooks](#prompt-based-hooks).

392 

393### Filter hooks with matchers

394 

395Without a matcher, a hook fires on every occurrence of its event. Matchers let you narrow that down. For example, if you want to run a formatter only after file edits (not after every tool call), add a matcher to your `PostToolUse` hook:

141 396 

142```json theme={null}397```json theme={null}

143{398{


146 {401 {

147 "matcher": "Edit|Write",402 "matcher": "Edit|Write",

148 "hooks": [403 "hooks": [

149 {404 { "type": "command", "command": "prettier --write ..." }

150 "type": "command",

151 "command": "jq -r '.tool_input.file_path' | { read file_path; if echo \"$file_path\" | grep -q '\\.ts$'; then npx prettier --write \"$file_path\"; fi; }"

152 }

153 ]405 ]

154 }406 }

155 ]407 ]


157}409}

158```410```

159 411 

160### Markdown Formatting Hook412The `"Edit|Write"` matcher is a regex pattern that matches the tool name. The hook only fires when Claude uses the `Edit` or `Write` tool, not when it uses `Bash`, `Read`, or any other tool.

161 413 

162Automatically fix missing language tags and formatting issues in markdown files:414Each event type matches on a specific field. Matchers support exact strings and regex patterns:

163 415 

164```json theme={null}416| Event | What the matcher filters | Example matcher values |

165{417| :---------------------------------------------------------------------------------------------- | :------------------------ | :--------------------------------------------------------------------------------- |

418| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest` | tool name | `Bash`, `Edit\|Write`, `mcp__.*` |

419| `SessionStart` | how the session started | `startup`, `resume`, `clear`, `compact` |

420| `SessionEnd` | why the session ended | `clear`, `logout`, `prompt_input_exit`, `bypass_permissions_disabled`, `other` |

421| `Notification` | notification type | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog` |

422| `SubagentStart` | agent type | `Bash`, `Explore`, `Plan`, or custom agent names |

423| `PreCompact` | what triggered compaction | `manual`, `auto` |

424| `SubagentStop` | agent type | same values as `SubagentStart` |

425| `ConfigChange` | configuration source | `user_settings`, `project_settings`, `local_settings`, `policy_settings`, `skills` |

426| `UserPromptSubmit`, `Stop`, `TeammateIdle`, `TaskCompleted`, `WorktreeCreate`, `WorktreeRemove` | no matcher support | always fires on every occurrence |

427 

428A few more examples showing matchers on different event types:

429 

430<Tabs>

431 <Tab title="Log every Bash command">

432 Match only `Bash` tool calls and log each command to a file. The `PostToolUse` event fires after the command completes, so `tool_input.command` contains what ran. The hook receives the event data as JSON on stdin, and `jq -r '.tool_input.command'` extracts just the command string, which `>>` appends to the log file:

433 

434 ```json theme={null}

435 {

166 "hooks": {436 "hooks": {

167 "PostToolUse": [437 "PostToolUse": [

168 {438 {

169 "matcher": "Edit|Write",439 "matcher": "Bash",

170 "hooks": [440 "hooks": [

171 {441 {

172 "type": "command",442 "type": "command",

173 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/markdown_formatter.py"443 "command": "jq -r '.tool_input.command' >> ~/.claude/command-log.txt"

174 }444 }

175 ]445 ]

176 }446 }

177 ]447 ]

178 }448 }

179}449 }

180```450 ```

451 </Tab>

181 452 

182Create `.claude/hooks/markdown_formatter.py` with this content:453 <Tab title="Match MCP tools">

183 454 MCP tools use a different naming convention than built-in tools: `mcp__<server>__<tool>`, where `<server>` is the MCP server name and `<tool>` is the tool it provides. For example, `mcp__github__search_repositories` or `mcp__filesystem__read_file`. Use a regex matcher to target all tools from a specific server, or match across servers with a pattern like `mcp__.*__write.*`. See [Match MCP tools](/en/hooks#match-mcp-tools) in the reference for the full list of examples.

184````python theme={null}

185#!/usr/bin/env python3

186"""

187Markdown formatter for Claude Code output.

188Fixes missing language tags and spacing issues while preserving code content.

189"""

190import json

191import sys

192import re

193import os

194 

195def detect_language(code):

196 """Best-effort language detection from code content."""

197 s = code.strip()

198

199 # JSON detection

200 if re.search(r'^\s*[{\[]', s):

201 try:

202 json.loads(s)

203 return 'json'

204 except:

205 pass

206

207 # Python detection

208 if re.search(r'^\s*def\s+\w+\s*\(', s, re.M) or \

209 re.search(r'^\s*(import|from)\s+\w+', s, re.M):

210 return 'python'

211

212 # JavaScript detection

213 if re.search(r'\b(function\s+\w+\s*\(|const\s+\w+\s*=)', s) or \

214 re.search(r'=>|console\.(log|error)', s):

215 return 'javascript'

216

217 # Bash detection

218 if re.search(r'^#!.*\b(bash|sh)\b', s, re.M) or \

219 re.search(r'\b(if|then|fi|for|in|do|done)\b', s):

220 return 'bash'

221

222 # SQL detection

223 if re.search(r'\b(SELECT|INSERT|UPDATE|DELETE|CREATE)\s+', s, re.I):

224 return 'sql'

225

226 return 'text'

227 

228def format_markdown(content):

229 """Format markdown content with language detection."""

230 # Fix unlabeled code fences

231 def add_lang_to_fence(match):

232 indent, info, body, closing = match.groups()

233 if not info.strip():

234 lang = detect_language(body)

235 return f"{indent}```{lang}\n{body}{closing}\n"

236 return match.group(0)

237

238 fence_pattern = r'(?ms)^([ \t]{0,3})```([^\n]*)\n(.*?)(\n\1```)\s*$'

239 content = re.sub(fence_pattern, add_lang_to_fence, content)

240

241 # Fix excessive blank lines (only outside code fences)

242 content = re.sub(r'\n{3,}', '\n\n', content)

243

244 return content.rstrip() + '\n'

245 

246# Main execution

247try:

248 input_data = json.load(sys.stdin)

249 file_path = input_data.get('tool_input', {}).get('file_path', '')

250

251 if not file_path.endswith(('.md', '.mdx')):

252 sys.exit(0) # Not a markdown file

253

254 if os.path.exists(file_path):

255 with open(file_path, 'r', encoding='utf-8') as f:

256 content = f.read()

257

258 formatted = format_markdown(content)

259

260 if formatted != content:

261 with open(file_path, 'w', encoding='utf-8') as f:

262 f.write(formatted)

263 print(f"✓ Fixed markdown formatting in {file_path}")

264

265except Exception as e:

266 print(f"Error formatting markdown: {e}", file=sys.stderr)

267 sys.exit(1)

268````

269 

270Make the script executable:

271 455 

272```bash theme={null}456 The command below extracts the tool name from the hook's JSON input with `jq` and writes it to stderr, where it shows up in verbose mode (`Ctrl+O`):

273chmod +x .claude/hooks/markdown_formatter.py

274```

275 457 

276This hook automatically:458 ```json theme={null}

459 {

460 "hooks": {

461 "PreToolUse": [

462 {

463 "matcher": "mcp__github__.*",

464 "hooks": [

465 {

466 "type": "command",

467 "command": "echo \"GitHub tool called: $(jq -r '.tool_name')\" >&2"

468 }

469 ]

470 }

471 ]

472 }

473 }

474 ```

475 </Tab>

277 476 

278* Detects programming languages in unlabeled code blocks477 <Tab title="Clean up on session end">

279* Adds appropriate language tags for syntax highlighting478 The `SessionEnd` event supports matchers on the reason the session ended. This hook only fires on `clear` (when you run `/clear`), not on normal exits:

280* Fixes excessive blank lines while preserving code content

281* Only processes markdown files (`.md`, `.mdx`)

282 479 

283### Custom Notification Hook480 ```json theme={null}

481 {

482 "hooks": {

483 "SessionEnd": [

484 {

485 "matcher": "clear",

486 "hooks": [

487 {

488 "type": "command",

489 "command": "rm -f /tmp/claude-scratch-*.txt"

490 }

491 ]

492 }

493 ]

494 }

495 }

496 ```

497 </Tab>

498</Tabs>

499 

500For full matcher syntax, see the [Hooks reference](/en/hooks#configuration).

501 

502### Configure hook location

503 

504Where you add a hook determines its scope:

505 

506| Location | Scope | Shareable |

507| :--------------------------------------------------------- | :--------------------------------- | :--------------------------------- |

508| `~/.claude/settings.json` | All your projects | No, local to your machine |

509| `.claude/settings.json` | Single project | Yes, can be committed to the repo |

510| `.claude/settings.local.json` | Single project | No, gitignored |

511| Managed policy settings | Organization-wide | Yes, admin-controlled |

512| [Plugin](/en/plugins) `hooks/hooks.json` | When plugin is enabled | Yes, bundled with the plugin |

513| [Skill](/en/skills) or [agent](/en/sub-agents) frontmatter | While the skill or agent is active | Yes, defined in the component file |

514 

515You can also use the [`/hooks` menu](/en/hooks#the-hooks-menu) in Claude Code to add, delete, and view hooks interactively. To disable all hooks at once, use the toggle at the bottom of the `/hooks` menu or set `"disableAllHooks": true` in your settings file.

516 

517Hooks added through the `/hooks` menu take effect immediately. If you edit settings files directly while Claude Code is running, the changes won't take effect until you review them in the `/hooks` menu or restart your session.

518 

519## Prompt-based hooks

520 

521For decisions that require judgment rather than deterministic rules, use `type: "prompt"` hooks. Instead of running a shell command, Claude Code sends your prompt and the hook's input data to a Claude model (Haiku by default) to make the decision. You can specify a different model with the `model` field if you need more capability.

284 522 

285Get desktop notifications when Claude needs input:523The model's only job is to return a yes/no decision as JSON:

524 

525* `"ok": true`: the action proceeds

526* `"ok": false`: the action is blocked. The model's `"reason"` is fed back to Claude so it can adjust.

527 

528This example uses a `Stop` hook to ask the model whether all requested tasks are complete. If the model returns `"ok": false`, Claude keeps working and uses the `reason` as its next instruction:

286 529 

287```json theme={null}530```json theme={null}

288{531{

289 "hooks": {532 "hooks": {

290 "Notification": [533 "Stop": [

291 {534 {

292 "matcher": "",

293 "hooks": [535 "hooks": [

294 {536 {

295 "type": "command",537 "type": "prompt",

296 "command": "notify-send 'Claude Code' 'Awaiting your input'"538 "prompt": "Check if all tasks are complete. If not, respond with {\"ok\": false, \"reason\": \"what remains to be done\"}."

297 }539 }

298 ]540 ]

299 }541 }


302}544}

303```545```

304 546 

305### File Protection Hook547For full configuration options, see [Prompt-based hooks](/en/hooks#prompt-based-hooks) in the reference.

548 

549## Agent-based hooks

550 

551When verification requires inspecting files or running commands, use `type: "agent"` hooks. Unlike prompt hooks which make a single LLM call, agent hooks spawn a subagent that can read files, search code, and use other tools to verify conditions before returning a decision.

552 

553Agent hooks use the same `"ok"` / `"reason"` response format as prompt hooks, but with a longer default timeout of 60 seconds and up to 50 tool-use turns.

306 554 

307Block edits to sensitive files:555This example verifies that tests pass before allowing Claude to stop:

308 556 

309```json theme={null}557```json theme={null}

310{558{

311 "hooks": {559 "hooks": {

312 "PreToolUse": [560 "Stop": [

313 {561 {

314 "matcher": "Edit|Write",

315 "hooks": [562 "hooks": [

316 {563 {

317 "type": "command",564 "type": "agent",

318 "command": "python3 -c \"import json, sys; data=json.load(sys.stdin); path=data.get('tool_input',{}).get('file_path',''); sys.exit(2 if any(p in path for p in ['.env', 'package-lock.json', '.git/']) else 0)\""565 "prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",

566 "timeout": 120

319 }567 }

320 ]568 ]

321 }569 }


324}572}

325```573```

326 574 

575Use prompt hooks when the hook input data alone is enough to make a decision. Use agent hooks when you need to verify something against the actual state of the codebase.

576 

577For full configuration options, see [Agent-based hooks](/en/hooks#agent-based-hooks) in the reference.

578 

579## Limitations and troubleshooting

580 

581### Limitations

582 

583* Hooks communicate through stdout, stderr, and exit codes only. They cannot trigger slash commands or tool calls directly.

584* Hook timeout is 10 minutes by default, configurable per hook with the `timeout` field (in seconds).

585* `PostToolUse` hooks cannot undo actions since the tool has already executed.

586* `PermissionRequest` hooks do not fire in [non-interactive mode](/en/headless) (`-p`). Use `PreToolUse` hooks for automated permission decisions.

587* `Stop` hooks fire whenever Claude finishes responding, not only at task completion. They do not fire on user interrupts.

588 

589### Hook not firing

590 

591The hook is configured but never executes.

592 

593* Run `/hooks` and confirm the hook appears under the correct event

594* Check that the matcher pattern matches the tool name exactly (matchers are case-sensitive)

595* Verify you're triggering the right event type (e.g., `PreToolUse` fires before tool execution, `PostToolUse` fires after)

596* If using `PermissionRequest` hooks in non-interactive mode (`-p`), switch to `PreToolUse` instead

597 

598### Hook error in output

599 

600You see a message like "PreToolUse hook error: ..." in the transcript.

601 

602* Your script exited with a non-zero code unexpectedly. Test it manually by piping sample JSON:

603 ```bash theme={null}

604 echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh

605 echo $? # Check the exit code

606 ```

607* If you see "command not found", use absolute paths or `$CLAUDE_PROJECT_DIR` to reference scripts

608* If you see "jq: command not found", install `jq` or use Python/Node.js for JSON parsing

609* If the script isn't running at all, make it executable: `chmod +x ./my-hook.sh`

610 

611### `/hooks` shows no hooks configured

612 

613You edited a settings file but the hooks don't appear in the menu.

614 

615* Restart your session or open `/hooks` to reload. Hooks added through the `/hooks` menu take effect immediately, but manual file edits require a reload.

616* Verify your JSON is valid (trailing commas and comments are not allowed)

617* Confirm the settings file is in the correct location: `.claude/settings.json` for project hooks, `~/.claude/settings.json` for global hooks

618 

619### Stop hook runs forever

620 

621Claude keeps working in an infinite loop instead of stopping.

622 

623Your Stop hook script needs to check whether it already triggered a continuation. Parse the `stop_hook_active` field from the JSON input and exit early if it's `true`:

624 

625```bash theme={null}

626#!/bin/bash

627INPUT=$(cat)

628if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then

629 exit 0 # Allow Claude to stop

630fi

631# ... rest of your hook logic

632```

633 

634### JSON validation failed

635 

636Claude Code shows a JSON parsing error even though your hook script outputs valid JSON.

637 

638When Claude Code runs a hook, it spawns a shell that sources your profile (`~/.zshrc` or `~/.bashrc`). If your profile contains unconditional `echo` statements, that output gets prepended to your hook's JSON:

639 

640```

641Shell ready on arm64

642{"decision": "block", "reason": "Not allowed"}

643```

644 

645Claude Code tries to parse this as JSON and fails. To fix this, wrap echo statements in your shell profile so they only run in interactive shells:

646 

647```bash theme={null}

648# In ~/.zshrc or ~/.bashrc

649if [[ $- == *i* ]]; then

650 echo "Shell ready"

651fi

652```

653 

654The `$-` variable contains shell flags, and `i` means interactive. Hooks run in non-interactive shells, so the echo is skipped.

655 

656### Debug techniques

657 

658Toggle verbose mode with `Ctrl+O` to see hook output in the transcript, or run `claude --debug` for full execution details including which hooks matched and their exit codes.

659 

327## Learn more660## Learn more

328 661 

329* For reference documentation on hooks, see [Hooks reference](/en/docs/claude-code/hooks).662* [Hooks reference](/en/hooks): full event schemas, JSON output format, async hooks, and MCP tool hooks

330* For comprehensive security best practices and safety guidelines, see [Security Considerations](/en/docs/claude-code/hooks#security-considerations) in the hooks reference documentation.663* [Security considerations](/en/hooks#security-considerations): review before deploying hooks in shared or production environments

331* For troubleshooting steps and debugging techniques, see [Debugging](/en/docs/claude-code/hooks#debugging) in the hooks reference664* [Bash command validator example](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py): complete reference implementation

332 documentation.

how-claude-code-works.md +255 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# How Claude Code works

6 

7> Understand the agentic loop, built-in tools, and how Claude Code interacts with your project.

8 

9Claude Code is an agentic assistant that runs in your terminal. While it excels at coding, it can help with anything you can do from the command line: writing docs, running builds, searching files, researching topics, and more.

10 

11This guide covers the core architecture, built-in capabilities, and [tips for working effectively](#work-effectively-with-claude-code). For step-by-step walkthroughs, see [Common workflows](/en/common-workflows). For extensibility features like skills, MCP, and hooks, see [Extend Claude Code](/en/features-overview).

12 

13## The agentic loop

14 

15When you give Claude a task, it works through three phases: **gather context**, **take action**, and **verify results**. These phases blend together. Claude uses tools throughout, whether searching files to understand your code, editing to make changes, or running tests to check its work.

16 

17<img src="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/agentic-loop.svg?fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=9d9cdb2102f397a0f57450ca5ca2a969" alt="The agentic loop: Your prompt leads to Claude gathering context, taking action, verifying results, and repeating until task complete. You can interrupt at any point." data-og-width="720" width="720" data-og-height="280" height="280" data-path="images/agentic-loop.svg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/agentic-loop.svg?w=280&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=9c6a590754c1c1b281d40fc9f10fed0d 280w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/agentic-loop.svg?w=560&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=9fb2f2fc174e285797cad25a9ca2a326 560w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/agentic-loop.svg?w=840&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=3a1b68dd7b861e8ff25391773d8ab60c 840w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/agentic-loop.svg?w=1100&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=e64edf9f5cbc62464617945cf08ef134 1100w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/agentic-loop.svg?w=1650&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=3bf3319e76669f11513c6bcc5bf86feb 1650w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/agentic-loop.svg?w=2500&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=9413880a191409ff3c81bafc8f7ab977 2500w" />

18 

19The loop adapts to what you ask. A question about your codebase might only need context gathering. A bug fix cycles through all three phases repeatedly. A refactor might involve extensive verification. Claude decides what each step requires based on what it learned from the previous step, chaining dozens of actions together and course-correcting along the way.

20 

21You're part of this loop too. You can interrupt at any point to steer Claude in a different direction, provide additional context, or ask it to try a different approach. Claude works autonomously but stays responsive to your input.

22 

23The agentic loop is powered by two components: [models](#models) that reason and [tools](#tools) that act. Claude Code serves as the **agentic harness** around Claude: it provides the tools, context management, and execution environment that turn a language model into a capable coding agent.

24 

25### Models

26 

27Claude Code uses Claude models to understand your code and reason about tasks. Claude can read code in any language, understand how components connect, and figure out what needs to change to accomplish your goal. For complex tasks, it breaks work into steps, executes them, and adjusts based on what it learns.

28 

29[Multiple models](/en/model-config) are available with different tradeoffs. Sonnet handles most coding tasks well. Opus provides stronger reasoning for complex architectural decisions. Switch with `/model` during a session or start with `claude --model <name>`.

30 

31When this guide says "Claude chooses" or "Claude decides," it's the model doing the reasoning.

32 

33### Tools

34 

35Tools are what make Claude Code agentic. Without tools, Claude can only respond with text. With tools, Claude can act: read your code, edit files, run commands, search the web, and interact with external services. Each tool use returns information that feeds back into the loop, informing Claude's next decision.

36 

37The built-in tools generally fall into five categories, each representing a different kind of agency.

38 

39| Category | What Claude can do |

40| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |

41| **File operations** | Read files, edit code, create new files, rename and reorganize |

42| **Search** | Find files by pattern, search content with regex, explore codebases |

43| **Execution** | Run shell commands, start servers, run tests, use git |

44| **Web** | Search the web, fetch documentation, look up error messages |

45| **Code intelligence** | See type errors and warnings after edits, jump to definitions, find references (requires [code intelligence plugins](/en/discover-plugins#code-intelligence)) |

46 

47These are the primary capabilities. Claude also has tools for spawning subagents, asking you questions, and other orchestration tasks. See [Tools available to Claude](/en/settings#tools-available-to-claude) for the complete list.

48 

49Claude chooses which tools to use based on your prompt and what it learns along the way. When you say "fix the failing tests," Claude might:

50 

511. Run the test suite to see what's failing

522. Read the error output

533. Search for the relevant source files

544. Read those files to understand the code

555. Edit the files to fix the issue

566. Run the tests again to verify

57 

58Each tool use gives Claude new information that informs the next step. This is the agentic loop in action.

59 

60**Extending the base capabilities:** The built-in tools are the foundation. You can extend what Claude knows with [skills](/en/skills), connect to external services with [MCP](/en/mcp), automate workflows with [hooks](/en/hooks), and offload tasks to [subagents](/en/sub-agents). These extensions form a layer on top of the core agentic loop. See [Extend Claude Code](/en/features-overview) for guidance on choosing the right extension for your needs.

61 

62## What Claude can access

63 

64When you run `claude` in a directory, Claude Code gains access to:

65 

66* **Your project.** Files in your directory and subdirectories, plus files elsewhere with your permission.

67* **Your terminal.** Any command you could run: build tools, git, package managers, system utilities, scripts. If you can do it from the command line, Claude can too.

68* **Your git state.** Current branch, uncommitted changes, and recent commit history.

69* **Your [CLAUDE.md](/en/memory).** A markdown file where you store project-specific instructions, conventions, and context that Claude should know every session.

70* **Extensions you configure.** [MCP servers](/en/mcp) for external services, [skills](/en/skills) for workflows, [subagents](/en/sub-agents) for delegated work, and [Claude in Chrome](/en/chrome) for browser interaction.

71 

72Because Claude sees your whole project, it can work across it. When you ask Claude to "fix the authentication bug," it searches for relevant files, reads multiple files to understand context, makes coordinated edits across them, runs tests to verify the fix, and commits the changes if you ask. This is different from inline code assistants that only see the current file.

73 

74## Environments and interfaces

75 

76The agentic loop, tools, and capabilities described above are the same everywhere you use Claude Code. What changes is where the code executes and how you interact with it.

77 

78### Execution environments

79 

80Claude Code runs in three environments, each with different tradeoffs for where your code executes.

81 

82| Environment | Where code runs | Use case |

83| ------------------ | --------------------------------------- | ---------------------------------------------------------- |

84| **Local** | Your machine | Default. Full access to your files, tools, and environment |

85| **Cloud** | Anthropic-managed VMs | Offload tasks, work on repos you don't have locally |

86| **Remote Control** | Your machine, controlled from a browser | Use the web UI while keeping everything local |

87 

88### Interfaces

89 

90You can access Claude Code through the terminal, the [desktop app](/en/desktop), [IDE extensions](/en/ide-integrations), [claude.ai/code](https://claude.ai/code), [Remote Control](/en/remote-control), [Slack](/en/slack), and [CI/CD pipelines](/en/github-actions). The interface determines how you see and interact with Claude, but the underlying agentic loop is identical. See [Use Claude Code everywhere](/en/overview#use-claude-code-everywhere) for the full list.

91 

92## Work with sessions

93 

94Claude Code saves your conversation locally as you work. Each message, tool use, and result is stored, which enables [rewinding](#undo-changes-with-checkpoints), [resuming, and forking](#resume-or-fork-sessions) sessions. Before Claude makes code changes, it also snapshots the affected files so you can revert if needed.

95 

96**Sessions are independent.** Each new session starts with a fresh context window, without the conversation history from previous sessions. Claude can persist learnings across sessions using [auto memory](/en/memory#auto-memory), and you can add your own persistent instructions in [CLAUDE.md](/en/memory).

97 

98### Work across branches

99 

100Each Claude Code conversation is a session tied to your current directory. When you resume, you only see sessions from that directory.

101 

102Claude sees your current branch's files. When you switch branches, Claude sees the new branch's files, but your conversation history stays the same. Claude remembers what you discussed even after switching.

103 

104Since sessions are tied to directories, you can run parallel Claude sessions by using [git worktrees](/en/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees), which create separate directories for individual branches.

105 

106### Resume or fork sessions

107 

108When you resume a session with `claude --continue` or `claude --resume`, you pick up where you left off using the same session ID. New messages append to the existing conversation. Your full conversation history is restored, but session-scoped permissions are not. You'll need to re-approve those.

109 

110<img src="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/session-continuity.svg?fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=808da1b213c731bf98874c75981d688b" alt="Session continuity: resume continues the same session, fork creates a new branch with a new ID." data-og-width="560" width="560" data-og-height="280" height="280" data-path="images/session-continuity.svg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/session-continuity.svg?w=280&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=ba75f64bc571f3ef84a3237ef795bf22 280w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/session-continuity.svg?w=560&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=343ad422a171a2b909c87ed01c768745 560w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/session-continuity.svg?w=840&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=afce54d5e3b08cdb54d506332462b74c 840w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/session-continuity.svg?w=1100&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=28648c0a04cf7aef2de02d1c98491965 1100w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/session-continuity.svg?w=1650&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=a5287882beedaea54af606f682e4818d 1650w, https://mintcdn.com/claude-code/TBPmHzr19mDCuhZi/images/session-continuity.svg?w=2500&fit=max&auto=format&n=TBPmHzr19mDCuhZi&q=85&s=f392dbe67b63eead4a2aae67adfbfdbe 2500w" />

111 

112To branch off and try a different approach without affecting the original session, use the `--fork-session` flag:

113 

114```bash theme={null}

115claude --continue --fork-session

116```

117 

118This creates a new session ID while preserving the conversation history up to that point. The original session remains unchanged. Like resume, forked sessions don't inherit session-scoped permissions.

119 

120**Same session in multiple terminals**: If you resume the same session in multiple terminals, both terminals write to the same session file. Messages from both get interleaved, like two people writing in the same notebook. Nothing corrupts, but the conversation becomes jumbled. Each terminal only sees its own messages during the session, but if you resume that session later, you'll see everything interleaved. For parallel work from the same starting point, use `--fork-session` to give each terminal its own clean session.

121 

122### The context window

123 

124Claude's context window holds your conversation history, file contents, command outputs, [CLAUDE.md](/en/memory), loaded skills, and system instructions. As you work, context fills up. Claude compacts automatically, but instructions from early in the conversation can get lost. Put persistent rules in CLAUDE.md, and run `/context` to see what's using space.

125 

126#### When context fills up

127 

128Claude Code manages context automatically as you approach the limit. It clears older tool outputs first, then summarizes the conversation if needed. Your requests and key code snippets are preserved; detailed instructions from early in the conversation may be lost. Put persistent rules in CLAUDE.md rather than relying on conversation history.

129 

130To control what's preserved during compaction, add a "Compact Instructions" section to CLAUDE.md or run `/compact` with a focus (like `/compact focus on the API changes`).

131 

132Run `/context` to see what's using space. MCP servers add tool definitions to every request, so a few servers can consume significant context before you start working. Run `/mcp` to check per-server costs.

133 

134#### Manage context with skills and subagents

135 

136Beyond compaction, you can use other features to control what loads into context.

137 

138[Skills](/en/skills) load on demand. Claude sees skill descriptions at session start, but the full content only loads when a skill is used. For skills you invoke manually, set `disable-model-invocation: true` to keep descriptions out of context until you need them.

139 

140[Subagents](/en/sub-agents) get their own fresh context, completely separate from your main conversation. Their work doesn't bloat your context. When done, they return a summary. This isolation is why subagents help with long sessions.

141 

142See [context costs](/en/features-overview#understand-context-costs) for what each feature costs, and [reduce token usage](/en/costs#reduce-token-usage) for tips on managing context.

143 

144## Stay safe with checkpoints and permissions

145 

146Claude has two safety mechanisms: checkpoints let you undo file changes, and permissions control what Claude can do without asking.

147 

148### Undo changes with checkpoints

149 

150**Every file edit is reversible.** Before Claude edits any file, it snapshots the current contents. If something goes wrong, press `Esc` twice to rewind to a previous state, or ask Claude to undo.

151 

152Checkpoints are local to your session, separate from git. They only cover file changes. Actions that affect remote systems (databases, APIs, deployments) can't be checkpointed, which is why Claude asks before running commands with external side effects.

153 

154### Control what Claude can do

155 

156Press `Shift+Tab` to cycle through permission modes:

157 

158* **Default**: Claude asks before file edits and shell commands

159* **Auto-accept edits**: Claude edits files without asking, still asks for commands

160* **Plan mode**: Claude uses read-only tools only, creating a plan you can approve before execution

161 

162You can also allow specific commands in `.claude/settings.json` so Claude doesn't ask each time. This is useful for trusted commands like `npm test` or `git status`. Settings can be scoped from organization-wide policies down to personal preferences. See [Permissions](/en/permissions) for details.

163 

164***

165 

166## Work effectively with Claude Code

167 

168These tips help you get better results from Claude Code.

169 

170### Ask Claude Code for help

171 

172Claude Code can teach you how to use it. Ask questions like "how do I set up hooks?" or "what's the best way to structure my CLAUDE.md?" and Claude will explain.

173 

174Built-in commands also guide you through setup:

175 

176* `/init` walks you through creating a CLAUDE.md for your project

177* `/agents` helps you configure custom subagents

178* `/doctor` diagnoses common issues with your installation

179 

180### It's a conversation

181 

182Claude Code is conversational. You don't need perfect prompts. Start with what you want, then refine:

183 

184```

185> Fix the login bug

186 

187[Claude investigates, tries something]

188 

189> That's not quite right. The issue is in the session handling.

190 

191[Claude adjusts approach]

192```

193 

194When the first attempt isn't right, you don't start over. You iterate.

195 

196#### Interrupt and steer

197 

198You can interrupt Claude at any point. If it's going down the wrong path, just type your correction and press Enter. Claude will stop what it's doing and adjust its approach based on your input. You don't have to wait for it to finish or start over.

199 

200### Be specific upfront

201 

202The more precise your initial prompt, the fewer corrections you'll need. Reference specific files, mention constraints, and point to example patterns.

203 

204```

205> The checkout flow is broken for users with expired cards.

206> Check src/payments/ for the issue, especially token refresh.

207> Write a failing test first, then fix it.

208```

209 

210Vague prompts like "fix the login bug" work, but you'll spend more time steering. Specific prompts like the above often succeed on the first attempt.

211 

212### Give Claude something to verify against

213 

214Claude performs better when it can check its own work. Include test cases, paste screenshots of expected UI, or define the output you want.

215 

216```

217> Implement validateEmail. Test cases: 'user@example.com' → true,

218> 'invalid' → false, 'user@.com' → false. Run the tests after.

219```

220 

221For visual work, paste a screenshot of the design and ask Claude to compare its implementation against it.

222 

223### Explore before implementing

224 

225For complex problems, separate research from coding. Use plan mode (`Shift+Tab` twice) to analyze the codebase first:

226 

227```

228> Read src/auth/ and understand how we handle sessions.

229> Then create a plan for adding OAuth support.

230```

231 

232Review the plan, refine it through conversation, then let Claude implement. This two-phase approach produces better results than jumping straight to code.

233 

234### Delegate, don't dictate

235 

236Think of delegating to a capable colleague. Give context and direction, then trust Claude to figure out the details:

237 

238```

239> The checkout flow is broken for users with expired cards.

240> The relevant code is in src/payments/. Can you investigate and fix it?

241```

242 

243You don't need to specify which files to read or what commands to run. Claude figures that out.

244 

245## What's next

246 

247<CardGroup cols={2}>

248 <Card title="Extend with features" icon="puzzle-piece" href="/en/features-overview">

249 Add Skills, MCP connections, and custom commands

250 </Card>

251 

252 <Card title="Common workflows" icon="graduation-cap" href="/en/common-workflows">

253 Step-by-step guides for typical tasks

254 </Card>

255</CardGroup>

iam.md +0 −200 deleted

File DeletedView Diff

1# Identity and Access Management

2 

3> Learn how to configure user authentication, authorization, and access controls for Claude Code in your organization.

4 

5## Authentication methods

6 

7Setting up Claude Code requires access to Anthropic models. For teams, you can set up Claude Code access in one of three ways:

8 

9* Claude API via the Claude Console

10* Amazon Bedrock

11* Google Vertex AI

12 

13### Claude API authentication

14 

15**To set up Claude Code access for your team via Claude API:**

16 

171. Use your existing Claude Console account or create a new Claude Console account

182. You can add users through either method below:

19 * Bulk invite users from within the Console (Console -> Settings -> Members -> Invite)

20 * [Set up SSO](https://support.claude.com/en/articles/10280258-setting-up-single-sign-on-on-the-api-console)

213. When inviting users, they need one of the following roles:

22 * "Claude Code" role means users can only create Claude Code API keys

23 * "Developer" role means users can create any kind of API key

244. Each invited user needs to complete these steps:

25 * Accept the Console invite

26 * [Check system requirements](/en/docs/claude-code/setup#system-requirements)

27 * [Install Claude Code](/en/docs/claude-code/setup#installation)

28 * Login with Console account credentials

29 

30### Cloud provider authentication

31 

32**To set up Claude Code access for your team via Bedrock or Vertex:**

33 

341. Follow the [Bedrock docs](/en/docs/claude-code/amazon-bedrock) or [Vertex docs](/en/docs/claude-code/google-vertex-ai)

352. Distribute the environment variables and instructions for generating cloud credentials to your users. Read more about how to [manage configuration here](/en/docs/claude-code/settings).

363. Users can [install Claude Code](/en/docs/claude-code/setup#installation)

37 

38## Access control and permissions

39 

40We support fine-grained permissions so that you're able to specify exactly what the agent is allowed to do (e.g. run tests, run linter) and what it is not allowed to do (e.g. update cloud infrastructure). These permission settings can be checked into version control and distributed to all developers in your organization, as well as customized by individual developers.

41 

42### Permission system

43 

44Claude Code uses a tiered permission system to balance power and safety:

45 

46| Tool Type | Example | Approval Required | "Yes, don't ask again" Behavior |

47| :---------------- | :------------------- | :---------------- | :-------------------------------------------- |

48| Read-only | File reads, LS, Grep | No | N/A |

49| Bash Commands | Shell execution | Yes | Permanently per project directory and command |

50| File Modification | Edit/write files | Yes | Until session end |

51 

52### Configuring permissions

53 

54You can view & manage Claude Code's tool permissions with `/permissions`. This UI lists all permission rules and the settings.json file they are sourced from.

55 

56* **Allow** rules will allow Claude Code to use the specified tool without further manual approval.

57* **Ask** rules will ask the user for confirmation whenever Claude Code tries to use the specified tool. Ask rules take precedence over allow rules.

58* **Deny** rules will prevent Claude Code from using the specified tool. Deny rules take precedence over allow and ask rules.

59* **Additional directories** extend Claude's file access to directories beyond the initial working directory.

60* **Default mode** controls Claude's permission behavior when encountering new requests.

61 

62Permission rules use the format: `Tool` or `Tool(optional-specifier)`

63 

64A rule that is just the tool name matches any use of that tool. For example, adding `Bash` to the list of allow rules would allow Claude Code to use the Bash tool without requiring user approval.

65 

66#### Permission modes

67 

68Claude Code supports several permission modes that can be set as the `defaultMode` in [settings files](/en/docs/claude-code/settings#settings-files):

69 

70| Mode | Description |

71| :------------------ | :--------------------------------------------------------------------------- |

72| `default` | Standard behavior - prompts for permission on first use of each tool |

73| `acceptEdits` | Automatically accepts file edit permissions for the session |

74| `plan` | Plan Mode - Claude can analyze but not modify files or execute commands |

75| `bypassPermissions` | Skips all permission prompts (requires safe environment - see warning below) |

76 

77#### Working directories

78 

79By default, Claude has access to files in the directory where it was launched. You can extend this access:

80 

81* **During startup**: Use `--add-dir <path>` CLI argument

82* **During session**: Use `/add-dir` slash command

83* **Persistent configuration**: Add to `additionalDirectories` in [settings files](/en/docs/claude-code/settings#settings-files)

84 

85Files in additional directories follow the same permission rules as the original working directory - they become readable without prompts, and file editing permissions follow the current permission mode.

86 

87#### Tool-specific permission rules

88 

89Some tools support more fine-grained permission controls:

90 

91**Bash**

92 

93* `Bash(npm run build)` Matches the exact Bash command `npm run build`

94* `Bash(npm run test:*)` Matches Bash commands starting with `npm run test`

95* `Bash(curl http://site.com/:*)` Matches curl commands that start with exactly `curl http://site.com/`

96 

97<Tip>

98 Claude Code is aware of shell operators (like `&&`) so a prefix match rule like `Bash(safe-cmd:*)` won't give it permission to run the command `safe-cmd && other-cmd`

99</Tip>

100 

101<Warning>

102 Important limitations of Bash permission patterns:

103 

104 1. This tool uses **prefix matches**, not regex or glob patterns

105 2. The wildcard `:*` only works at the end of a pattern to match any continuation

106 3. Patterns like `Bash(curl http://github.com/:*)` can be bypassed in many ways:

107 * Options before URL: `curl -X GET http://github.com/...` won't match

108 * Different protocol: `curl https://github.com/...` won't match

109 * Redirects: `curl -L http://bit.ly/xyz` (redirects to github)

110 * Variables: `URL=http://github.com && curl $URL` won't match

111 * Extra spaces: `curl http://github.com` won't match

112 

113 For more reliable URL filtering, consider:

114 

115 * Using the WebFetch tool with `WebFetch(domain:github.com)` permission

116 * Instructing Claude Code about your allowed curl patterns via CLAUDE.md

117 * Using hooks for custom permission validation

118</Warning>

119 

120**Read & Edit**

121 

122`Edit` rules apply to all built-in tools that edit files. Claude will make a best-effort attempt to apply `Read` rules to all built-in tools that read files like Grep, Glob, and LS.

123 

124Read & Edit rules both follow the [gitignore](https://git-scm.com/docs/gitignore) specification with four distinct pattern types:

125 

126| Pattern | Meaning | Example | Matches |

127| ------------------ | -------------------------------------- | -------------------------------- | ---------------------------------- |

128| `//path` | **Absolute** path from filesystem root | `Read(//Users/alice/secrets/**)` | `/Users/alice/secrets/**` |

129| `~/path` | Path from **home** directory | `Read(~/Documents/*.pdf)` | `/Users/alice/Documents/*.pdf` |

130| `/path` | Path **relative to settings file** | `Edit(/src/**/*.ts)` | `<settings file path>/src/**/*.ts` |

131| `path` or `./path` | Path **relative to current directory** | `Read(*.env)` | `<cwd>/*.env` |

132 

133<Warning>

134 A pattern like `/Users/alice/file` is NOT an absolute path - it's relative to your settings file! Use `//Users/alice/file` for absolute paths.

135</Warning>

136 

137* `Edit(/docs/**)` - Edits in `<project>/docs/` (NOT `/docs/`!)

138* `Read(~/.zshrc)` - Reads your home directory's `.zshrc`

139* `Edit(//tmp/scratch.txt)` - Edits the absolute path `/tmp/scratch.txt`

140* `Read(src/**)` - Reads from `<current-directory>/src/`

141 

142**WebFetch**

143 

144* `WebFetch(domain:example.com)` Matches fetch requests to example.com

145 

146**MCP**

147 

148* `mcp__puppeteer` Matches any tool provided by the `puppeteer` server (name configured in Claude Code)

149* `mcp__puppeteer__puppeteer_navigate` Matches the `puppeteer_navigate` tool provided by the `puppeteer` server

150 

151<Warning>

152 Unlike other permission types, MCP permissions do NOT support wildcards (`*`).

153 

154 To approve all tools from an MCP server:

155 

156 * ✅ Use: `mcp__github` (approves ALL GitHub tools)

157 * ❌ Don't use: `mcp__github__*` (wildcards are not supported)

158 

159 To approve specific tools only, list each one:

160 

161 * ✅ Use: `mcp__github__get_issue`

162 * ✅ Use: `mcp__github__list_issues`

163</Warning>

164 

165### Additional permission control with hooks

166 

167[Claude Code hooks](/en/docs/claude-code/hooks-guide) provide a way to register custom shell commands to perform permission evaluation at runtime. When Claude Code makes a tool call, PreToolUse hooks run before the permission system runs, and the hook output can determine whether to approve or deny the tool call in place of the permission system.

168 

169### Enterprise managed policy settings

170 

171For enterprise deployments of Claude Code, we support enterprise managed policy settings that take precedence over user and project settings. This allows system administrators to enforce security policies that users cannot override.

172 

173System administrators can deploy policies to:

174 

175* macOS: `/Library/Application Support/ClaudeCode/managed-settings.json`

176* Linux and WSL: `/etc/claude-code/managed-settings.json`

177* Windows: `C:\ProgramData\ClaudeCode\managed-settings.json`

178 

179These policy files follow the same format as regular [settings files](/en/docs/claude-code/settings#settings-files) but cannot be overridden by user or project settings. This ensures consistent security policies across your organization.

180 

181### Settings precedence

182 

183When multiple settings sources exist, they are applied in the following order (highest to lowest precedence):

184 

1851. Enterprise policies

1862. Command line arguments

1873. Local project settings (`.claude/settings.local.json`)

1884. Shared project settings (`.claude/settings.json`)

1895. User settings (`~/.claude/settings.json`)

190 

191This hierarchy ensures that organizational policies are always enforced while still allowing flexibility at the project and user levels where appropriate.

192 

193## Credential management

194 

195Claude Code securely manages your authentication credentials:

196 

197* **Storage location**: On macOS, API keys, OAuth tokens, and other credentials are stored in the encrypted macOS Keychain.

198* **Supported authentication types**: Claude.ai credentials, Claude API credentials, Bedrock Auth, and Vertex Auth.

199* **Custom credential scripts**: The [`apiKeyHelper`](/en/docs/claude-code/settings#available-settings) setting can be configured to run a shell script that returns an API key.

200* **Refresh intervals**: By default, `apiKeyHelper` is called after 5 minutes or on HTTP 401 response. Set `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` environment variable for custom refresh intervals.

interactive-mode.md +177 −18

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Interactive mode5# Interactive mode

2 6 

3> Complete reference for keyboard shortcuts, input modes, and interactive features in Claude Code sessions.7> Complete reference for keyboard shortcuts, input modes, and interactive features in Claude Code sessions.


6 10 

7<Note>11<Note>

8 Keyboard shortcuts may vary by platform and terminal. Press `?` to see available shortcuts for your environment.12 Keyboard shortcuts may vary by platform and terminal. Press `?` to see available shortcuts for your environment.

13 

14 **macOS users**: Option/Alt key shortcuts (`Alt+B`, `Alt+F`, `Alt+Y`, `Alt+M`, `Alt+P`) require configuring Option as Meta in your terminal:

15 

16 * **iTerm2**: Settings → Profiles → Keys → Set Left/Right Option key to "Esc+"

17 * **Terminal.app**: Settings → Profiles → Keyboard → Check "Use Option as Meta Key"

18 * **VS Code**: Settings → Profiles → Keys → Set Left/Right Option key to "Esc+"

19 

20 See [Terminal configuration](/en/terminal-config) for details.

9</Note>21</Note>

10 22 

11### General controls23### General controls

12 24 

13| Shortcut | Description | Context |25| Shortcut | Description | Context |

14| :------------------------------------------- | :----------------------------------------------------------------------- | :---------------------------------------------------------- |26| :------------------------------------------------ | :------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------- |

15| `Ctrl+C` | Cancel current input or generation | Standard interrupt |27| `Ctrl+C` | Cancel current input or generation | Standard interrupt |

28| `Ctrl+F` | Kill all background agents. Press twice within 3 seconds to confirm | Background agent control |

16| `Ctrl+D` | Exit Claude Code session | EOF signal |29| `Ctrl+D` | Exit Claude Code session | EOF signal |

30| `Ctrl+G` | Open in default text editor | Edit your prompt or custom response in your default text editor |

17| `Ctrl+L` | Clear terminal screen | Keeps conversation history |31| `Ctrl+L` | Clear terminal screen | Keeps conversation history |

18| `Ctrl+O` | Toggle verbose output | Shows detailed tool usage and execution |32| `Ctrl+O` | Toggle verbose output | Shows detailed tool usage and execution |

19| `Ctrl+R` | Reverse search command history | Search through previous commands interactively |33| `Ctrl+R` | Reverse search command history | Search through previous commands interactively |

20| `Ctrl+V` (macOS/Linux) or `Alt+V` (Windows) | Paste image from clipboard | Pastes an image or path to an image file |34| `Ctrl+V` or `Cmd+V` (iTerm2) or `Alt+V` (Windows) | Paste image from clipboard | Pastes an image or path to an image file |

35| `Ctrl+B` | Background running tasks | Backgrounds bash commands and agents. Tmux users press twice |

36| `Ctrl+T` | Toggle task list | Show or hide the [task list](#task-list) in the terminal status area |

37| `Left/Right arrows` | Cycle through dialog tabs | Navigate between tabs in permission dialogs and menus |

21| `Up/Down arrows` | Navigate command history | Recall previous inputs |38| `Up/Down arrows` | Navigate command history | Recall previous inputs |

22| `Esc` + `Esc` | Rewind the code/conversation | Restore the code and/or conversation to a previous point |39| `Esc` + `Esc` | Rewind or summarize | Restore code and/or conversation to a previous point, or summarize from a selected message |

23| `Tab` | Toggle [extended thinking](/en/docs/build-with-claude/extended-thinking) | Switch between Thinking on and Thinking off |40| `Shift+Tab` or `Alt+M` (some configurations) | Toggle permission modes | Switch between Auto-Accept Mode, Plan Mode, and normal mode. |

24| `Shift+Tab` or `Alt+M` (some configurations) | Toggle permission modes | Switch between Auto-Accept Mode, Plan Mode, and normal mode |41| `Option+P` (macOS) or `Alt+P` (Windows/Linux) | Switch model | Switch models without clearing your prompt |

42| `Option+T` (macOS) or `Alt+T` (Windows/Linux) | Toggle extended thinking | Enable or disable extended thinking mode. Run `/terminal-setup` first to enable this shortcut |

43 

44### Text editing

45 

46| Shortcut | Description | Context |

47| :----------------------- | :--------------------------- | :------------------------------------------------------------------------------------------------------------ |

48| `Ctrl+K` | Delete to end of line | Stores deleted text for pasting |

49| `Ctrl+U` | Delete entire line | Stores deleted text for pasting |

50| `Ctrl+Y` | Paste deleted text | Paste text deleted with `Ctrl+K` or `Ctrl+U` |

51| `Alt+Y` (after `Ctrl+Y`) | Cycle paste history | After pasting, cycle through previously deleted text. Requires [Option as Meta](#keyboard-shortcuts) on macOS |

52| `Alt+B` | Move cursor back one word | Word navigation. Requires [Option as Meta](#keyboard-shortcuts) on macOS |

53| `Alt+F` | Move cursor forward one word | Word navigation. Requires [Option as Meta](#keyboard-shortcuts) on macOS |

54 

55### Theme and display

56 

57| Shortcut | Description | Context |

58| :------- | :----------------------------------------- | :----------------------------------------------------------------------------------------------------------- |

59| `Ctrl+T` | Toggle syntax highlighting for code blocks | Only works inside the `/theme` picker menu. Controls whether code in Claude's responses uses syntax coloring |

60 

61<Note>

62 Syntax highlighting is only available in the native build of Claude Code.

63</Note>

25 64 

26### Multiline input65### Multiline input

27 66 

28| Method | Shortcut | Context |67| Method | Shortcut | Context |

29| :--------------- | :------------- | :-------------------------------- |68| :--------------- | :------------- | :------------------------------------------------------ |

30| Quick escape | `\` + `Enter` | Works in all terminals |69| Quick escape | `\` + `Enter` | Works in all terminals |

31| macOS default | `Option+Enter` | Default on macOS |70| macOS default | `Option+Enter` | Default on macOS |

32| Terminal setup | `Shift+Enter` | After `/terminal-setup` |71| Shift+Enter | `Shift+Enter` | Works out of the box in iTerm2, WezTerm, Ghostty, Kitty |

33| Control sequence | `Ctrl+J` | Line feed character for multiline |72| Control sequence | `Ctrl+J` | Line feed character for multiline |

34| Paste mode | Paste directly | For code blocks, logs |73| Paste mode | Paste directly | For code blocks, logs |

35 74 

36<Tip>75<Tip>

37 Configure your preferred line break behavior in terminal settings. Run `/terminal-setup` to install Shift+Enter binding for iTerm2 and VS Code terminals.76 Shift+Enter works without configuration in iTerm2, WezTerm, Ghostty, and Kitty. For other terminals (VS Code, Alacritty, Zed, Warp), run `/terminal-setup` to install the binding.

38</Tip>77</Tip>

39 78 

40### Quick commands79### Quick commands

41 80 

42| Shortcut | Description | Notes |81| Shortcut | Description | Notes |

43| :----------- | :--------------------------------- | :------------------------------------------------------------ |82| :----------- | :---------------- | :------------------------------------------------------------------- |

44| `#` at start | Memory shortcut - add to CLAUDE.md | Prompts for file selection |83| `/` at start | Command or skill | See [built-in commands](#built-in-commands) and [skills](/en/skills) |

45| `/` at start | Slash command | See [slash commands](/en/docs/claude-code/slash-commands) |

46| `!` at start | Bash mode | Run commands directly and add execution output to the session |84| `!` at start | Bash mode | Run commands directly and add execution output to the session |

47| `@` | File path mention | Trigger file path autocomplete |85| `@` | File path mention | Trigger file path autocomplete |

48 86 

87## Built-in commands

88 

89Built-in commands are shortcuts for common actions. The table below covers commonly used commands but not all available options. Type `/` in Claude Code to see the full list, or type `/` followed by any letters to filter.

90 

91To create your own commands you can invoke with `/`, see [skills](/en/skills).

92 

93| Command | Purpose |

94| :------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

95| `/clear` | Clear conversation history |

96| `/compact [instructions]` | Compact conversation with optional focus instructions |

97| `/config` | Open the Settings interface (Config tab) |

98| `/context` | Visualize current context usage as a colored grid |

99| `/cost` | Show token usage statistics. See [cost tracking guide](/en/costs#using-the-cost-command) for subscription-specific details. |

100| `/debug [description]` | Troubleshoot the current session by reading the session debug log. Optionally describe the issue |

101| `/doctor` | Checks the health of your Claude Code installation |

102| `/exit` | Exit the REPL |

103| `/export [filename]` | Export the current conversation to a file or clipboard |

104| `/help` | Get usage help |

105| `/init` | Initialize project with `CLAUDE.md` guide |

106| `/mcp` | Manage MCP server connections and OAuth authentication |

107| `/memory` | Edit `CLAUDE.md` memory files |

108| `/model` | Select or change the AI model. With Opus 4.6, use left/right arrows to [adjust effort level](/en/model-config#adjust-effort-level). The change takes effect immediately without waiting for the current response to finish |

109| `/permissions` | View or update [permissions](/en/permissions#manage-permissions) |

110| `/plan` | Enter plan mode directly from the prompt |

111| `/rename <name>` | Rename the current session for easier identification |

112| `/resume [session]` | Resume a conversation by ID or name, or open the session picker |

113| `/rewind` | Rewind the conversation and/or code, or summarize from a selected message |

114| `/stats` | Visualize daily usage, session history, streaks, and model preferences |

115| `/status` | Open the Settings interface (Status tab) showing version, model, account, and connectivity |

116| `/statusline` | Set up Claude Code's status line UI |

117| `/copy` | Copy the last assistant response to clipboard |

118| `/tasks` | List and manage background tasks |

119| `/teleport` | Resume a remote session from claude.ai (subscribers only) |

120| `/desktop` | Hand off the current CLI session to the Claude Code Desktop app (macOS and Windows only) |

121| `/theme` | Change the color theme |

122| `/todos` | List current TODO items |

123| `/usage` | For subscription plans only: show plan usage limits and rate limit status |

124 

125### MCP prompts

126 

127MCP servers can expose prompts that appear as commands. These use the format `/mcp__<server>__<prompt>` and are dynamically discovered from connected servers. See [MCP prompts](/en/mcp#use-mcp-prompts-as-commands) for details.

128 

49## Vim editor mode129## Vim editor mode

50 130 

51Enable vim-style editing with `/vim` command or configure permanently via `/config`.131Enable vim-style editing with `/vim` command or configure permanently via `/config`.


65### Navigation (NORMAL mode)145### Navigation (NORMAL mode)

66 146 

67| Command | Action |147| Command | Action |

68| :-------------- | :------------------------ |148| :-------------- | :-------------------------------------------------- |

69| `h`/`j`/`k`/`l` | Move left/down/up/right |149| `h`/`j`/`k`/`l` | Move left/down/up/right |

70| `w` | Next word |150| `w` | Next word |

71| `e` | End of word |151| `e` | End of word |


75| `^` | First non-blank character |155| `^` | First non-blank character |

76| `gg` | Beginning of input |156| `gg` | Beginning of input |

77| `G` | End of input |157| `G` | End of input |

158| `f{char}` | Jump to next occurrence of character |

159| `F{char}` | Jump to previous occurrence of character |

160| `t{char}` | Jump to just before next occurrence of character |

161| `T{char}` | Jump to just after previous occurrence of character |

162| `;` | Repeat last f/F/t/T motion |

163| `,` | Repeat last f/F/t/T motion in reverse |

164 

165<Note>

166 In vim normal mode, if the cursor is at the beginning or end of input and cannot move further, the arrow keys navigate command history instead.

167</Note>

78 168 

79### Editing (NORMAL mode)169### Editing (NORMAL mode)

80 170 


87| `cc` | Change line |177| `cc` | Change line |

88| `C` | Change to end of line |178| `C` | Change to end of line |

89| `cw`/`ce`/`cb` | Change word/to end/back |179| `cw`/`ce`/`cb` | Change word/to end/back |

180| `yy`/`Y` | Yank (copy) line |

181| `yw`/`ye`/`yb` | Yank word/to end/back |

182| `p` | Paste after cursor |

183| `P` | Paste before cursor |

184| `>>` | Indent line |

185| `<<` | Dedent line |

186| `J` | Join lines |

90| `.` | Repeat last change |187| `.` | Repeat last change |

91 188 

189### Text objects (NORMAL mode)

190 

191Text objects work with operators like `d`, `c`, and `y`:

192 

193| Command | Action |

194| :-------- | :--------------------------------------- |

195| `iw`/`aw` | Inner/around word |

196| `iW`/`aW` | Inner/around WORD (whitespace-delimited) |

197| `i"`/`a"` | Inner/around double quotes |

198| `i'`/`a'` | Inner/around single quotes |

199| `i(`/`a(` | Inner/around parentheses |

200| `i[`/`a[` | Inner/around brackets |

201| `i{`/`a{` | Inner/around braces |

202 

92## Command history203## Command history

93 204 

94Claude Code maintains command history for the current session:205Claude Code maintains command history for the current session:


129 240 

130**Key features:**241**Key features:**

131 242 

132* Output is buffered and Claude can retrieve it using the BashOutput tool243* Output is buffered and Claude can retrieve it using the TaskOutput tool

133* Background tasks have unique IDs for tracking and output retrieval244* Background tasks have unique IDs for tracking and output retrieval

134* Background tasks are automatically cleaned up when Claude Code exits245* Background tasks are automatically cleaned up when Claude Code exits

135 246 

247To disable all background task functionality, set the `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` environment variable to `1`. See [Environment variables](/en/settings#environment-variables) for details.

248 

136**Common backgrounded commands:**249**Common backgrounded commands:**

137 250 

138* Build tools (webpack, vite, make)251* Build tools (webpack, vite, make)


157* Shows real-time progress and output270* Shows real-time progress and output

158* Supports the same `Ctrl+B` backgrounding for long-running commands271* Supports the same `Ctrl+B` backgrounding for long-running commands

159* Does not require Claude to interpret or approve the command272* Does not require Claude to interpret or approve the command

273* Supports history-based autocomplete: type a partial command and press **Tab** to complete from previous `!` commands in the current project

160 274 

161This is useful for quick shell operations while maintaining conversation context.275This is useful for quick shell operations while maintaining conversation context.

162 276 

277## Prompt suggestions

278 

279When you first open a session, a grayed-out example command appears in the prompt input to help you get started. Claude Code picks this from your project's git history, so it reflects files you've been working on recently.

280 

281After Claude responds, suggestions continue to appear based on your conversation history, such as a follow-up step from a multi-part request or a natural continuation of your workflow.

282 

283* Press **Tab** to accept the suggestion, or press **Enter** to accept and submit

284* Start typing to dismiss it

285 

286The suggestion runs as a background request that reuses the parent conversation's prompt cache, so the additional cost is minimal. Claude Code skips suggestion generation when the cache is cold to avoid unnecessary cost.

287 

288Suggestions are automatically skipped after the first turn of a conversation, in non-interactive mode, and in plan mode.

289 

290To disable prompt suggestions entirely, set the environment variable or toggle the setting in `/config`:

291 

292```bash theme={null}

293export CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=false

294```

295 

296## Task list

297 

298When working on complex, multi-step work, Claude creates a task list to track progress. Tasks appear in the status area of your terminal with indicators showing what's pending, in progress, or complete.

299 

300* Press `Ctrl+T` to toggle the task list view. The display shows up to 10 tasks at a time

301* To see all tasks or clear them, ask Claude directly: "show me all tasks" or "clear all tasks"

302* Tasks persist across context compactions, helping Claude stay organized on larger projects

303* To share a task list across sessions, set `CLAUDE_CODE_TASK_LIST_ID` to use a named directory in `~/.claude/tasks/`: `CLAUDE_CODE_TASK_LIST_ID=my-project claude`

304* To revert to the previous TODO list, set `CLAUDE_CODE_ENABLE_TASKS=false`.

305 

306## PR review status

307 

308When working on a branch with an open pull request, Claude Code displays a clickable PR link in the footer (for example, "PR #446"). The link has a colored underline indicating the review state:

309 

310* Green: approved

311* Yellow: pending review

312* Red: changes requested

313* Gray: draft

314* Purple: merged

315 

316`Cmd+click` (Mac) or `Ctrl+click` (Windows/Linux) the link to open the pull request in your browser. The status updates automatically every 60 seconds.

317 

318<Note>

319 PR status requires the `gh` CLI to be installed and authenticated (`gh auth login`).

320</Note>

321 

163## See also322## See also

164 323 

165* [Slash commands](/en/docs/claude-code/slash-commands) - Interactive session commands324* [Skills](/en/skills) - Custom prompts and workflows

166* [Checkpointing](/en/docs/claude-code/checkpointing) - Rewind Claude's edits and restore previous states325* [Checkpointing](/en/checkpointing) - Rewind Claude's edits and restore previous states

167* [CLI reference](/en/docs/claude-code/cli-reference) - Command-line flags and options326* [CLI reference](/en/cli-reference) - Command-line flags and options

168* [Settings](/en/docs/claude-code/settings) - Configuration options327* [Settings](/en/settings) - Configuration options

169* [Memory management](/en/docs/claude-code/memory) - Managing CLAUDE.md files328* [Memory management](/en/memory) - Managing CLAUDE.md files

jetbrains.md +11 −9

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# JetBrains IDEs5# JetBrains IDEs

2 6 

3> Use Claude Code with JetBrains IDEs including IntelliJ, PyCharm, WebStorm, and more7> Use Claude Code with JetBrains IDEs including IntelliJ, PyCharm, WebStorm, and more


20* **Quick launch**: Use `Cmd+Esc` (Mac) or `Ctrl+Esc` (Windows/Linux) to open Claude Code directly from your editor, or click the Claude Code button in the UI24* **Quick launch**: Use `Cmd+Esc` (Mac) or `Ctrl+Esc` (Windows/Linux) to open Claude Code directly from your editor, or click the Claude Code button in the UI

21* **Diff viewing**: Code changes can be displayed directly in the IDE diff viewer instead of the terminal25* **Diff viewing**: Code changes can be displayed directly in the IDE diff viewer instead of the terminal

22* **Selection context**: The current selection/tab in the IDE is automatically shared with Claude Code26* **Selection context**: The current selection/tab in the IDE is automatically shared with Claude Code

23* **File reference shortcuts**: Use `Cmd+Option+K` (Mac) or `Alt+Ctrl+K` (Linux/Windows) to insert file references (e.g., @File#L1-99)27* **File reference shortcuts**: Use `Cmd+Option+K` (Mac) or `Alt+Ctrl+K` (Linux/Windows) to insert file references (for example, @File#L1-99)

24* **Diagnostic sharing**: Diagnostic errors (lint, syntax, etc.) from the IDE are automatically shared with Claude as you work28* **Diagnostic sharing**: Diagnostic errors (lint, syntax, etc.) from the IDE are automatically shared with Claude as you work

25 29 

26## Installation30## Installation


29 33 

30Find and install the [Claude Code plugin](https://plugins.jetbrains.com/plugin/27310-claude-code-beta-) from the JetBrains marketplace and restart your IDE.34Find and install the [Claude Code plugin](https://plugins.jetbrains.com/plugin/27310-claude-code-beta-) from the JetBrains marketplace and restart your IDE.

31 35 

32### Auto-Installation36If you haven't installed Claude Code yet, see [our quickstart guide](/en/quickstart) for installation instructions.

33 

34The plugin may also be auto-installed when you run `claude` in the integrated terminal. The IDE must be restarted completely to take effect.

35 37 

36<Note>38<Note>

37 After installing the plugin, you must restart your IDE completely for it to take effect. You may need to restart multiple times.39 After installing the plugin, you may need to restart your IDE completely for it to take effect.

38</Note>40</Note>

39 41 

40## Usage42## Usage


70 72 

71#### General Settings73#### General Settings

72 74 

73* **Claude command**: Specify a custom command to run Claude (e.g., `claude`, `/usr/local/bin/claude`, or `npx @anthropic/claude`)75* **Claude command**: Specify a custom command to run Claude (for example, `claude`, `/usr/local/bin/claude`, or `npx @anthropic/claude`)

74* **Suppress notification for Claude command not found**: Skip notifications about not finding the Claude command76* **Suppress notification for Claude command not found**: Skip notifications about not finding the Claude command

75* **Enable using Option+Enter for multi-line prompts** (macOS only): When enabled, Option+Enter inserts new lines in Claude Code prompts. Disable if experiencing issues with the Option key being captured unexpectedly (requires terminal restart)77* **Enable using Option+Enter for multi-line prompts** (macOS only): When enabled, Option+Enter inserts new lines in Claude Code prompts. Disable if experiencing issues with the Option key being captured unexpectedly (requires terminal restart)

76* **Enable automatic updates**: Automatically check for and install plugin updates (applied on restart)78* **Enable automatic updates**: Automatically check for and install plugin updates (applied on restart)


104### WSL Configuration106### WSL Configuration

105 107 

106<Warning>108<Warning>

107 WSL users may need additional configuration for IDE detection to work properly. See our [WSL troubleshooting guide](/en/docs/claude-code/troubleshooting#jetbrains-ide-not-detected-on-wsl2) for detailed setup instructions.109 WSL users may need additional configuration for IDE detection to work properly. See our [WSL troubleshooting guide](/en/troubleshooting#jetbrains-ide-not-detected-on-wsl2) for detailed setup instructions.

108</Warning>110</Warning>

109 111 

110WSL configuration may require:112WSL configuration may require:


127* Verify the plugin is installed and enabled129* Verify the plugin is installed and enabled

128* Restart the IDE completely130* Restart the IDE completely

129* Check that you're running Claude Code from the integrated terminal131* Check that you're running Claude Code from the integrated terminal

130* For WSL users, see the [WSL troubleshooting guide](/en/docs/claude-code/troubleshooting#jetbrains-ide-not-detected-on-wsl2)132* For WSL users, see the [WSL troubleshooting guide](/en/troubleshooting#jetbrains-ide-not-detected-on-wsl2)

131 133 

132### Command Not Found134### Command Not Found

133 135 


147* Taking extra care to ensure Claude is only used with trusted prompts149* Taking extra care to ensure Claude is only used with trusted prompts

148* Being aware of which files Claude Code has access to modify150* Being aware of which files Claude Code has access to modify

149 151 

150For additional help, see our [troubleshooting guide](/en/docs/claude-code/troubleshooting).152For additional help, see our [troubleshooting guide](/en/troubleshooting).

keybindings.md +381 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Customize keyboard shortcuts

6 

7> Customize keyboard shortcuts in Claude Code with a keybindings configuration file.

8 

9Claude Code supports customizable keyboard shortcuts. Run `/keybindings` to create or open your configuration file at `~/.claude/keybindings.json`.

10 

11## Configuration file

12 

13The keybindings configuration file is an object with a `bindings` array. Each block specifies a context and a map of keystrokes to actions.

14 

15<Note>Changes to the keybindings file are automatically detected and applied without restarting Claude Code.</Note>

16 

17| Field | Description |

18| :--------- | :------------------------------------------------- |

19| `$schema` | Optional JSON Schema URL for editor autocompletion |

20| `$docs` | Optional documentation URL |

21| `bindings` | Array of binding blocks by context |

22 

23This example binds `Ctrl+E` to open an external editor in the chat context, and unbinds `Ctrl+U`:

24 

25```json theme={null}

26{

27 "$schema": "https://www.schemastore.org/claude-code-keybindings.json",

28 "$docs": "https://code.claude.com/docs/en/keybindings",

29 "bindings": [

30 {

31 "context": "Chat",

32 "bindings": {

33 "ctrl+e": "chat:externalEditor",

34 "ctrl+u": null

35 }

36 }

37 ]

38}

39```

40 

41## Contexts

42 

43Each binding block specifies a **context** where the bindings apply:

44 

45| Context | Description |

46| :---------------- | :----------------------------------------------- |

47| `Global` | Applies everywhere in the app |

48| `Chat` | Main chat input area |

49| `Autocomplete` | Autocomplete menu is open |

50| `Settings` | Settings menu (escape-only dismiss) |

51| `Confirmation` | Permission and confirmation dialogs |

52| `Tabs` | Tab navigation components |

53| `Help` | Help menu is visible |

54| `Transcript` | Transcript viewer |

55| `HistorySearch` | History search mode (Ctrl+R) |

56| `Task` | Background task is running |

57| `ThemePicker` | Theme picker dialog |

58| `Attachments` | Image/attachment bar navigation |

59| `Footer` | Footer indicator navigation (tasks, teams, diff) |

60| `MessageSelector` | Rewind and summarize dialog message selection |

61| `DiffDialog` | Diff viewer navigation |

62| `ModelPicker` | Model picker effort level |

63| `Select` | Generic select/list components |

64| `Plugin` | Plugin dialog (browse, discover, manage) |

65 

66## Available actions

67 

68Actions follow a `namespace:action` format, such as `chat:submit` to send a message or `app:toggleTodos` to show the task list. Each context has specific actions available.

69 

70### App actions

71 

72Actions available in the `Global` context:

73 

74| Action | Default | Description |

75| :--------------------- | :------ | :-------------------------- |

76| `app:interrupt` | Ctrl+C | Cancel current operation |

77| `app:exit` | Ctrl+D | Exit Claude Code |

78| `app:toggleTodos` | Ctrl+T | Toggle task list visibility |

79| `app:toggleTranscript` | Ctrl+O | Toggle verbose transcript |

80 

81### History actions

82 

83Actions for navigating command history:

84 

85| Action | Default | Description |

86| :----------------- | :------ | :-------------------- |

87| `history:search` | Ctrl+R | Open history search |

88| `history:previous` | Up | Previous history item |

89| `history:next` | Down | Next history item |

90 

91### Chat actions

92 

93Actions available in the `Chat` context:

94 

95| Action | Default | Description |

96| :-------------------- | :------------------------ | :----------------------- |

97| `chat:cancel` | Escape | Cancel current input |

98| `chat:cycleMode` | Shift+Tab\* | Cycle permission modes |

99| `chat:modelPicker` | Cmd+P / Meta+P | Open model picker |

100| `chat:thinkingToggle` | Cmd+T / Meta+T | Toggle extended thinking |

101| `chat:submit` | Enter | Submit message |

102| `chat:undo` | Ctrl+\_ | Undo last action |

103| `chat:externalEditor` | Ctrl+G | Open in external editor |

104| `chat:stash` | Ctrl+S | Stash current prompt |

105| `chat:imagePaste` | Ctrl+V (Alt+V on Windows) | Paste image |

106 

107\*On Windows without VT mode (Node \<24.2.0/\<22.17.0, Bun \<1.2.23), defaults to Meta+M.

108 

109### Autocomplete actions

110 

111Actions available in the `Autocomplete` context:

112 

113| Action | Default | Description |

114| :---------------------- | :------ | :------------------ |

115| `autocomplete:accept` | Tab | Accept suggestion |

116| `autocomplete:dismiss` | Escape | Dismiss menu |

117| `autocomplete:previous` | Up | Previous suggestion |

118| `autocomplete:next` | Down | Next suggestion |

119 

120### Confirmation actions

121 

122Actions available in the `Confirmation` context:

123 

124| Action | Default | Description |

125| :-------------------------- | :-------- | :---------------------------- |

126| `confirm:yes` | Y, Enter | Confirm action |

127| `confirm:no` | N, Escape | Decline action |

128| `confirm:previous` | Up | Previous option |

129| `confirm:next` | Down | Next option |

130| `confirm:nextField` | Tab | Next field |

131| `confirm:previousField` | (unbound) | Previous field |

132| `confirm:cycleMode` | Shift+Tab | Cycle permission modes |

133| `confirm:toggleExplanation` | Ctrl+E | Toggle permission explanation |

134 

135### Permission actions

136 

137Actions available in the `Confirmation` context for permission dialogs:

138 

139| Action | Default | Description |

140| :----------------------- | :------ | :--------------------------- |

141| `permission:toggleDebug` | Ctrl+D | Toggle permission debug info |

142 

143### Transcript actions

144 

145Actions available in the `Transcript` context:

146 

147| Action | Default | Description |

148| :------------------------- | :------------- | :---------------------- |

149| `transcript:toggleShowAll` | Ctrl+E | Toggle show all content |

150| `transcript:exit` | Ctrl+C, Escape | Exit transcript view |

151 

152### History search actions

153 

154Actions available in the `HistorySearch` context:

155 

156| Action | Default | Description |

157| :---------------------- | :---------- | :----------------------- |

158| `historySearch:next` | Ctrl+R | Next match |

159| `historySearch:accept` | Escape, Tab | Accept selection |

160| `historySearch:cancel` | Ctrl+C | Cancel search |

161| `historySearch:execute` | Enter | Execute selected command |

162 

163### Task actions

164 

165Actions available in the `Task` context:

166 

167| Action | Default | Description |

168| :---------------- | :------ | :---------------------- |

169| `task:background` | Ctrl+B | Background current task |

170 

171### Theme actions

172 

173Actions available in the `ThemePicker` context:

174 

175| Action | Default | Description |

176| :------------------------------- | :------ | :------------------------- |

177| `theme:toggleSyntaxHighlighting` | Ctrl+T | Toggle syntax highlighting |

178 

179### Help actions

180 

181Actions available in the `Help` context:

182 

183| Action | Default | Description |

184| :------------- | :------ | :-------------- |

185| `help:dismiss` | Escape | Close help menu |

186 

187### Tabs actions

188 

189Actions available in the `Tabs` context:

190 

191| Action | Default | Description |

192| :-------------- | :-------------- | :----------- |

193| `tabs:next` | Tab, Right | Next tab |

194| `tabs:previous` | Shift+Tab, Left | Previous tab |

195 

196### Attachments actions

197 

198Actions available in the `Attachments` context:

199 

200| Action | Default | Description |

201| :--------------------- | :---------------- | :------------------------- |

202| `attachments:next` | Right | Next attachment |

203| `attachments:previous` | Left | Previous attachment |

204| `attachments:remove` | Backspace, Delete | Remove selected attachment |

205| `attachments:exit` | Down, Escape | Exit attachment bar |

206 

207### Footer actions

208 

209Actions available in the `Footer` context:

210 

211| Action | Default | Description |

212| :---------------------- | :------ | :------------------------ |

213| `footer:next` | Right | Next footer item |

214| `footer:previous` | Left | Previous footer item |

215| `footer:openSelected` | Enter | Open selected footer item |

216| `footer:clearSelection` | Escape | Clear footer selection |

217 

218### Message selector actions

219 

220Actions available in the `MessageSelector` context:

221 

222| Action | Default | Description |

223| :----------------------- | :---------------------------------------- | :---------------- |

224| `messageSelector:up` | Up, K | Move up in list |

225| `messageSelector:down` | Down, J | Move down in list |

226| `messageSelector:top` | Ctrl+Up, Shift+Up, Meta+Up, Shift+K | Jump to top |

227| `messageSelector:bottom` | Ctrl+Down, Shift+Down, Meta+Down, Shift+J | Jump to bottom |

228| `messageSelector:select` | Enter | Select message |

229 

230### Diff actions

231 

232Actions available in the `DiffDialog` context:

233 

234| Action | Default | Description |

235| :-------------------- | :----------------- | :--------------------- |

236| `diff:dismiss` | Escape | Close diff viewer |

237| `diff:previousSource` | Left | Previous diff source |

238| `diff:nextSource` | Right | Next diff source |

239| `diff:previousFile` | Up | Previous file in diff |

240| `diff:nextFile` | Down | Next file in diff |

241| `diff:viewDetails` | Enter | View diff details |

242| `diff:back` | (context-specific) | Go back in diff viewer |

243 

244### Model picker actions

245 

246Actions available in the `ModelPicker` context:

247 

248| Action | Default | Description |

249| :--------------------------- | :------ | :-------------------- |

250| `modelPicker:decreaseEffort` | Left | Decrease effort level |

251| `modelPicker:increaseEffort` | Right | Increase effort level |

252 

253### Select actions

254 

255Actions available in the `Select` context:

256 

257| Action | Default | Description |

258| :---------------- | :-------------- | :--------------- |

259| `select:next` | Down, J, Ctrl+N | Next option |

260| `select:previous` | Up, K, Ctrl+P | Previous option |

261| `select:accept` | Enter | Accept selection |

262| `select:cancel` | Escape | Cancel selection |

263 

264### Plugin actions

265 

266Actions available in the `Plugin` context:

267 

268| Action | Default | Description |

269| :--------------- | :------ | :----------------------- |

270| `plugin:toggle` | Space | Toggle plugin selection |

271| `plugin:install` | I | Install selected plugins |

272 

273### Settings actions

274 

275Actions available in the `Settings` context:

276 

277| Action | Default | Description |

278| :---------------- | :------ | :---------------------------------- |

279| `settings:search` | / | Enter search mode |

280| `settings:retry` | R | Retry loading usage data (on error) |

281 

282## Keystroke syntax

283 

284### Modifiers

285 

286Use modifier keys with the `+` separator:

287 

288* `ctrl` or `control` - Control key

289* `alt`, `opt`, or `option` - Alt/Option key

290* `shift` - Shift key

291* `meta`, `cmd`, or `command` - Meta/Command key

292 

293For example:

294 

295```

296ctrl+k Single key with modifier

297shift+tab Shift + Tab

298meta+p Command/Meta + P

299ctrl+shift+c Multiple modifiers

300```

301 

302### Uppercase letters

303 

304A standalone uppercase letter implies Shift. For example, `K` is equivalent to `shift+k`. This is useful for vim-style bindings where uppercase and lowercase keys have different meanings.

305 

306Uppercase letters with modifiers (e.g., `ctrl+K`) are treated as stylistic and do **not** imply Shift — `ctrl+K` is the same as `ctrl+k`.

307 

308### Chords

309 

310Chords are sequences of keystrokes separated by spaces:

311 

312```

313ctrl+k ctrl+s Press Ctrl+K, release, then Ctrl+S

314```

315 

316### Special keys

317 

318* `escape` or `esc` - Escape key

319* `enter` or `return` - Enter key

320* `tab` - Tab key

321* `space` - Space bar

322* `up`, `down`, `left`, `right` - Arrow keys

323* `backspace`, `delete` - Delete keys

324 

325## Unbind default shortcuts

326 

327Set an action to `null` to unbind a default shortcut:

328 

329```json theme={null}

330{

331 "bindings": [

332 {

333 "context": "Chat",

334 "bindings": {

335 "ctrl+s": null

336 }

337 }

338 ]

339}

340```

341 

342## Reserved shortcuts

343 

344These shortcuts cannot be rebound:

345 

346| Shortcut | Reason |

347| :------- | :------------------------- |

348| Ctrl+C | Hardcoded interrupt/cancel |

349| Ctrl+D | Hardcoded exit |

350 

351## Terminal conflicts

352 

353Some shortcuts may conflict with terminal multiplexers:

354 

355| Shortcut | Conflict |

356| :------- | :-------------------------------- |

357| Ctrl+B | tmux prefix (press twice to send) |

358| Ctrl+A | GNU screen prefix |

359| Ctrl+Z | Unix process suspend (SIGTSTP) |

360 

361## Vim mode interaction

362 

363When vim mode is enabled (`/vim`), keybindings and vim mode operate independently:

364 

365* **Vim mode** handles input at the text input level (cursor movement, modes, motions)

366* **Keybindings** handle actions at the component level (toggle todos, submit, etc.)

367* The Escape key in vim mode switches INSERT to NORMAL mode; it does not trigger `chat:cancel`

368* Most Ctrl+key shortcuts pass through vim mode to the keybinding system

369* In vim NORMAL mode, `?` shows the help menu (vim behavior)

370 

371## Validation

372 

373Claude Code validates your keybindings and shows warnings for:

374 

375* Parse errors (invalid JSON or structure)

376* Invalid context names

377* Reserved shortcut conflicts

378* Terminal multiplexer conflicts

379* Duplicate bindings in the same context

380 

381Run `/doctor` to see any keybinding warnings.

llm-gateway.md +40 −11

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# LLM gateway configuration5# LLM gateway configuration

2 6 

3> Learn how to configure Claude Code with LLM gateway solutions, including LiteLLM setup, authentication methods, and enterprise features like usage tracking and budget management.7> Learn how to configure Claude Code to work with LLM gateway solutions. Covers gateway requirements, authentication configuration, model selection, and provider-specific endpoint setup.

4 8 

5LLM gateways provide a centralized proxy layer between Claude Code and model providers, offering:9LLM gateways provide a centralized proxy layer between Claude Code and model providers, often providing:

6 10 

7* **Centralized authentication** - Single point for API key management11* **Centralized authentication** - Single point for API key management

8* **Usage tracking** - Monitor usage across teams and projects12* **Usage tracking** - Monitor usage across teams and projects


10* **Audit logging** - Track all model interactions for compliance14* **Audit logging** - Track all model interactions for compliance

11* **Model routing** - Switch between providers without code changes15* **Model routing** - Switch between providers without code changes

12 16 

17## Gateway requirements

18 

19For an LLM gateway to work with Claude Code, it must meet the following requirements:

20 

21**API format**

22 

23The gateway must expose to clients at least one of the following API formats:

24 

251. **Anthropic Messages**: `/v1/messages`, `/v1/messages/count_tokens`

26 * Must forward request headers: `anthropic-beta`, `anthropic-version`

27 

282. **Bedrock InvokeModel**: `/invoke`, `/invoke-with-response-stream`

29 * Must preserve request body fields: `anthropic_beta`, `anthropic_version`

30 

313. **Vertex rawPredict**: `:rawPredict`, `:streamRawPredict`, `/count-tokens:rawPredict`

32 * Must forward request headers: `anthropic-beta`, `anthropic-version`

33 

34Failure to forward headers or preserve body fields may result in reduced functionality or inability to use Claude Code features.

35 

36<Note>

37 Claude Code determines which features to enable based on the API format. When using the Anthropic Messages format with Bedrock or Vertex, you may need to set environment variable `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`.

38</Note>

39 

40## Configuration

41 

42### Model selection

43 

44By default, Claude Code will use standard model names for the selected API format.

45 

46If you have configured custom model names in your gateway, use the environment variables documented in [Model configuration](/en/model-config) to match your custom names.

47 

13## LiteLLM configuration48## LiteLLM configuration

14 49 

15<Note>50<Note>


129export CLOUD_ML_REGION=us-east5164export CLOUD_ML_REGION=us-east5

130```165```

131 166 

132### Model selection

133 

134By default, the models will use those specified in [Model configuration](/en/docs/claude-code/bedrock-vertex-proxies#model-configuration).

135 

136If you have configured custom model names in LiteLLM, set the aforementioned environment variables to those custom names.

137 

138For more detailed information, refer to the [LiteLLM documentation](https://docs.litellm.ai/).167For more detailed information, refer to the [LiteLLM documentation](https://docs.litellm.ai/).

139 168 

140## Additional resources169## Additional resources

141 170 

142* [LiteLLM documentation](https://docs.litellm.ai/)171* [LiteLLM documentation](https://docs.litellm.ai/)

143* [Claude Code settings](/en/docs/claude-code/settings)172* [Claude Code settings](/en/settings)

144* [Enterprise network configuration](/en/docs/claude-code/network-config)173* [Enterprise network configuration](/en/network-config)

145* [Third-party integrations overview](/en/docs/claude-code/third-party-integrations)174* [Third-party integrations overview](/en/third-party-integrations)

mcp.md +380 −42

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Connect Claude Code to tools via MCP5# Connect Claude Code to tools via MCP

2 6 

3> Learn how to connect Claude Code to your tools with the Model Context Protocol.7> Learn how to connect Claude Code to your tools with the Model Context Protocol.

4 8 

5 9 

6Claude Code can connect to hundreds of external tools and data sources through the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction), an open-source standard for AI-tool integrations. MCP servers give Claude Code access to your tools, databases, and APIs.10Claude Code can connect to hundreds of external tools and data sources through the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction), an open source standard for AI-tool integrations. MCP servers give Claude Code access to your tools, databases, and APIs.

7 11 

8## What you can do with MCP12## What you can do with MCP

9 13 


11 15 

12* **Implement features from issue trackers**: "Add the feature described in JIRA issue ENG-4521 and create a PR on GitHub."16* **Implement features from issue trackers**: "Add the feature described in JIRA issue ENG-4521 and create a PR on GitHub."

13* **Analyze monitoring data**: "Check Sentry and Statsig to check the usage of the feature described in ENG-4521."17* **Analyze monitoring data**: "Check Sentry and Statsig to check the usage of the feature described in ENG-4521."

14* **Query databases**: "Find emails of 10 random users who used feature ENG-4521, based on our Postgres database."18* **Query databases**: "Find emails of 10 random users who used feature ENG-4521, based on our PostgreSQL database."

15* **Integrate designs**: "Update our standard email template based on the new Figma designs that were posted in Slack"19* **Integrate designs**: "Update our standard email template based on the new Figma designs that were posted in Slack"

16* **Automate workflows**: "Create Gmail drafts inviting these 10 users to a feedback session about the new feature."20* **Automate workflows**: "Create Gmail drafts inviting these 10 users to a feedback session about the new feature."

17 21 


77 81 

78```bash theme={null}82```bash theme={null}

79# Basic syntax83# Basic syntax

80claude mcp add --transport stdio <name> <command> [args...]84claude mcp add [options] <name> -- <command> [args...]

81 85 

82# Real example: Add Airtable server86# Real example: Add Airtable server

83claude mcp add --transport stdio airtable --env AIRTABLE_API_KEY=YOUR_KEY \87claude mcp add --transport stdio --env AIRTABLE_API_KEY=YOUR_KEY airtable \

84 -- npx -y airtable-mcp-server88 -- npx -y airtable-mcp-server

85```89```

86 90 

87<Note>91<Note>

88 **Understanding the "--" parameter:**92 **Important: Option ordering**

89 The `--` (double dash) separates Claude's own CLI flags from the command and arguments that get passed to the MCP server. Everything before `--` are options for Claude (like `--env`, `--scope`), and everything after `--` is the actual command to run the MCP server.93 

94 All options (`--transport`, `--env`, `--scope`, `--header`) must come **before** the server name. The `--` (double dash) then separates the server name from the command and arguments that get passed to the MCP server.

90 95 

91 For example:96 For example:

92 97 

93 * `claude mcp add --transport stdio myserver -- npx server` → runs `npx server`98 * `claude mcp add --transport stdio myserver -- npx server` → runs `npx server`

94 * `claude mcp add --transport stdio myserver --env KEY=value -- python server.py --port 8080` → runs `python server.py --port 8080` with `KEY=value` in environment99 * `claude mcp add --transport stdio --env KEY=value myserver -- python server.py --port 8080` → runs `python server.py --port 8080` with `KEY=value` in environment

95 100 

96 This prevents conflicts between Claude's flags and the server's flags.101 This prevents conflicts between Claude's flags and the server's flags.

97</Note>102</Note>


114/mcp119/mcp

115```120```

116 121 

122### Dynamic tool updates

123 

124Claude Code supports MCP `list_changed` notifications, allowing MCP servers to dynamically update their available tools, prompts, and resources without requiring you to disconnect and reconnect. When an MCP server sends a `list_changed` notification, Claude Code automatically refreshes the available capabilities from that server.

125 

117<Tip>126<Tip>

118 Tips:127 Tips:

119 128 


121 * `local` (default): Available only to you in the current project (was called `project` in older versions)130 * `local` (default): Available only to you in the current project (was called `project` in older versions)

122 * `project`: Shared with everyone in the project via `.mcp.json` file131 * `project`: Shared with everyone in the project via `.mcp.json` file

123 * `user`: Available to you across all projects (was called `global` in older versions)132 * `user`: Available to you across all projects (was called `global` in older versions)

124 * Set environment variables with `--env` flags (e.g., `--env KEY=value`)133 * Set environment variables with `--env` flags (for example, `--env KEY=value`)

125 * Configure MCP server startup timeout using the MCP\_TIMEOUT environment variable (e.g., `MCP_TIMEOUT=10000 claude` sets a 10-second timeout)134 * Configure MCP server startup timeout using the MCP\_TIMEOUT environment variable (for example, `MCP_TIMEOUT=10000 claude` sets a 10-second timeout)

126 * Claude Code will display a warning when MCP tool output exceeds 10,000 tokens. To increase this limit, set the `MAX_MCP_OUTPUT_TOKENS` environment variable (e.g., `MAX_MCP_OUTPUT_TOKENS=50000`)135 * Claude Code will display a warning when MCP tool output exceeds 10,000 tokens. To increase this limit, set the `MAX_MCP_OUTPUT_TOKENS` environment variable (for example, `MAX_MCP_OUTPUT_TOKENS=50000`)

127 * Use `/mcp` to authenticate with remote servers that require OAuth 2.0 authentication136 * Use `/mcp` to authenticate with remote servers that require OAuth 2.0 authentication

128</Tip>137</Tip>

129 138 


140 149 

141### Plugin-provided MCP servers150### Plugin-provided MCP servers

142 151 

143[Plugins](/en/docs/claude-code/plugins) can bundle MCP servers, automatically providing tools and integrations when the plugin is enabled. Plugin MCP servers work identically to user-configured servers.152[Plugins](/en/plugins) can bundle MCP servers, automatically providing tools and integrations when the plugin is enabled. Plugin MCP servers work identically to user-configured servers.

144 153 

145**How plugin MCP servers work**:154**How plugin MCP servers work**:

146 155 


201* **Automatic setup**: No manual MCP configuration needed210* **Automatic setup**: No manual MCP configuration needed

202* **Team consistency**: Everyone gets the same tools when plugin is installed211* **Team consistency**: Everyone gets the same tools when plugin is installed

203 212 

204See the [plugin components reference](/en/docs/claude-code/plugins-reference#mcp-servers) for details on bundling MCP servers with plugins.213See the [plugin components reference](/en/plugins-reference#mcp-servers) for details on bundling MCP servers with plugins.

205 214 

206## MCP installation scopes215## MCP installation scopes

207 216 


209 218 

210### Local scope219### Local scope

211 220 

212Local-scoped servers represent the default configuration level and are stored in your project-specific user settings. These servers remain private to you and are only accessible when working within the current project directory. This scope is ideal for personal development servers, experimental configurations, or servers containing sensitive credentials that shouldn't be shared.221Local-scoped servers represent the default configuration level and are stored in `~/.claude.json` under your project's path. These servers remain private to you and are only accessible when working within the current project directory. This scope is ideal for personal development servers, experimental configurations, or servers containing sensitive credentials that shouldn't be shared.

222 

223<Note>

224 The term "local scope" for MCP servers differs from general local settings. MCP local-scoped servers are stored in `~/.claude.json` (your home directory), while general local settings use `.claude/settings.local.json` (in the project directory). See [Settings](/en/settings#settings-files) for details on settings file locations.

225</Note>

213 226 

214```bash theme={null}227```bash theme={null}

215# Add a local-scoped server (default)228# Add a local-scoped server (default)


246 259 

247### User scope260### User scope

248 261 

249User-scoped servers provide cross-project accessibility, making them available across all projects on your machine while remaining private to your user account. This scope works well for personal utility servers, development tools, or services you frequently use across different projects.262User-scoped servers are stored in `~/.claude.json` and provide cross-project accessibility, making them available across all projects on your machine while remaining private to your user account. This scope works well for personal utility servers, development tools, or services you frequently use across different projects.

250 263 

251```bash theme={null}264```bash theme={null}

252# Add a user server265# Add a user server


259 272 

260* **Local scope**: Personal servers, experimental configurations, or sensitive credentials specific to one project273* **Local scope**: Personal servers, experimental configurations, or sensitive credentials specific to one project

261* **Project scope**: Team-shared servers, project-specific tools, or services required for collaboration274* **Project scope**: Team-shared servers, project-specific tools, or services required for collaboration

262* **User scope**: Personal utilities needed across multiple projects, development tools, or frequently-used services275* **User scope**: Personal utilities needed across multiple projects, development tools, or frequently used services

276 

277<Note>

278 **Where are MCP servers stored?**

279 

280 * **User and local scope**: `~/.claude.json` (in the `mcpServers` field or under project paths)

281 * **Project scope**: `.mcp.json` in your project root (checked into source control)

282 * **Managed**: `managed-mcp.json` in system directories (see [Managed MCP configuration](#managed-mcp-configuration))

283</Note>

263 284 

264### Scope hierarchy and precedence285### Scope hierarchy and precedence

265 286 


392 * OAuth authentication works with HTTP servers413 * OAuth authentication works with HTTP servers

393</Tip>414</Tip>

394 415 

416### Use pre-configured OAuth credentials

417 

418Some MCP servers don't support automatic OAuth setup. If you see an error like "Incompatible auth server: does not support dynamic client registration," the server requires pre-configured credentials. Register an OAuth app through the server's developer portal first, then provide the credentials when adding the server.

419 

420<Steps>

421 <Step title="Register an OAuth app with the server">

422 Create an app through the server's developer portal and note your client ID and client secret.

423 

424 Many servers also require a redirect URI. If so, choose a port and register a redirect URI in the format `http://localhost:PORT/callback`. Use that same port with `--callback-port` in the next step.

425 </Step>

426 

427 <Step title="Add the server with your credentials">

428 Choose one of the following methods. The port used for `--callback-port` can be any available port. It just needs to match the redirect URI you registered in the previous step.

429 

430 <Tabs>

431 <Tab title="claude mcp add">

432 Use `--client-id` to pass your app's client ID. The `--client-secret` flag prompts for the secret with masked input:

433 

434 ```bash theme={null}

435 claude mcp add --transport http \

436 --client-id your-client-id --client-secret --callback-port 8080 \

437 my-server https://mcp.example.com/mcp

438 ```

439 </Tab>

440 

441 <Tab title="claude mcp add-json">

442 Include the `oauth` object in the JSON config and pass `--client-secret` as a separate flag:

443 

444 ```bash theme={null}

445 claude mcp add-json my-server \

446 '{"type":"http","url":"https://mcp.example.com/mcp","oauth":{"clientId":"your-client-id","callbackPort":8080}}' \

447 --client-secret

448 ```

449 </Tab>

450 

451 <Tab title="CI / env var">

452 Set the secret via environment variable to skip the interactive prompt:

453 

454 ```bash theme={null}

455 MCP_CLIENT_SECRET=your-secret claude mcp add --transport http \

456 --client-id your-client-id --client-secret --callback-port 8080 \

457 my-server https://mcp.example.com/mcp

458 ```

459 </Tab>

460 </Tabs>

461 </Step>

462 

463 <Step title="Authenticate in Claude Code">

464 Run `/mcp` in Claude Code and follow the browser login flow.

465 </Step>

466</Steps>

467 

468<Tip>

469 Tips:

470 

471 * The client secret is stored securely in your system keychain (macOS) or a credentials file, not in your config

472 * If the server uses a public OAuth client with no secret, use only `--client-id` without `--client-secret`

473 * These flags only apply to HTTP and SSE transports. They have no effect on stdio servers

474 * Use `claude mcp get <name>` to verify that OAuth credentials are configured for a server

475</Tip>

476 

395## Add MCP servers from JSON configuration477## Add MCP servers from JSON configuration

396 478 

397If you have a JSON configuration for an MCP server, you can add it directly:479If you have a JSON configuration for an MCP server, you can add it directly:


407 489 

408 # Example: Adding a stdio server with JSON configuration490 # Example: Adding a stdio server with JSON configuration

409 claude mcp add-json local-weather '{"type":"stdio","command":"/path/to/weather-cli","args":["--api-key","abc123"],"env":{"CACHE_DIR":"/tmp"}}'491 claude mcp add-json local-weather '{"type":"stdio","command":"/path/to/weather-cli","args":["--api-key","abc123"],"env":{"CACHE_DIR":"/tmp"}}'

492 

493 # Example: Adding an HTTP server with pre-configured OAuth credentials

494 claude mcp add-json my-server '{"type":"http","url":"https://mcp.example.com/mcp","oauth":{"clientId":"your-client-id","callbackPort":8080}}' --client-secret

410 ```495 ```

411 </Step>496 </Step>

412 497 


455 * It reads the Claude Desktop configuration file from its standard location on those platforms540 * It reads the Claude Desktop configuration file from its standard location on those platforms

456 * Use the `--scope user` flag to add servers to your user configuration541 * Use the `--scope user` flag to add servers to your user configuration

457 * Imported servers will have the same names as in Claude Desktop542 * Imported servers will have the same names as in Claude Desktop

458 * If servers with the same names already exist, they will get a numerical suffix (e.g., `server_1`)543 * If servers with the same names already exist, they will get a numerical suffix (for example, `server_1`)

459</Tip>544</Tip>

460 545 

546## Use MCP servers from Claude.ai

547 

548If you've logged into Claude Code with a [Claude.ai](https://claude.ai) account, MCP servers you've added in Claude.ai are automatically available in Claude Code:

549 

550<Steps>

551 <Step title="Configure MCP servers in Claude.ai">

552 Add servers at [claude.ai/settings/connectors](https://claude.ai/settings/connectors). On Team and Enterprise plans, only admins can add servers.

553 </Step>

554 

555 <Step title="Authenticate the MCP server">

556 Complete any required authentication steps in Claude.ai.

557 </Step>

558 

559 <Step title="View and manage servers in Claude Code">

560 In Claude Code, use the command:

561 

562 ```

563 # Within Claude Code, see all MCP servers including Claude.ai ones

564 > /mcp

565 ```

566 

567 Claude.ai servers appear in the list with indicators showing they come from Claude.ai.

568 </Step>

569</Steps>

570 

461## Use Claude Code as an MCP server571## Use Claude Code as an MCP server

462 572 

463You can use Claude Code itself as an MCP server that other applications can connect to:573You can use Claude Code itself as an MCP server that other applications can connect to:


482}592}

483```593```

484 594 

595<Warning>

596 **Configuring the executable path**: The `command` field must reference the Claude Code executable. If the `claude` command is not in your system's PATH, you'll need to specify the full path to the executable.

597 

598 To find the full path:

599 

600 ```bash theme={null}

601 which claude

602 ```

603 

604 Then use the full path in your configuration:

605 

606 ```json theme={null}

607 {

608 "mcpServers": {

609 "claude-code": {

610 "type": "stdio",

611 "command": "/full/path/to/claude",

612 "args": ["mcp", "serve"],

613 "env": {}

614 }

615 }

616 }

617 ```

618 

619 Without the correct executable path, you'll encounter errors like `spawn claude ENOENT`.

620</Warning>

621 

485<Tip>622<Tip>

486 Tips:623 Tips:

487 624 

488 * The server provides access to Claude's tools like View, Edit, LS, etc.625 * The server provides access to Claude's tools like View, Edit, LS, etc.

489 * In Claude Desktop, try asking Claude to read files in a directory, make edits, and more.626 * In Claude Desktop, try asking Claude to read files in a directory, make edits, and more.

490 * Note that this MCP server is simply exposing Claude Code's tools to your MCP client, so your own client is responsible for implementing user confirmation for individual tool calls.627 * Note that this MCP server is only exposing Claude Code's tools to your MCP client, so your own client is responsible for implementing user confirmation for individual tool calls.

491</Tip>628</Tip>

492 629 

493## MCP output limits and warnings630## MCP output limits and warnings


557 * Resources can contain any type of content that the MCP server provides (text, JSON, structured data, etc.)694 * Resources can contain any type of content that the MCP server provides (text, JSON, structured data, etc.)

558</Tip>695</Tip>

559 696 

560## Use MCP prompts as slash commands697## Scale with MCP Tool Search

698 

699When you have many MCP servers configured, tool definitions can consume a significant portion of your context window. MCP Tool Search solves this by dynamically loading tools on-demand instead of preloading all of them.

700 

701### How it works

702 

703Claude Code automatically enables Tool Search when your MCP tool descriptions would consume more than 10% of the context window. You can [adjust this threshold](#configure-tool-search) or disable tool search entirely. When triggered:

704 

7051. MCP tools are deferred rather than loaded into context upfront

7062. Claude uses a search tool to discover relevant MCP tools when needed

7073. Only the tools Claude actually needs are loaded into context

7084. MCP tools continue to work exactly as before from your perspective

709 

710### For MCP server authors

711 

712If you're building an MCP server, the server instructions field becomes more useful with Tool Search enabled. Server instructions help Claude understand when to search for your tools, similar to how [skills](/en/skills) work.

561 713 

562MCP servers can expose prompts that become available as slash commands in Claude Code.714Add clear, descriptive server instructions that explain:

715 

716* What category of tasks your tools handle

717* When Claude should search for your tools

718* Key capabilities your server provides

719 

720### Configure tool search

721 

722Tool search runs in auto mode by default, meaning it activates only when your MCP tool definitions exceed the context threshold. If you have few tools, they load normally without tool search. This feature requires models that support `tool_reference` blocks: Sonnet 4 and later, or Opus 4 and later. Haiku models do not support tool search.

723 

724Control tool search behavior with the `ENABLE_TOOL_SEARCH` environment variable:

725 

726| Value | Behavior |

727| :--------- | :--------------------------------------------------------------------------------- |

728| `auto` | Activates when MCP tools exceed 10% of context (default) |

729| `auto:<N>` | Activates at custom threshold, where `<N>` is a percentage (e.g., `auto:5` for 5%) |

730| `true` | Always enabled |

731| `false` | Disabled, all MCP tools loaded upfront |

732 

733```bash theme={null}

734# Use a custom 5% threshold

735ENABLE_TOOL_SEARCH=auto:5 claude

736 

737# Disable tool search entirely

738ENABLE_TOOL_SEARCH=false claude

739```

740 

741Or set the value in your [settings.json `env` field](/en/settings#available-settings).

742 

743You can also disable the MCPSearch tool specifically using the `disallowedTools` setting:

744 

745```json theme={null}

746{

747 "permissions": {

748 "deny": ["MCPSearch"]

749 }

750}

751```

752 

753## Use MCP prompts as commands

754 

755MCP servers can expose prompts that become available as commands in Claude Code.

563 756 

564### Execute MCP prompts757### Execute MCP prompts

565 758 


596 * Server and prompt names are normalized (spaces become underscores)789 * Server and prompt names are normalized (spaces become underscores)

597</Tip>790</Tip>

598 791 

599## Enterprise MCP configuration792## Managed MCP configuration

793 

794For organizations that need centralized control over MCP servers, Claude Code supports two configuration options:

600 795 

601For organizations that need centralized control over MCP servers, Claude Code supports enterprise-managed MCP configurations. This allows IT administrators to:7961. **Exclusive control with `managed-mcp.json`**: Deploy a fixed set of MCP servers that users cannot modify or extend

7972. **Policy-based control with allowlists/denylists**: Allow users to add their own servers, but restrict which ones are permitted

798 

799These options allow IT administrators to:

602 800 

603* **Control which MCP servers employees can access**: Deploy a standardized set of approved MCP servers across the organization801* **Control which MCP servers employees can access**: Deploy a standardized set of approved MCP servers across the organization

604* **Prevent unauthorized MCP servers**: Optionally restrict users from adding their own MCP servers802* **Prevent unauthorized MCP servers**: Restrict users from adding unapproved MCP servers

605* **Disable MCP entirely**: Remove MCP functionality completely if needed803* **Disable MCP entirely**: Remove MCP functionality completely if needed

606 804 

607### Setting up enterprise MCP configuration805### Option 1: Exclusive control with managed-mcp.json

806 

807When you deploy a `managed-mcp.json` file, it takes **exclusive control** over all MCP servers. Users cannot add, modify, or use any MCP servers other than those defined in this file. This is the simplest approach for organizations that want complete control.

808 

809System administrators deploy the configuration file to a system-wide directory:

608 810 

609System administrators can deploy an enterprise MCP configuration file alongside the managed settings file:811* macOS: `/Library/Application Support/ClaudeCode/managed-mcp.json`

812* Linux and WSL: `/etc/claude-code/managed-mcp.json`

813* Windows: `C:\Program Files\ClaudeCode\managed-mcp.json`

610 814 

611* **macOS**: `/Library/Application Support/ClaudeCode/managed-mcp.json`815<Note>

612* **Windows**: `C:\ProgramData\ClaudeCode\managed-mcp.json`816 These are system-wide paths (not user home directories like `~/Library/...`) that require administrator privileges. They are designed to be deployed by IT administrators.

613* **Linux**: `/etc/claude-code/managed-mcp.json`817</Note>

614 818 

615The `managed-mcp.json` file uses the same format as a standard `.mcp.json` file:819The `managed-mcp.json` file uses the same format as a standard `.mcp.json` file:

616 820 


637}841}

638```842```

639 843 

640### Restricting MCP servers with allowlists and denylists844### Option 2: Policy-based control with allowlists and denylists

845 

846Instead of taking exclusive control, administrators can allow users to configure their own MCP servers while enforcing restrictions on which servers are permitted. This approach uses `allowedMcpServers` and `deniedMcpServers` in the [managed settings file](/en/settings#settings-files).

847 

848<Note>

849 **Choosing between options**: Use Option 1 (`managed-mcp.json`) when you want to deploy a fixed set of servers with no user customization. Use Option 2 (allowlists/denylists) when you want to allow users to add their own servers within policy constraints.

850</Note>

851 

852#### Restriction options

641 853 

642In addition to providing enterprise-managed servers, administrators can control which MCP servers users are allowed to configure using `allowedMcpServers` and `deniedMcpServers` in the `managed-settings.json` file:854Each entry in the allowlist or denylist can restrict servers in three ways:

643 855 

644* **macOS**: `/Library/Application Support/ClaudeCode/managed-settings.json`8561. **By server name** (`serverName`): Matches the configured name of the server

645* **Windows**: `C:\ProgramData\ClaudeCode\managed-settings.json`8572. **By command** (`serverCommand`): Matches the exact command and arguments used to start stdio servers

646* **Linux**: `/etc/claude-code/managed-settings.json`8583. **By URL pattern** (`serverUrl`): Matches remote server URLs with wildcard support

859 

860**Important**: Each entry must have exactly one of `serverName`, `serverCommand`, or `serverUrl`.

861 

862#### Example configuration

647 863 

648```json theme={null}864```json theme={null}

649{865{

650 "allowedMcpServers": [866 "allowedMcpServers": [

867 // Allow by server name

651 { "serverName": "github" },868 { "serverName": "github" },

652 { "serverName": "sentry" },869 { "serverName": "sentry" },

653 { "serverName": "company-internal" }870 

871 // Allow by exact command (for stdio servers)

872 { "serverCommand": ["npx", "-y", "@modelcontextprotocol/server-filesystem"] },

873 { "serverCommand": ["python", "/usr/local/bin/approved-server.py"] },

874 

875 // Allow by URL pattern (for remote servers)

876 { "serverUrl": "https://mcp.company.com/*" },

877 { "serverUrl": "https://*.internal.corp/*" }

654 ],878 ],

655 "deniedMcpServers": [879 "deniedMcpServers": [

656 { "serverName": "filesystem" }880 // Block by server name

881 { "serverName": "dangerous-server" },

882 

883 // Block by exact command (for stdio servers)

884 { "serverCommand": ["npx", "-y", "unapproved-package"] },

885 

886 // Block by URL pattern (for remote servers)

887 { "serverUrl": "https://*.untrusted.com/*" }

657 ]888 ]

658}889}

659```890```

660 891 

661**Allowlist behavior (`allowedMcpServers`)**:892#### How command-based restrictions work

893 

894**Exact matching**:

895 

896* Command arrays must match **exactly** - both the command and all arguments in the correct order

897* Example: `["npx", "-y", "server"]` will NOT match `["npx", "server"]` or `["npx", "-y", "server", "--flag"]`

898 

899**Stdio server behavior**:

900 

901* When the allowlist contains **any** `serverCommand` entries, stdio servers **must** match one of those commands

902* Stdio servers cannot pass by name alone when command restrictions are present

903* This ensures administrators can enforce which commands are allowed to run

904 

905**Non-stdio server behavior**:

906 

907* Remote servers (HTTP, SSE, WebSocket) use URL-based matching when `serverUrl` entries exist in the allowlist

908* If no URL entries exist, remote servers fall back to name-based matching

909* Command restrictions do not apply to remote servers

910 

911#### How URL-based restrictions work

912 

913URL patterns support wildcards using `*` to match any sequence of characters. This is useful for allowing entire domains or subdomains.

914 

915**Wildcard examples**:

916 

917* `https://mcp.company.com/*` - Allow all paths on a specific domain

918* `https://*.example.com/*` - Allow any subdomain of example.com

919* `http://localhost:*/*` - Allow any port on localhost

920 

921**Remote server behavior**:

922 

923* When the allowlist contains **any** `serverUrl` entries, remote servers **must** match one of those URL patterns

924* Remote servers cannot pass by name alone when URL restrictions are present

925* This ensures administrators can enforce which remote endpoints are allowed

926 

927<Accordion title="Example: URL-only allowlist">

928 ```json theme={null}

929 {

930 "allowedMcpServers": [

931 { "serverUrl": "https://mcp.company.com/*" },

932 { "serverUrl": "https://*.internal.corp/*" }

933 ]

934 }

935 ```

936 

937 **Result**:

938 

939 * HTTP server at `https://mcp.company.com/api`: ✅ Allowed (matches URL pattern)

940 * HTTP server at `https://api.internal.corp/mcp`: ✅ Allowed (matches wildcard subdomain)

941 * HTTP server at `https://external.com/mcp`: ❌ Blocked (doesn't match any URL pattern)

942 * Stdio server with any command: ❌ Blocked (no name or command entries to match)

943</Accordion>

944 

945<Accordion title="Example: Command-only allowlist">

946 ```json theme={null}

947 {

948 "allowedMcpServers": [

949 { "serverCommand": ["npx", "-y", "approved-package"] }

950 ]

951 }

952 ```

953 

954 **Result**:

955 

956 * Stdio server with `["npx", "-y", "approved-package"]`: ✅ Allowed (matches command)

957 * Stdio server with `["node", "server.js"]`: ❌ Blocked (doesn't match command)

958 * HTTP server named "my-api": ❌ Blocked (no name entries to match)

959</Accordion>

960 

961<Accordion title="Example: Mixed name and command allowlist">

962 ```json theme={null}

963 {

964 "allowedMcpServers": [

965 { "serverName": "github" },

966 { "serverCommand": ["npx", "-y", "approved-package"] }

967 ]

968 }

969 ```

970 

971 **Result**:

972 

973 * Stdio server named "local-tool" with `["npx", "-y", "approved-package"]`: ✅ Allowed (matches command)

974 * Stdio server named "local-tool" with `["node", "server.js"]`: ❌ Blocked (command entries exist but doesn't match)

975 * Stdio server named "github" with `["node", "server.js"]`: ❌ Blocked (stdio servers must match commands when command entries exist)

976 * HTTP server named "github": ✅ Allowed (matches name)

977 * HTTP server named "other-api": ❌ Blocked (name doesn't match)

978</Accordion>

979 

980<Accordion title="Example: Name-only allowlist">

981 ```json theme={null}

982 {

983 "allowedMcpServers": [

984 { "serverName": "github" },

985 { "serverName": "internal-tool" }

986 ]

987 }

988 ```

989 

990 **Result**:

991 

992 * Stdio server named "github" with any command: ✅ Allowed (no command restrictions)

993 * Stdio server named "internal-tool" with any command: ✅ Allowed (no command restrictions)

994 * HTTP server named "github": ✅ Allowed (matches name)

995 * Any server named "other": ❌ Blocked (name doesn't match)

996</Accordion>

997 

998#### Allowlist behavior (`allowedMcpServers`)

662 999 

663* `undefined` (default): No restrictions - users can configure any MCP server1000* `undefined` (default): No restrictions - users can configure any MCP server

664* Empty array `[]`: Complete lockdown - users cannot configure any MCP servers1001* Empty array `[]`: Complete lockdown - users cannot configure any MCP servers

665* List of server names: Users can only configure the specified servers1002* List of entries: Users can only configure servers that match by name, command, or URL pattern

666 1003 

667**Denylist behavior (`deniedMcpServers`)**:1004#### Denylist behavior (`deniedMcpServers`)

668 1005 

669* `undefined` (default): No servers are blocked1006* `undefined` (default): No servers are blocked

670* Empty array `[]`: No servers are blocked1007* Empty array `[]`: No servers are blocked

671* List of server names: Specified servers are explicitly blocked across all scopes1008* List of entries: Specified servers are explicitly blocked across all scopes

672 1009 

673**Important notes**:1010#### Important notes

674 1011 

675* These restrictions apply to all scopes: user, project, local, and even enterprise servers from `managed-mcp.json`1012* **Option 1 and Option 2 can be combined**: If `managed-mcp.json` exists, it has exclusive control and users cannot add servers. Allowlists/denylists still apply to the managed servers themselves.

676* **Denylist takes absolute precedence**: If a server appears in both lists, it will be blocked1013* **Denylist takes absolute precedence**: If a server matches a denylist entry (by name, command, or URL), it will be blocked even if it's on the allowlist

1014* Name-based, command-based, and URL-based restrictions work together: a server passes if it matches **either** a name entry, a command entry, or a URL pattern (unless blocked by denylist)

677 1015 

678<Note>1016<Note>

679 **Enterprise configuration precedence**: The enterprise MCP configuration has the highest precedence and cannot be overridden by user, local, or project configurations when `useEnterpriseMcpConfigOnly` is enabled.1017 **When using `managed-mcp.json`**: Users cannot add MCP servers through `claude mcp add` or configuration files. The `allowedMcpServers` and `deniedMcpServers` settings still apply to filter which managed servers are actually loaded.

680</Note>1018</Note>

memory.md +216 −20

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Manage Claude's memory5# Manage Claude's memory

2 6 

3> Learn how to manage Claude Code's memory across sessions with different memory locations and best practices.7> Learn how to manage Claude Code's memory across sessions with different memory locations and best practices.

4 8 

5Claude Code can remember your preferences across sessions, like style guidelines and common commands in your workflow.9Claude Code has two kinds of memory that persist across sessions:

10 

11* **Auto memory**: Claude automatically saves useful context like project patterns, key commands, and your preferences. This persists across sessions.

12* **CLAUDE.md files**: Markdown files you write and maintain with instructions, rules, and preferences for Claude to follow.

13 

14Both are loaded into Claude's context at the start of every session, though auto memory loads only the first 200 lines of its main file.

6 15 

7## Determine memory type16## Determine memory type

8 17 

9Claude Code offers four memory locations in a hierarchical structure, each serving a different purpose:18Claude Code offers several memory locations in a hierarchical structure, each serving a different purpose:

10 19 

11| Memory Type | Location | Purpose | Use Case Examples | Shared With |20| Memory Type | Location | Purpose | Use Case Examples | Shared With |

12| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------- |21| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------- |

13| **Enterprise policy** | macOS: `/Library/Application Support/ClaudeCode/CLAUDE.md`<br />Linux: `/etc/claude-code/CLAUDE.md`<br />Windows: `C:\ProgramData\ClaudeCode\CLAUDE.md` | Organization-wide instructions managed by IT/DevOps | Company coding standards, security policies, compliance requirements | All users in organization |22| **Managed policy** | macOS: `/Library/Application Support/ClaudeCode/CLAUDE.md`<br />Linux: `/etc/claude-code/CLAUDE.md`<br />Windows: `C:\Program Files\ClaudeCode\CLAUDE.md` | Organization-wide instructions managed by IT/DevOps | Company coding standards, security policies, compliance requirements | All users in organization |

14| **Project memory** | `./CLAUDE.md` or `./.claude/CLAUDE.md` | Team-shared instructions for the project | Project architecture, coding standards, common workflows | Team members via source control |23| **Project memory** | `./CLAUDE.md` or `./.claude/CLAUDE.md` | Team-shared instructions for the project | Project architecture, coding standards, common workflows | Team members via source control |

24| **Project rules** | `./.claude/rules/*.md` | Modular, topic-specific project instructions | Language-specific guidelines, testing conventions, API standards | Team members via source control |

15| **User memory** | `~/.claude/CLAUDE.md` | Personal preferences for all projects | Code styling preferences, personal tooling shortcuts | Just you (all projects) |25| **User memory** | `~/.claude/CLAUDE.md` | Personal preferences for all projects | Code styling preferences, personal tooling shortcuts | Just you (all projects) |

16| **Project memory (local)** | `./CLAUDE.local.md` | Personal project-specific preferences | *(Deprecated, see below)* Your sandbox URLs, preferred test data | Just you (current project) |26| **Project memory (local)** | `./CLAUDE.local.md` | Personal project-specific preferences | Your sandbox URLs, preferred test data | Just you (current project) |

27| **Auto memory** | `~/.claude/projects/<project>/memory/` | Claude's automatic notes and learnings | Project patterns, debugging insights, architecture notes | Just you (per project) |

28 

29CLAUDE.md files in the directory hierarchy above the working directory are loaded in full at launch. CLAUDE.md files in child directories load on demand when Claude reads files in those directories. Auto memory loads only the first 200 lines of `MEMORY.md`. More specific instructions take precedence over broader ones.

30 

31<Note>

32 CLAUDE.local.md files are automatically added to .gitignore, making them ideal for private project-specific preferences that shouldn't be checked into version control.

33</Note>

34 

35## Auto memory

36 

37Auto memory is a persistent directory where Claude records learnings, patterns, and insights as it works. Unlike CLAUDE.md files that contain instructions you write for Claude, auto memory contains notes Claude writes for itself based on what it discovers during sessions.

38 

39<Note>

40 Auto memory is being rolled out gradually. If you aren't seeing auto memory, you can opt in by setting `CLAUDE_CODE_DISABLE_AUTO_MEMORY=0` in your environment.

41</Note>

42 

43### What Claude remembers

44 

45As Claude works, it may save things like:

46 

47* Project patterns: build commands, test conventions, code style preferences

48* Debugging insights: solutions to tricky problems, common error causes

49* Architecture notes: key files, module relationships, important abstractions

50* Your preferences: communication style, workflow habits, tool choices

51 

52### Where auto memory is stored

53 

54Each project gets its own memory directory at `~/.claude/projects/<project>/memory/`. The `<project>` path is derived from the git repository root, so all subdirectories within the same repo share one auto memory directory. Git worktrees get separate memory directories. Outside a git repo, the working directory is used instead.

55 

56The directory contains a `MEMORY.md` entrypoint and optional topic files:

57 

58```text theme={null}

59~/.claude/projects/<project>/memory/

60├── MEMORY.md # Concise index, loaded into every session

61├── debugging.md # Detailed notes on debugging patterns

62├── api-conventions.md # API design decisions

63└── ... # Any other topic files Claude creates

64```

65 

66`MEMORY.md` acts as an index of the memory directory. Claude reads and writes files in this directory throughout your session, using `MEMORY.md` to keep track of what's stored where.

67 

68### How it works

69 

70* The first 200 lines of `MEMORY.md` are loaded into Claude's system prompt at the start of every session. Content beyond 200 lines is not loaded automatically, and Claude is instructed to keep it concise by moving detailed notes into separate topic files.

71* Topic files like `debugging.md` or `patterns.md` are not loaded at startup. Claude reads them on demand using its standard file tools when it needs the information.

72* Claude reads and writes memory files during your session, so you'll see memory updates happen as you work.

73 

74### Manage auto memory

17 75 

18All memory files are automatically loaded into Claude Code's context when launched. Files higher in the hierarchy take precedence and are loaded first, providing a foundation that more specific memories build upon.76Auto memory files are markdown files you can edit at any time. Use `/memory` to open the file selector, which includes your auto memory entrypoint alongside your CLAUDE.md files.

77 

78To ask Claude to save something specific, tell it directly: "remember that we use pnpm, not npm" or "save to memory that the API tests require a local Redis instance".

79 

80When neither variable is set, auto memory follows the gradual rollout. The variable name uses double-negative logic: `DISABLE=0` means "don't disable" and forces auto memory on.

81 

82```bash theme={null}

83export CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 # Force off

84export CLAUDE_CODE_DISABLE_AUTO_MEMORY=0 # Force on

85```

19 86 

20## CLAUDE.md imports87## CLAUDE.md imports

21 88 


28- git workflow @docs/git-instructions.md95- git workflow @docs/git-instructions.md

29```96```

30 97 

31Both relative and absolute paths are allowed. In particular, importing files in user's home dir is a convenient way for your team members to provide individual instructions that are not checked into the repository. Previously CLAUDE.local.md served a similar purpose, but is now deprecated in favor of imports since they work better across multiple git worktrees.98Both relative and absolute paths are allowed. Relative paths resolve relative to the file containing the import, not the working directory. For private per-project preferences that shouldn't be checked into version control, prefer `CLAUDE.local.md`: it is automatically loaded and added to `.gitignore`.

99 

100If you work across multiple git worktrees, `CLAUDE.local.md` only exists in one. Use a home-directory import instead so all worktrees share the same personal instructions:

32 101 

33```102```

34# Individual Preferences103# Individual Preferences

35- @~/.claude/my-project-instructions.md104- @~/.claude/my-project-instructions.md

36```105```

37 106 

107<Warning>

108 The first time Claude Code encounters external imports in a project, it shows an approval dialog listing the specific files. Approve to load them; decline to skip them. This is a one-time decision per project: once declined, the dialog does not resurface and the imports remain disabled.

109</Warning>

110 

38To avoid potential collisions, imports are not evaluated inside markdown code spans and code blocks.111To avoid potential collisions, imports are not evaluated inside markdown code spans and code blocks.

39 112 

40```113```


49 122 

50Claude will also discover CLAUDE.md nested in subtrees under your current working directory. Instead of loading them at launch, they are only included when Claude reads files in those subtrees.123Claude will also discover CLAUDE.md nested in subtrees under your current working directory. Instead of loading them at launch, they are only included when Claude reads files in those subtrees.

51 124 

52## Quickly add memories with the `#` shortcut125### Load memory from additional directories

53 126 

54The fastest way to add a memory is to start your input with the `#` character:127The `--add-dir` flag gives Claude access to additional directories outside your main working directory. By default, CLAUDE.md files from these directories are not loaded.

55 128 

56```129To also load memory files (CLAUDE.md, .claude/CLAUDE.md, and .claude/rules/\*.md) from additional directories, set the `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD` environment variable:

57# Always use descriptive variable names

58```

59 130 

60You'll be prompted to select which memory file to store this in.131```bash theme={null}

132CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../shared-config

133```

61 134 

62## Directly edit memories with `/memory`135## Directly edit memories with `/memory`

63 136 

64Use the `/memory` slash command during a session to open any memory file in your system editor for more extensive additions or organization.137Use the `/memory` command during a session to open any memory file in your system editor for more extensive additions or organization.

65 138 

66## Set up project memory139## Set up project memory

67 140 


82 * CLAUDE.md memories can be used for both instructions shared with your team and for your individual preferences.155 * CLAUDE.md memories can be used for both instructions shared with your team and for your individual preferences.

83</Tip>156</Tip>

84 157 

158## Modular rules with `.claude/rules/`

159 

160For larger projects, you can organize instructions into multiple files using the `.claude/rules/` directory. This allows teams to maintain focused, well-organized rule files instead of one large CLAUDE.md.

161 

162### Basic structure

163 

164Place markdown files in your project's `.claude/rules/` directory:

165 

166```

167your-project/

168├── .claude/

169│ ├── CLAUDE.md # Main project instructions

170│ └── rules/

171│ ├── code-style.md # Code style guidelines

172│ ├── testing.md # Testing conventions

173│ └── security.md # Security requirements

174```

175 

176All `.md` files in `.claude/rules/` are automatically loaded as project memory, with the same priority as `.claude/CLAUDE.md`.

177 

178### Path-specific rules

179 

180Rules can be scoped to specific files using YAML frontmatter with the `paths` field. These conditional rules only apply when Claude is working with files matching the specified patterns.

181 

182```markdown theme={null}

183---

184paths:

185 - "src/api/**/*.ts"

186---

187 

188# API Development Rules

189 

190- All API endpoints must include input validation

191- Use the standard error response format

192- Include OpenAPI documentation comments

193```

194 

195Rules without a `paths` field are loaded unconditionally and apply to all files.

196 

197### Glob patterns

198 

199The `paths` field supports standard glob patterns:

200 

201| Pattern | Matches |

202| ---------------------- | ---------------------------------------- |

203| `**/*.ts` | All TypeScript files in any directory |

204| `src/**/*` | All files under `src/` directory |

205| `*.md` | Markdown files in the project root |

206| `src/components/*.tsx` | React components in a specific directory |

207 

208You can specify multiple patterns:

209 

210```markdown theme={null}

211---

212paths:

213 - "src/**/*.ts"

214 - "lib/**/*.ts"

215 - "tests/**/*.test.ts"

216---

217```

218 

219Brace expansion is supported for matching multiple extensions or directories:

220 

221```markdown theme={null}

222---

223paths:

224 - "src/**/*.{ts,tsx}"

225 - "{src,lib}/**/*.ts"

226---

227 

228# TypeScript/React Rules

229```

230 

231This expands `src/**/*.{ts,tsx}` to match both `.ts` and `.tsx` files.

232 

233### Subdirectories

234 

235Rules can be organized into subdirectories for better structure:

236 

237```

238.claude/rules/

239├── frontend/

240│ ├── react.md

241│ └── styles.md

242├── backend/

243│ ├── api.md

244│ └── database.md

245└── general.md

246```

247 

248All `.md` files are discovered recursively.

249 

250### Symlinks

251 

252The `.claude/rules/` directory supports symlinks, allowing you to share common rules across multiple projects:

253 

254```bash theme={null}

255# Symlink a shared rules directory

256ln -s ~/shared-claude-rules .claude/rules/shared

257 

258# Symlink individual rule files

259ln -s ~/company-standards/security.md .claude/rules/security.md

260```

261 

262Symlinks are resolved and their contents are loaded normally. Circular symlinks are detected and handled gracefully.

263 

264### User-level rules

265 

266You can create personal rules that apply to all your projects in `~/.claude/rules/`:

267 

268```

269~/.claude/rules/

270├── preferences.md # Your personal coding preferences

271└── workflows.md # Your preferred workflows

272```

273 

274User-level rules are loaded before project rules, giving project rules higher priority.

275 

276<Tip>

277 Best practices for `.claude/rules/`:

278 

279 * **Keep rules focused**: Each file should cover one topic (e.g., `testing.md`, `api-design.md`)

280 * **Use descriptive filenames**: The filename should indicate what the rules cover

281 * **Use conditional rules sparingly**: Only add `paths` frontmatter when rules truly apply to specific file types

282 * **Organize with subdirectories**: Group related rules (e.g., `frontend/`, `backend/`)

283</Tip>

284 

85## Organization-level memory management285## Organization-level memory management

86 286 

87Enterprise organizations can deploy centrally managed CLAUDE.md files that apply to all users.287Organizations can deploy centrally managed CLAUDE.md files that apply to all users.

88 288 

89To set up organization-level memory management:289To set up organization-level memory management:

90 290 

911. Create the enterprise memory file in the appropriate location for your operating system:2911. Create the managed memory file at the **Managed policy** location shown in the [memory types table above](#determine-memory-type).

92 

93* macOS: `/Library/Application Support/ClaudeCode/CLAUDE.md`

94* Linux/WSL: `/etc/claude-code/CLAUDE.md`

95* Windows: `C:\ProgramData\ClaudeCode\CLAUDE.md`

96 292 

972. Deploy via your configuration management system (MDM, Group Policy, Ansible, etc.) to ensure consistent distribution across all developer machines.2932. Deploy via your configuration management system (MDM, Group Policy, Ansible, etc.) to ensure consistent distribution across all developer machines.

98 294 

microsoft-foundry.md +124 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Claude Code on Microsoft Foundry

6 

7> Learn about configuring Claude Code through Microsoft Foundry, including setup, configuration, and troubleshooting.

8 

9## Prerequisites

10 

11Before configuring Claude Code with Microsoft Foundry, ensure you have:

12 

13* An Azure subscription with access to Microsoft Foundry

14* RBAC permissions to create Microsoft Foundry resources and deployments

15* Azure CLI installed and configured (optional - only needed if you don't have another mechanism for getting credentials)

16 

17<Note>

18 If you are deploying Claude Code to multiple users, [pin your model versions](#4-pin-model-versions) to prevent breakage when Anthropic releases new models.

19</Note>

20 

21## Setup

22 

23### 1. Provision Microsoft Foundry resource

24 

25First, create a Claude resource in Azure:

26 

271. Navigate to the [Microsoft Foundry portal](https://ai.azure.com/)

282. Create a new resource, noting your resource name

293. Create deployments for the Claude models:

30 * Claude Opus

31 * Claude Sonnet

32 * Claude Haiku

33 

34### 2. Configure Azure credentials

35 

36Claude Code supports two authentication methods for Microsoft Foundry. Choose the method that best fits your security requirements.

37 

38**Option A: API key authentication**

39 

401. Navigate to your resource in the Microsoft Foundry portal

412. Go to the **Endpoints and keys** section

423. Copy **API Key**

434. Set the environment variable:

44 

45```bash theme={null}

46export ANTHROPIC_FOUNDRY_API_KEY=your-azure-api-key

47```

48 

49**Option B: Microsoft Entra ID authentication**

50 

51When `ANTHROPIC_FOUNDRY_API_KEY` is not set, Claude Code automatically uses the Azure SDK [default credential chain](https://learn.microsoft.com/en-us/azure/developer/javascript/sdk/authentication/credential-chains#defaultazurecredential-overview).

52This supports a variety of methods for authenticating local and remote workloads.

53 

54On local environments, you commonly may use the Azure CLI:

55 

56```bash theme={null}

57az login

58```

59 

60<Note>

61 When using Microsoft Foundry, the `/login` and `/logout` commands are disabled since authentication is handled through Azure credentials.

62</Note>

63 

64### 3. Configure Claude Code

65 

66Set the following environment variables to enable Microsoft Foundry:

67 

68```bash theme={null}

69# Enable Microsoft Foundry integration

70export CLAUDE_CODE_USE_FOUNDRY=1

71 

72# Azure resource name (replace {resource} with your resource name)

73export ANTHROPIC_FOUNDRY_RESOURCE={resource}

74# Or provide the full base URL:

75# export ANTHROPIC_FOUNDRY_BASE_URL=https://{resource}.services.ai.azure.com/anthropic

76```

77 

78### 4. Pin model versions

79 

80<Warning>

81 Pin specific model versions for every deployment. If you use model aliases (`sonnet`, `opus`, `haiku`) without pinning, Claude Code may attempt to use a newer model version that isn't available in your Foundry account, breaking existing users when Anthropic releases updates. When you create Azure deployments, select a specific model version rather than "auto-update to latest."

82</Warning>

83 

84Set the model variables to match the deployment names you created in step 1:

85 

86```bash theme={null}

87export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-6'

88export ANTHROPIC_DEFAULT_SONNET_MODEL='claude-sonnet-4-6'

89export ANTHROPIC_DEFAULT_HAIKU_MODEL='claude-haiku-4-5'

90```

91 

92For current and legacy model IDs, see [Models overview](https://platform.claude.com/docs/en/about-claude/models/overview). See [Model configuration](/en/model-config#pin-models-for-third-party-deployments) for the full list of environment variables.

93 

94## Azure RBAC configuration

95 

96The `Azure AI User` and `Cognitive Services User` default roles include all required permissions for invoking Claude models.

97 

98For more restrictive permissions, create a custom role with the following:

99 

100```json theme={null}

101{

102 "permissions": [

103 {

104 "dataActions": [

105 "Microsoft.CognitiveServices/accounts/providers/*"

106 ]

107 }

108 ]

109}

110```

111 

112For details, see [Microsoft Foundry RBAC documentation](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/rbac-azure-ai-foundry).

113 

114## Troubleshooting

115 

116If you receive an error "Failed to get token from azureADTokenProvider: ChainedTokenCredential authentication failed":

117 

118* Configure Entra ID on the environment, or set `ANTHROPIC_FOUNDRY_API_KEY`.

119 

120## Additional resources

121 

122* [Microsoft Foundry documentation](https://learn.microsoft.com/en-us/azure/ai-foundry/what-is-azure-ai-foundry)

123* [Microsoft Foundry models](https://ai.azure.com/explore/models)

124* [Microsoft Foundry pricing](https://azure.microsoft.com/en-us/pricing/details/ai-foundry/)

model-config.md +130 −27

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Model configuration5# Model configuration

2 6 

3> Learn about the Claude Code model configuration, including model aliases like `opusplan`7> Learn about the Claude Code model configuration, including model aliases like `opusplan`

4 8 

5## Available models9## Available models

6 10 

7For the `model` setting in Claude Code, you can either configure:11For the `model` setting in Claude Code, you can configure either:

8 12 

9* A **model alias**13* A **model alias**

10* A full **[model name](/en/docs/about-claude/models/overview#model-names)**14* A **model name**

11* For Bedrock, an ARN15 * Anthropic API: A full **[model name](https://platform.claude.com/docs/en/about-claude/models/overview)**

16 * Bedrock: an inference profile ARN

17 * Foundry: a deployment name

18 * Vertex: a version name

12 19 

13### Model aliases20### Model aliases

14 21 


16remembering exact version numbers:23remembering exact version numbers:

17 24 

18| Model alias | Behavior |25| Model alias | Behavior |

19| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |26| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

20| **`default`** | Recommended model setting, depending on your account type |27| **`default`** | Recommended model setting, depending on your account type |

21| **`sonnet`** | Uses the latest Sonnet model (currently Sonnet 4.5) for daily coding tasks |28| **`sonnet`** | Uses the latest Sonnet model (currently Sonnet 4.6) for daily coding tasks |

22| **`opus`** | Uses Opus model (currently Opus 4.1) for specialized complex reasoning tasks |29| **`opus`** | Uses the latest Opus model (currently Opus 4.6) for complex reasoning tasks |

23| **`haiku`** | Uses the fast and efficient Haiku model for simple tasks |30| **`haiku`** | Uses the fast and efficient Haiku model for simple tasks |

24| **`sonnet[1m]`** | Uses Sonnet with a [1 million token context window](/en/docs/build-with-claude/context-windows#1m-token-context-window) window for long sessions |31| **`sonnet[1m]`** | Uses Sonnet with a [1 million token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows#1m-token-context-window) for long sessions |

25| **`opusplan`** | Special mode that uses `opus` during plan mode, then switches to `sonnet` for execution |32| **`opusplan`** | Special mode that uses `opus` during plan mode, then switches to `sonnet` for execution |

26 33 

34Aliases always point to the latest version. To pin to a specific version, use the full model name (for example, `claude-opus-4-6`) or set the corresponding environment variable like `ANTHROPIC_DEFAULT_OPUS_MODEL`.

35 

27### Setting your model36### Setting your model

28 37 

29You can configure your model in several ways, listed in order of priority:38You can configure your model in several ways, listed in order of priority:


55}64}

56```65```

57 66 

67## Restrict model selection

68 

69Enterprise administrators can use `availableModels` in [managed or policy settings](/en/settings#settings-files) to restrict which models users can select.

70 

71When `availableModels` is set, users cannot switch to models not in the list via `/model`, `--model` flag, Config tool, or `ANTHROPIC_MODEL` environment variable.

72 

73```json theme={null}

74{

75 "availableModels": ["sonnet", "haiku"]

76}

77```

78 

79### Default model behavior

80 

81The Default option in the model picker is not affected by `availableModels`. It always remains available and represents the system's runtime default [based on the user's subscription tier](#default-model-setting).

82 

83Even with `availableModels: []`, users can still use Claude Code with the Default model for their tier.

84 

85### Control the model users run on

86 

87To fully control the model experience, use `availableModels` together with the `model` setting:

88 

89* **availableModels**: restricts what users can switch to

90* **model**: sets the explicit model override, taking precedence over the Default

91 

92This example ensures all users run Sonnet 4.6 and can only choose between Sonnet and Haiku:

93 

94```json theme={null}

95{

96 "model": "sonnet",

97 "availableModels": ["sonnet", "haiku"]

98}

99```

100 

101### Merge behavior

102 

103When `availableModels` is set at multiple levels, such as user settings and project settings, arrays are merged and deduplicated. To enforce a strict allowlist, set `availableModels` in managed or policy settings which take highest priority.

104 

58## Special model behavior105## Special model behavior

59 106 

60### `default` model setting107### `default` model setting

61 108 

62The behavior of `default` depends on your account type.109The behavior of `default` depends on your account type:

110 

111* **Max and Team Premium**: defaults to Opus 4.6

112* **Pro and Team Standard**: defaults to Sonnet 4.6

113* **Enterprise**: Opus 4.6 is available but not the default

63 114 

64For certain Max users, Claude Code will automatically fall back to Sonnet if you115Claude Code may automatically fall back to Sonnet if you hit a usage threshold with Opus.

65hit a usage threshold with Opus.

66 116 

67### `opusplan` model setting117### `opusplan` model setting

68 118 


76This gives you the best of both worlds: Opus's superior reasoning for planning,126This gives you the best of both worlds: Opus's superior reasoning for planning,

77and Sonnet's efficiency for execution.127and Sonnet's efficiency for execution.

78 128 

79### Extended context with \[1m]129### Adjust effort level

80 130 

81For Console/API users, the `[1m]` suffix can be added to full model names to131[Effort levels](https://platform.claude.com/docs/en/build-with-claude/effort) control Opus 4.6's adaptive reasoning, which dynamically allocates thinking based on task complexity. Lower effort is faster and cheaper for straightforward tasks, while higher effort provides deeper reasoning for complex problems.

82enable a132 

83[1 million token context window](/en/docs/build-with-claude/context-windows#1m-token-context-window).133Three levels are available: **low**, **medium**, and **high** (default).

134 

135**Setting effort:**

136 

137* **In `/model`**: use left/right arrow keys to adjust the effort slider when selecting a model

138* **Environment variable**: set `CLAUDE_CODE_EFFORT_LEVEL=low|medium|high`

139* **Settings**: set `effortLevel` in your settings file

140 

141Effort is currently supported on Opus 4.6. The effort slider appears in `/model` when a supported model is selected.

142 

143### Extended context

144 

145Opus 4.6 and Sonnet 4.6 support a [1 million token context window](https://platform.claude.com/docs/en/build-with-claude/context-windows#1m-token-context-window) for long sessions with large codebases.

146 

147<Note>

148 The 1M context window is currently in beta. Features, pricing, and availability may change.

149</Note>

150 

151Extended context is available for:

152 

153* **API and pay-as-you-go users**: full access to 1M context

154* **Pro, Max, Teams, and Enterprise subscribers**: available with [extra usage](https://support.claude.com/en/articles/12429409-extra-usage-for-paid-claude-plans) enabled

155 

156To disable 1M context entirely, set `CLAUDE_CODE_DISABLE_1M_CONTEXT=1`. This removes 1M model variants from the model picker. See [environment variables](/en/settings#environment-variables).

157 

158Selecting a 1M model does not immediately change billing. Your session uses standard rates until it exceeds 200K tokens of context. Beyond 200K tokens, requests are charged at [long-context pricing](https://platform.claude.com/docs/en/about-claude/pricing#long-context-pricing) with dedicated [rate limits](https://platform.claude.com/docs/en/api/rate-limits#long-context-rate-limits). For subscribers, tokens beyond 200K are billed as extra usage rather than through the subscription.

159 

160If your account supports 1M context, the option appears in the model picker (`/model`) in the latest versions of Claude Code. If you don't see it, try restarting your session.

161 

162You can also use the `[1m]` suffix with model aliases or full model names:

84 163 

85```bash theme={null}164```bash theme={null}

86# Example of using a full model name with the [1m] suffix165# Use the sonnet[1m] alias

87/model anthropic.claude-sonnet-4-5-20250929-v1:0[1m]166/model sonnet[1m]

88```

89 167 

90Note: Extended context models have168# Or append [1m] to a full model name

91[different pricing](/en/docs/about-claude/pricing#long-context-pricing).169/model claude-sonnet-4-6[1m]

170```

92 171 

93## Checking your current model172## Checking your current model

94 173 

95You can see which model you're currently using in several ways:174You can see which model you're currently using in several ways:

96 175 

971. In [status line](/en/docs/claude-code/statusline) (if configured)1761. In [status line](/en/statusline) (if configured)

982. In `/status`, which also displays your account information.1772. In `/status`, which also displays your account information.

99 178 

100## Environment variables179## Environment variables

101 180 

102You can use the following environment variables, which must be full **model181You can use the following environment variables, which must be full **model

103names**, to control the model names that the aliases map to.182names** (or equivalent for your API provider), to control the model names that the aliases map to.

104 183 

105| Env var | Description |184| Environment variable | Description |

106| -------------------------------- | -------------------------------------------------------------------------------------------------------------- |185| -------------------------------- | --------------------------------------------------------------------------------------------- |

107| `ANTHROPIC_DEFAULT_OPUS_MODEL` | The model to use for `opus`, or for `opusplan` when Plan Mode is active. |186| `ANTHROPIC_DEFAULT_OPUS_MODEL` | The model to use for `opus`, or for `opusplan` when Plan Mode is active. |

108| `ANTHROPIC_DEFAULT_SONNET_MODEL` | The model to use for `sonnet`, or for `opusplan` when Plan Mode is not active. |187| `ANTHROPIC_DEFAULT_SONNET_MODEL` | The model to use for `sonnet`, or for `opusplan` when Plan Mode is not active. |

109| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | The model to use for `haiku`, or [background functionality](/en/docs/claude-code/costs#background-token-usage) |188| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | The model to use for `haiku`, or [background functionality](/en/costs#background-token-usage) |

110| `CLAUDE_CODE_SUBAGENT_MODEL` | The model to use for [subagents](/en/docs/claude-code/sub-agents) |189| `CLAUDE_CODE_SUBAGENT_MODEL` | The model to use for [subagents](/en/sub-agents) |

111 190 

112Note: `ANTHROPIC_SMALL_FAST_MODEL` is deprecated in favor of191Note: `ANTHROPIC_SMALL_FAST_MODEL` is deprecated in favor of

113`ANTHROPIC_DEFAULT_HAIKU_MODEL`.192`ANTHROPIC_DEFAULT_HAIKU_MODEL`.

114 193 

194### Pin models for third-party deployments

195 

196When deploying Claude Code through [Bedrock](/en/amazon-bedrock), [Vertex AI](/en/google-vertex-ai), or [Foundry](/en/microsoft-foundry), pin model versions before rolling out to users.

197 

198Without pinning, Claude Code uses model aliases (`sonnet`, `opus`, `haiku`) that resolve to the latest version. When Anthropic releases a new model, users whose accounts don't have the new version enabled will break silently.

199 

200<Warning>

201 Set all three model environment variables to specific version IDs as part of your initial setup. Skipping this step means a Claude Code update can break your users without any action on your part.

202</Warning>

203 

204Use the following environment variables with version-specific model IDs for your provider:

205 

206| Provider | Example |

207| :-------- | :---------------------------------------------------------------------- |

208| Bedrock | `export ANTHROPIC_DEFAULT_OPUS_MODEL='us.anthropic.claude-opus-4-6-v1'` |

209| Vertex AI | `export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-6'` |

210| Foundry | `export ANTHROPIC_DEFAULT_OPUS_MODEL='claude-opus-4-6'` |

211 

212Apply the same pattern for `ANTHROPIC_DEFAULT_SONNET_MODEL` and `ANTHROPIC_DEFAULT_HAIKU_MODEL`. For current and legacy model IDs across all providers, see [Models overview](https://platform.claude.com/docs/en/about-claude/models/overview). To upgrade users to a new model version, update these environment variables and redeploy.

213 

214<Note>

215 The `settings.availableModels` allowlist still applies when using third-party providers. Filtering matches on the model alias (`opus`, `sonnet`, `haiku`), not the provider-specific model ID.

216</Note>

217 

115### Prompt caching configuration218### Prompt caching configuration

116 219 

117Claude Code automatically uses [prompt caching](/en/docs/build-with-claude/prompt-caching) to optimize performance and reduce costs. You can disable prompt caching globally or for specific model tiers:220Claude Code automatically uses [prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching) to optimize performance and reduce costs. You can disable prompt caching globally or for specific model tiers:

118 221 

119| Env var | Description |222| Environment variable | Description |

120| ------------------------------- | ---------------------------------------------------------------------------------------------- |223| ------------------------------- | ---------------------------------------------------------------------------------------------- |

121| `DISABLE_PROMPT_CACHING` | Set to `1` to disable prompt caching for all models (takes precedence over per-model settings) |224| `DISABLE_PROMPT_CACHING` | Set to `1` to disable prompt caching for all models (takes precedence over per-model settings) |

122| `DISABLE_PROMPT_CACHING_HAIKU` | Set to `1` to disable prompt caching for Haiku models only |225| `DISABLE_PROMPT_CACHING_HAIKU` | Set to `1` to disable prompt caching for Haiku models only |

monitoring-usage.md +128 −100

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Monitoring5# Monitoring

2 6 

3> Learn how to enable and configure OpenTelemetry for Claude Code.7> Learn how to enable and configure OpenTelemetry for Claude Code.

4 8 

5Claude Code supports OpenTelemetry (OTel) metrics and events for monitoring and observability.9Track Claude Code usage, costs, and tool activity across your organization by exporting telemetry data through OpenTelemetry (OTel). Claude Code exports metrics as time series data via the standard metrics protocol, and events via the logs/events protocol. Configure your metrics and logs backends to match your monitoring requirements.

6 

7All metrics are time series data exported via OpenTelemetry's standard metrics protocol, and events are exported via OpenTelemetry's logs/events protocol. It is the user's responsibility to ensure their metrics and logs backends are properly configured and that the aggregation granularity meets their monitoring requirements.

8 

9<Note>

10 OpenTelemetry support is currently in beta and details are subject to change.

11</Note>

12 10 

13## Quick Start11## Quick start

14 12 

15Configure OpenTelemetry using environment variables:13Configure OpenTelemetry using environment variables:

16 14 


43 41 

44For full configuration options, see the [OpenTelemetry specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options).42For full configuration options, see the [OpenTelemetry specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options).

45 43 

46## Administrator Configuration44## Administrator configuration

47 45 

48Administrators can configure OpenTelemetry settings for all users through the managed settings file. This allows for centralized control of telemetry settings across an organization. See the [settings precedence](/en/docs/claude-code/settings#settings-precedence) for more information about how settings are applied.46Administrators can configure OpenTelemetry settings for all users through the [managed settings file](/en/settings#settings-files). This allows for centralized control of telemetry settings across an organization. See the [settings precedence](/en/settings#settings-precedence) for more information about how settings are applied.

49 

50The managed settings file is located at:

51 

52* macOS: `/Library/Application Support/ClaudeCode/managed-settings.json`

53* Linux and WSL: `/etc/claude-code/managed-settings.json`

54* Windows: `C:\ProgramData\ClaudeCode\managed-settings.json`

55 47 

56Example managed settings configuration:48Example managed settings configuration:

57 49 


62 "OTEL_METRICS_EXPORTER": "otlp",54 "OTEL_METRICS_EXPORTER": "otlp",

63 "OTEL_LOGS_EXPORTER": "otlp",55 "OTEL_LOGS_EXPORTER": "otlp",

64 "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",56 "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",

65 "OTEL_EXPORTER_OTLP_ENDPOINT": "http://collector.company.com:4317",57 "OTEL_EXPORTER_OTLP_ENDPOINT": "http://collector.example.com:4317",

66 "OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer company-token"58 "OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer example-token"

67 }59 }

68}60}

69```61```


72 Managed settings can be distributed via MDM (Mobile Device Management) or other device management solutions. Environment variables defined in the managed settings file have high precedence and cannot be overridden by users.64 Managed settings can be distributed via MDM (Mobile Device Management) or other device management solutions. Environment variables defined in the managed settings file have high precedence and cannot be overridden by users.

73</Note>65</Note>

74 66 

75## Configuration Details67## Configuration details

76 68 

77### Common Configuration Variables69### Common configuration variables

78 70 

79| Environment Variable | Description | Example Values |71| Environment Variable | Description | Example Values |

80| ----------------------------------------------- | --------------------------------------------------------- | ------------------------------------ |72| --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |

81| `CLAUDE_CODE_ENABLE_TELEMETRY` | Enables telemetry collection (required) | `1` |73| `CLAUDE_CODE_ENABLE_TELEMETRY` | Enables telemetry collection (required) | `1` |

82| `OTEL_METRICS_EXPORTER` | Metrics exporter type(s) (comma-separated) | `console`, `otlp`, `prometheus` |74| `OTEL_METRICS_EXPORTER` | Metrics exporter types, comma-separated | `console`, `otlp`, `prometheus` |

83| `OTEL_LOGS_EXPORTER` | Logs/events exporter type(s) (comma-separated) | `console`, `otlp` |75| `OTEL_LOGS_EXPORTER` | Logs/events exporter types, comma-separated | `console`, `otlp` |

84| `OTEL_EXPORTER_OTLP_PROTOCOL` | Protocol for OTLP exporter (all signals) | `grpc`, `http/json`, `http/protobuf` |76| `OTEL_EXPORTER_OTLP_PROTOCOL` | Protocol for OTLP exporter, applies to all signals | `grpc`, `http/json`, `http/protobuf` |

85| `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP collector endpoint (all signals) | `http://localhost:4317` |77| `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP collector endpoint for all signals | `http://localhost:4317` |

86| `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL` | Protocol for metrics (overrides general) | `grpc`, `http/json`, `http/protobuf` |78| `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL` | Protocol for metrics, overrides general setting | `grpc`, `http/json`, `http/protobuf` |

87| `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` | OTLP metrics endpoint (overrides general) | `http://localhost:4318/v1/metrics` |79| `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` | OTLP metrics endpoint, overrides general setting | `http://localhost:4318/v1/metrics` |

88| `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` | Protocol for logs (overrides general) | `grpc`, `http/json`, `http/protobuf` |80| `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` | Protocol for logs, overrides general setting | `grpc`, `http/json`, `http/protobuf` |

89| `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | OTLP logs endpoint (overrides general) | `http://localhost:4318/v1/logs` |81| `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | OTLP logs endpoint, overrides general setting | `http://localhost:4318/v1/logs` |

90| `OTEL_EXPORTER_OTLP_HEADERS` | Authentication headers for OTLP | `Authorization=Bearer token` |82| `OTEL_EXPORTER_OTLP_HEADERS` | Authentication headers for OTLP | `Authorization=Bearer token` |

91| `OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY` | Client key for mTLS authentication | Path to client key file |83| `OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY` | Client key for mTLS authentication | Path to client key file |

92| `OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE` | Client certificate for mTLS authentication | Path to client cert file |84| `OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE` | Client certificate for mTLS authentication | Path to client cert file |

93| `OTEL_METRIC_EXPORT_INTERVAL` | Export interval in milliseconds (default: 60000) | `5000`, `60000` |85| `OTEL_METRIC_EXPORT_INTERVAL` | Export interval in milliseconds (default: 60000) | `5000`, `60000` |

94| `OTEL_LOGS_EXPORT_INTERVAL` | Logs export interval in milliseconds (default: 5000) | `1000`, `10000` |86| `OTEL_LOGS_EXPORT_INTERVAL` | Logs export interval in milliseconds (default: 5000) | `1000`, `10000` |

95| `OTEL_LOG_USER_PROMPTS` | Enable logging of user prompt content (default: disabled) | `1` to enable |87| `OTEL_LOG_USER_PROMPTS` | Enable logging of user prompt content (default: disabled) | `1` to enable |

88| `OTEL_LOG_TOOL_DETAILS` | Enable logging of MCP server/tool names and skill names in tool events (default: disabled) | `1` to enable |

89| `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` | Metrics temporality preference (default: `delta`). Set to `cumulative` if your backend expects cumulative temporality | `delta`, `cumulative` |

90| `CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS` | Interval for refreshing dynamic headers (default: 1740000ms / 29 minutes) | `900000` |

96 91 

97### Metrics Cardinality Control92### Metrics cardinality control

98 93 

99The following environment variables control which attributes are included in metrics to manage cardinality:94The following environment variables control which attributes are included in metrics to manage cardinality:

100 95 


106 101 

107These variables help control the cardinality of metrics, which affects storage requirements and query performance in your metrics backend. Lower cardinality generally means better performance and lower storage costs but less granular data for analysis.102These variables help control the cardinality of metrics, which affects storage requirements and query performance in your metrics backend. Lower cardinality generally means better performance and lower storage costs but less granular data for analysis.

108 103 

109### Dynamic Headers104### Dynamic headers

110 105 

111For enterprise environments that require dynamic authentication, you can configure a script to generate headers dynamically:106For enterprise environments that require dynamic authentication, you can configure a script to generate headers dynamically:

112 107 

113#### Settings Configuration108#### Settings configuration

114 109 

115Add to your `.claude/settings.json`:110Add to your `.claude/settings.json`:

116 111 


120}115}

121```116```

122 117 

123#### Script Requirements118#### Script requirements

124 119 

125The script must output valid JSON with string key-value pairs representing HTTP headers:120The script must output valid JSON with string key-value pairs representing HTTP headers:

126 121 


130echo "{\"Authorization\": \"Bearer $(get-token.sh)\", \"X-API-Key\": \"$(get-api-key.sh)\"}"125echo "{\"Authorization\": \"Bearer $(get-token.sh)\", \"X-API-Key\": \"$(get-api-key.sh)\"}"

131```126```

132 127 

133#### Important Limitations128#### Refresh behavior

134 129 

135**Headers are fetched only at startup, not during runtime.** This is due to OpenTelemetry exporter architecture limitations.130The headers helper script runs at startup and periodically thereafter to support token refresh. By default, the script runs every 29 minutes. Customize the interval with the `CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS` environment variable.

136 131 

137For scenarios requiring frequent token refresh, use an OpenTelemetry Collector as a proxy that can refresh its own headers.132### Multi-team organization support

138 

139### Multi-Team Organization Support

140 133 

141Organizations with multiple teams or departments can add custom attributes to distinguish between different groups using the `OTEL_RESOURCE_ATTRIBUTES` environment variable:134Organizations with multiple teams or departments can add custom attributes to distinguish between different groups using the `OTEL_RESOURCE_ATTRIBUTES` environment variable:

142 135 


155<Warning>148<Warning>

156 **Important formatting requirements for OTEL\_RESOURCE\_ATTRIBUTES:**149 **Important formatting requirements for OTEL\_RESOURCE\_ATTRIBUTES:**

157 150 

158 The `OTEL_RESOURCE_ATTRIBUTES` environment variable follows the [W3C Baggage specification](https://www.w3.org/TR/baggage/), which has strict formatting requirements:151 The `OTEL_RESOURCE_ATTRIBUTES` environment variable uses comma-separated key=value pairs with strict formatting requirements:

159 152 

160 * **No spaces allowed**: Values cannot contain spaces. For example, `user.organizationName=My Company` is invalid153 * **No spaces allowed**: Values cannot contain spaces. For example, `user.organizationName=My Company` is invalid

161 * **Format**: Must be comma-separated key=value pairs: `key1=value1,key2=value2`154 * **Format**: Must be comma-separated key=value pairs: `key1=value1,key2=value2`


176 export OTEL_RESOURCE_ATTRIBUTES="org.name=John%27s%20Organization"169 export OTEL_RESOURCE_ATTRIBUTES="org.name=John%27s%20Organization"

177 ```170 ```

178 171 

179 Note: Quoting the entire key=value pair (e.g., `"key=value with spaces"`) is not supported by the OpenTelemetry specification and will result in attributes being prefixed with quotes.172 Note: wrapping values in quotes doesn't escape spaces. For example, `org.name="My Company"` results in the literal value `"My Company"` (with quotes included), not `My Company`.

180</Warning>173</Warning>

181 174 

182### Example Configurations175### Example configurations

176 

177Set these environment variables before running `claude`. Each block shows a complete configuration for a different exporter or deployment scenario:

183 178 

184```bash theme={null}179```bash theme={null}

185# Console debugging (1-second intervals)180# Console debugging (1-second intervals)


207export OTEL_METRICS_EXPORTER=otlp202export OTEL_METRICS_EXPORTER=otlp

208export OTEL_LOGS_EXPORTER=otlp203export OTEL_LOGS_EXPORTER=otlp

209export OTEL_EXPORTER_OTLP_METRICS_PROTOCOL=http/protobuf204export OTEL_EXPORTER_OTLP_METRICS_PROTOCOL=http/protobuf

210export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://metrics.company.com:4318205export OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://metrics.example.com:4318

211export OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=grpc206export OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=grpc

212export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://logs.company.com:4317207export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://logs.example.com:4317

213 208 

214# Metrics only (no events/logs)209# Metrics only (no events/logs)

215export CLAUDE_CODE_ENABLE_TELEMETRY=1210export CLAUDE_CODE_ENABLE_TELEMETRY=1


224export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317219export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

225```220```

226 221 

227## Available Metrics and Events222## Available metrics and events

228 223 

229### Standard Attributes224### Standard attributes

230 225 

231All metrics and events share these standard attributes:226All metrics and events share these standard attributes:

232 227 

233| Attribute | Description | Controlled By |228| Attribute | Description | Controlled By |

234| ------------------- | ------------------------------------------------------------- | --------------------------------------------------- |229| ------------------- | -------------------------------------------------------------------------------- | --------------------------------------------------- |

235| `session.id` | Unique session identifier | `OTEL_METRICS_INCLUDE_SESSION_ID` (default: true) |230| `session.id` | Unique session identifier | `OTEL_METRICS_INCLUDE_SESSION_ID` (default: true) |

236| `app.version` | Current Claude Code version | `OTEL_METRICS_INCLUDE_VERSION` (default: false) |231| `app.version` | Current Claude Code version | `OTEL_METRICS_INCLUDE_VERSION` (default: false) |

237| `organization.id` | Organization UUID (when authenticated) | Always included when available |232| `organization.id` | Organization UUID (when authenticated) | Always included when available |

238| `user.account_uuid` | Account UUID (when authenticated) | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID` (default: true) |233| `user.account_uuid` | Account UUID (when authenticated) | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID` (default: true) |

239| `terminal.type` | Terminal type (e.g., `iTerm.app`, `vscode`, `cursor`, `tmux`) | Always included when detected |234| `user.id` | Anonymous device/installation identifier, generated per Claude Code installation | Always included |

235| `user.email` | User email address (when authenticated via OAuth) | Always included when available |

236| `terminal.type` | Terminal type, such as `iTerm.app`, `vscode`, `cursor`, or `tmux` | Always included when detected |

240 237 

241### Metrics238### Metrics

242 239 


253| `claude_code.code_edit_tool.decision` | Count of code editing tool permission decisions | count |250| `claude_code.code_edit_tool.decision` | Count of code editing tool permission decisions | count |

254| `claude_code.active_time.total` | Total active time in seconds | s |251| `claude_code.active_time.total` | Total active time in seconds | s |

255 252 

256### Metric Details253### Metric details

257 254 

258#### Session Counter255Each metric includes the standard attributes listed above. Metrics with additional context-specific attributes are noted below.

256 

257#### Session counter

259 258 

260Incremented at the start of each session.259Incremented at the start of each session.

261 260 


263 262 

264* All [standard attributes](#standard-attributes)263* All [standard attributes](#standard-attributes)

265 264 

266#### Lines of Code Counter265#### Lines of code counter

267 266 

268Incremented when code is added or removed.267Incremented when code is added or removed.

269 268 


272* All [standard attributes](#standard-attributes)271* All [standard attributes](#standard-attributes)

273* `type`: (`"added"`, `"removed"`)272* `type`: (`"added"`, `"removed"`)

274 273 

275#### Pull Request Counter274#### Pull request counter

276 275 

277Incremented when creating pull requests via Claude Code.276Incremented when creating pull requests via Claude Code.

278 277 


280 279 

281* All [standard attributes](#standard-attributes)280* All [standard attributes](#standard-attributes)

282 281 

283#### Commit Counter282#### Commit counter

284 283 

285Incremented when creating git commits via Claude Code.284Incremented when creating git commits via Claude Code.

286 285 


288 287 

289* All [standard attributes](#standard-attributes)288* All [standard attributes](#standard-attributes)

290 289 

291#### Cost Counter290#### Cost counter

292 291 

293Incremented after each API request.292Incremented after each API request.

294 293 

295**Attributes**:294**Attributes**:

296 295 

297* All [standard attributes](#standard-attributes)296* All [standard attributes](#standard-attributes)

298* `model`: Model identifier (e.g., "claude-sonnet-4-5-20250929")297* `model`: Model identifier (for example, "claude-sonnet-4-6")

299 298 

300#### Token Counter299#### Token counter

301 300 

302Incremented after each API request.301Incremented after each API request.

303 302 


305 304 

306* All [standard attributes](#standard-attributes)305* All [standard attributes](#standard-attributes)

307* `type`: (`"input"`, `"output"`, `"cacheRead"`, `"cacheCreation"`)306* `type`: (`"input"`, `"output"`, `"cacheRead"`, `"cacheCreation"`)

308* `model`: Model identifier (e.g., "claude-sonnet-4-5-20250929")307* `model`: Model identifier (for example, "claude-sonnet-4-6")

309 308 

310#### Code Edit Tool Decision Counter309#### Code edit tool decision counter

311 310 

312Incremented when user accepts or rejects Edit, Write, or NotebookEdit tool usage.311Incremented when user accepts or rejects Edit, Write, or NotebookEdit tool usage.

313 312 

314**Attributes**:313**Attributes**:

315 314 

316* All [standard attributes](#standard-attributes)315* All [standard attributes](#standard-attributes)

317* `tool`: Tool name (`"Edit"`, `"Write"`, `"NotebookEdit"`)316* `tool_name`: Tool name (`"Edit"`, `"Write"`, `"NotebookEdit"`)

318* `decision`: User decision (`"accept"`, `"reject"`)317* `decision`: User decision (`"accept"`, `"reject"`)

319* `language`: Programming language of the edited file (e.g., `"TypeScript"`, `"Python"`, `"JavaScript"`, `"Markdown"`). Returns `"unknown"` for unrecognized file extensions.318* `source`: Decision source - `"config"`, `"hook"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`

319* `language`: Programming language of the edited file, such as `"TypeScript"`, `"Python"`, `"JavaScript"`, or `"Markdown"`. Returns `"unknown"` for unrecognized file extensions.

320 320 

321#### Active Time Counter321#### Active time counter

322 322 

323Tracks actual time spent actively using Claude Code (not idle time). This metric is incremented during user interactions such as typing prompts or receiving responses.323Tracks actual time spent actively using Claude Code, excluding idle time. This metric is incremented during user interactions (typing, reading responses) and during CLI processing (tool execution, AI response generation).

324 324 

325**Attributes**:325**Attributes**:

326 326 

327* All [standard attributes](#standard-attributes)327* All [standard attributes](#standard-attributes)

328* `type`: `"user"` for keyboard interactions, `"cli"` for tool execution and AI responses

328 329 

329### Events330### Events

330 331 

331Claude Code exports the following events via OpenTelemetry logs/events (when `OTEL_LOGS_EXPORTER` is configured):332Claude Code exports the following events via OpenTelemetry logs/events (when `OTEL_LOGS_EXPORTER` is configured):

332 333 

333#### User Prompt Event334#### Event correlation attributes

335 

336When a user submits a prompt, Claude Code may make multiple API calls and run several tools. The `prompt.id` attribute lets you tie all of those events back to the single prompt that triggered them.

337 

338| Attribute | Description |

339| ----------- | ------------------------------------------------------------------------------------ |

340| `prompt.id` | UUID v4 identifier linking all events produced while processing a single user prompt |

341 

342To trace all activity triggered by a single prompt, filter your events by a specific `prompt.id` value. This returns the user\_prompt event, any api\_request events, and any tool\_result events that occurred while processing that prompt.

343 

344<Note>

345 `prompt.id` is intentionally excluded from metrics because each prompt generates a unique ID, which would create an ever-growing number of time series. Use it for event-level analysis and audit trails only.

346</Note>

347 

348#### User prompt event

334 349 

335Logged when a user submits a prompt.350Logged when a user submits a prompt.

336 351 


341* All [standard attributes](#standard-attributes)356* All [standard attributes](#standard-attributes)

342* `event.name`: `"user_prompt"`357* `event.name`: `"user_prompt"`

343* `event.timestamp`: ISO 8601 timestamp358* `event.timestamp`: ISO 8601 timestamp

359* `event.sequence`: monotonically increasing counter for ordering events within a session

344* `prompt_length`: Length of the prompt360* `prompt_length`: Length of the prompt

345* `prompt`: Prompt content (redacted by default, enable with `OTEL_LOG_USER_PROMPTS=1`)361* `prompt`: Prompt content (redacted by default, enable with `OTEL_LOG_USER_PROMPTS=1`)

346 362 

347#### Tool Result Event363#### Tool result event

348 364 

349Logged when a tool completes execution.365Logged when a tool completes execution.

350 366 


355* All [standard attributes](#standard-attributes)371* All [standard attributes](#standard-attributes)

356* `event.name`: `"tool_result"`372* `event.name`: `"tool_result"`

357* `event.timestamp`: ISO 8601 timestamp373* `event.timestamp`: ISO 8601 timestamp

374* `event.sequence`: monotonically increasing counter for ordering events within a session

358* `tool_name`: Name of the tool375* `tool_name`: Name of the tool

359* `success`: `"true"` or `"false"`376* `success`: `"true"` or `"false"`

360* `duration_ms`: Execution time in milliseconds377* `duration_ms`: Execution time in milliseconds

361* `error`: Error message (if failed)378* `error`: Error message (if failed)

362* `decision`: Either `"accept"` or `"reject"`379* `decision_type`: Either `"accept"` or `"reject"`

363* `source`: Decision source - `"config"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`380* `decision_source`: Decision source - `"config"`, `"hook"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`

381* `tool_result_size_bytes`: Size of the tool result in bytes

382* `mcp_server_scope`: MCP server scope identifier (for MCP tools)

364* `tool_parameters`: JSON string containing tool-specific parameters (when available)383* `tool_parameters`: JSON string containing tool-specific parameters (when available)

365 * For Bash tool: includes `bash_command`, `full_command`, `timeout`, `description`, `sandbox`384 * For Bash tool: includes `bash_command`, `full_command`, `timeout`, `description`, `dangerouslyDisableSandbox`, and `git_commit_id` (the commit SHA, when a `git commit` command succeeds)

385 * For MCP tools (when `OTEL_LOG_TOOL_DETAILS=1`): includes `mcp_server_name`, `mcp_tool_name`

386 * For Skill tool (when `OTEL_LOG_TOOL_DETAILS=1`): includes `skill_name`

366 387 

367#### API Request Event388#### API request event

368 389 

369Logged for each API request to Claude.390Logged for each API request to Claude.

370 391 


375* All [standard attributes](#standard-attributes)396* All [standard attributes](#standard-attributes)

376* `event.name`: `"api_request"`397* `event.name`: `"api_request"`

377* `event.timestamp`: ISO 8601 timestamp398* `event.timestamp`: ISO 8601 timestamp

378* `model`: Model used (e.g., "claude-sonnet-4-5-20250929")399* `event.sequence`: monotonically increasing counter for ordering events within a session

400* `model`: Model used (for example, "claude-sonnet-4-6")

379* `cost_usd`: Estimated cost in USD401* `cost_usd`: Estimated cost in USD

380* `duration_ms`: Request duration in milliseconds402* `duration_ms`: Request duration in milliseconds

381* `input_tokens`: Number of input tokens403* `input_tokens`: Number of input tokens

382* `output_tokens`: Number of output tokens404* `output_tokens`: Number of output tokens

383* `cache_read_tokens`: Number of tokens read from cache405* `cache_read_tokens`: Number of tokens read from cache

384* `cache_creation_tokens`: Number of tokens used for cache creation406* `cache_creation_tokens`: Number of tokens used for cache creation

407* `speed`: `"fast"` or `"normal"`, indicating whether fast mode was active

385 408 

386#### API Error Event409#### API error event

387 410 

388Logged when an API request to Claude fails.411Logged when an API request to Claude fails.

389 412 


394* All [standard attributes](#standard-attributes)417* All [standard attributes](#standard-attributes)

395* `event.name`: `"api_error"`418* `event.name`: `"api_error"`

396* `event.timestamp`: ISO 8601 timestamp419* `event.timestamp`: ISO 8601 timestamp

397* `model`: Model used (e.g., "claude-sonnet-4-5-20250929")420* `event.sequence`: monotonically increasing counter for ordering events within a session

421* `model`: Model used (for example, "claude-sonnet-4-6")

398* `error`: Error message422* `error`: Error message

399* `status_code`: HTTP status code (if applicable)423* `status_code`: HTTP status code as a string, or `"undefined"` for non-HTTP errors

400* `duration_ms`: Request duration in milliseconds424* `duration_ms`: Request duration in milliseconds

401* `attempt`: Attempt number (for retried requests)425* `attempt`: Attempt number (for retried requests)

426* `speed`: `"fast"` or `"normal"`, indicating whether fast mode was active

402 427 

403#### Tool Decision Event428#### Tool decision event

404 429 

405Logged when a tool permission decision is made (accept/reject).430Logged when a tool permission decision is made (accept/reject).

406 431 


411* All [standard attributes](#standard-attributes)436* All [standard attributes](#standard-attributes)

412* `event.name`: `"tool_decision"`437* `event.name`: `"tool_decision"`

413* `event.timestamp`: ISO 8601 timestamp438* `event.timestamp`: ISO 8601 timestamp

414* `tool_name`: Name of the tool (e.g., "Read", "Edit", "Write", "NotebookEdit", etc.)439* `event.sequence`: monotonically increasing counter for ordering events within a session

440* `tool_name`: Name of the tool (for example, "Read", "Edit", "Write", "NotebookEdit")

415* `decision`: Either `"accept"` or `"reject"`441* `decision`: Either `"accept"` or `"reject"`

416* `source`: Decision source - `"config"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`442* `source`: Decision source - `"config"`, `"hook"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`

417 443 

418## Interpreting Metrics and Events Data444## Interpret metrics and events data

419 445 

420The metrics exported by Claude Code provide valuable insights into usage patterns and productivity. Here are some common visualizations and analyses you can create:446The exported metrics and events support a range of analyses:

421 447 

422### Usage Monitoring448### Usage monitoring

423 449 

424| Metric | Analysis Opportunity |450| Metric | Analysis Opportunity |

425| ------------------------------------------------------------- | --------------------------------------------------------- |451| ------------------------------------------------------------- | --------------------------------------------------------- |


428| `claude_code.lines_of_code.count` | Measure productivity by tracking code additions/removals |454| `claude_code.lines_of_code.count` | Measure productivity by tracking code additions/removals |

429| `claude_code.commit.count` & `claude_code.pull_request.count` | Understand impact on development workflows |455| `claude_code.commit.count` & `claude_code.pull_request.count` | Understand impact on development workflows |

430 456 

431### Cost Monitoring457### Cost monitoring

432 458 

433The `claude_code.cost.usage` metric helps with:459The `claude_code.cost.usage` metric helps with:

434 460 


439 Cost metrics are approximations. For official billing data, refer to your API provider (Claude Console, AWS Bedrock, or Google Cloud Vertex).465 Cost metrics are approximations. For official billing data, refer to your API provider (Claude Console, AWS Bedrock, or Google Cloud Vertex).

440</Note>466</Note>

441 467 

442### Alerting and Segmentation468### Alerting and segmentation

443 469 

444Common alerts to consider:470Common alerts to consider:

445 471 


449 475 

450All metrics can be segmented by `user.account_uuid`, `organization.id`, `session.id`, `model`, and `app.version`.476All metrics can be segmented by `user.account_uuid`, `organization.id`, `session.id`, `model`, and `app.version`.

451 477 

452### Event Analysis478### Event analysis

453 479 

454The event data provides detailed insights into Claude Code interactions:480The event data provides detailed insights into Claude Code interactions:

455 481 

456**Tool Usage Patterns**: Analyze tool result events to identify:482**Tool Usage Patterns**: analyze tool result events to identify:

457 483 

458* Most frequently used tools484* Most frequently used tools

459* Tool success rates485* Tool success rates

460* Average tool execution times486* Average tool execution times

461* Error patterns by tool type487* Error patterns by tool type

462 488 

463**Performance Monitoring**: Track API request durations and tool execution times to identify performance bottlenecks.489**Performance Monitoring**: track API request durations and tool execution times to identify performance bottlenecks.

464 490 

465## Backend Considerations491## Backend considerations

466 492 

467Your choice of metrics and logs backends will determine the types of analyses you can perform:493Your choice of metrics and logs backends determines the types of analyses you can perform:

468 494 

469### For Metrics:495### For metrics

470 496 

471* **Time series databases (e.g., Prometheus)**: Rate calculations, aggregated metrics497* **Time series databases (for example, Prometheus)**: Rate calculations, aggregated metrics

472* **Columnar stores (e.g., ClickHouse)**: Complex queries, unique user analysis498* **Columnar stores (for example, ClickHouse)**: Complex queries, unique user analysis

473* **Full-featured observability platforms (e.g., Honeycomb, Datadog)**: Advanced querying, visualization, alerting499* **Full-featured observability platforms (for example, Honeycomb, Datadog)**: Advanced querying, visualization, alerting

474 500 

475### For Events/Logs:501### For events/logs

476 502 

477* **Log aggregation systems (e.g., Elasticsearch, Loki)**: Full-text search, log analysis503* **Log aggregation systems (for example, Elasticsearch, Loki)**: Full-text search, log analysis

478* **Columnar stores (e.g., ClickHouse)**: Structured event analysis504* **Columnar stores (for example, ClickHouse)**: Structured event analysis

479* **Full-featured observability platforms (e.g., Honeycomb, Datadog)**: Correlation between metrics and events505* **Full-featured observability platforms (for example, Honeycomb, Datadog)**: Correlation between metrics and events

480 506 

481For organizations requiring Daily/Weekly/Monthly Active User (DAU/WAU/MAU) metrics, consider backends that support efficient unique value queries.507For organizations requiring Daily/Weekly/Monthly Active User (DAU/WAU/MAU) metrics, consider backends that support efficient unique value queries.

482 508 

483## Service Information509## Service information

484 510 

485All metrics and events are exported with the following resource attributes:511All metrics and events are exported with the following resource attributes:

486 512 

487* `service.name`: `claude-code`513* `service.name`: `claude-code`

488* `service.version`: Current Claude Code version514* `service.version`: Current Claude Code version

489* `os.type`: Operating system type (e.g., `linux`, `darwin`, `windows`)515* `os.type`: Operating system type (for example, `linux`, `darwin`, `windows`)

490* `os.version`: Operating system version string516* `os.version`: Operating system version string

491* `host.arch`: Host architecture (e.g., `amd64`, `arm64`)517* `host.arch`: Host architecture (for example, `amd64`, `arm64`)

492* `wsl.version`: WSL version number (only present when running on Windows Subsystem for Linux)518* `wsl.version`: WSL version number (only present when running on Windows Subsystem for Linux)

493* Meter Name: `com.anthropic.claude_code`519* Meter Name: `com.anthropic.claude_code`

494 520 

495## ROI Measurement Resources521## ROI measurement resources

496 522 

497For a comprehensive guide on measuring return on investment for Claude Code, including telemetry setup, cost analysis, productivity metrics, and automated reporting, see the [Claude Code ROI Measurement Guide](https://github.com/anthropics/claude-code-monitoring-guide). This repository provides ready-to-use Docker Compose configurations, Prometheus and OpenTelemetry setups, and templates for generating productivity reports integrated with tools like Linear.523For a comprehensive guide on measuring return on investment for Claude Code, including telemetry setup, cost analysis, productivity metrics, and automated reporting, see the [Claude Code ROI Measurement Guide](https://github.com/anthropics/claude-code-monitoring-guide). This repository provides ready-to-use Docker Compose configurations, Prometheus and OpenTelemetry setups, and templates for generating productivity reports integrated with tools like Linear.

498 524 

499## Security/Privacy Considerations525## Security and privacy

500 526 

501* Telemetry is opt-in and requires explicit configuration527* Telemetry is opt-in and requires explicit configuration

502* Sensitive information like API keys or file contents are never included in metrics or events528* Raw file contents and code snippets are not included in metrics or events. Tool execution events include bash commands and file paths in the `tool_parameters` field, which may contain sensitive values. If your commands may include secrets, configure your telemetry backend to filter or redact `tool_parameters`

503* User prompt content is redacted by default - only prompt length is recorded. To enable user prompt logging, set `OTEL_LOG_USER_PROMPTS=1`529* When authenticated via OAuth, `user.email` is included in telemetry attributes. If this is a concern for your organization, work with your telemetry backend to filter or redact this field

530* User prompt content is not collected by default. Only prompt length is recorded. To include prompt content, set `OTEL_LOG_USER_PROMPTS=1`

531* MCP server/tool names and skill names are not logged by default because they can reveal user-specific configurations. To include them, set `OTEL_LOG_TOOL_DETAILS=1`

504 532 

505## Monitoring Claude Code on Amazon Bedrock533## Monitor Claude Code on Amazon Bedrock

506 534 

507For detailed Claude Code usage monitoring guidance for Amazon Bedrock, see [Claude Code Monitoring Implementation (Bedrock)](https://github.com/aws-solutions-library-samples/guidance-for-claude-code-with-amazon-bedrock/blob/main/assets/docs/MONITORING.md).535For detailed Claude Code usage monitoring guidance for Amazon Bedrock, see [Claude Code Monitoring Implementation (Bedrock)](https://github.com/aws-solutions-library-samples/guidance-for-claude-code-with-amazon-bedrock/blob/main/assets/docs/MONITORING.md).

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Enterprise network configuration5# Enterprise network configuration

2 6 

3> Configure Claude Code for enterprise environments with proxy servers, custom Certificate Authorities (CA), and mutual Transport Layer Security (mTLS) authentication.7> Configure Claude Code for enterprise environments with proxy servers, custom Certificate Authorities (CA), and mutual Transport Layer Security (mTLS) authentication.


5Claude Code supports various enterprise network and security configurations through environment variables. This includes routing traffic through corporate proxy servers, trusting custom Certificate Authorities (CA), and authenticating with mutual Transport Layer Security (mTLS) certificates for enhanced security.9Claude Code supports various enterprise network and security configurations through environment variables. This includes routing traffic through corporate proxy servers, trusting custom Certificate Authorities (CA), and authenticating with mutual Transport Layer Security (mTLS) certificates for enhanced security.

6 10 

7<Note>11<Note>

8 All environment variables shown on this page can also be configured in [`settings.json`](/en/docs/claude-code/settings).12 All environment variables shown on this page can also be configured in [`settings.json`](/en/settings).

9</Note>13</Note>

10 14 

11## Proxy configuration15## Proxy configuration


76 80 

77Claude Code requires access to the following URLs:81Claude Code requires access to the following URLs:

78 82 

79* `api.anthropic.com` - Claude API endpoints83* `api.anthropic.com`: Claude API endpoints

80* `claude.ai` - WebFetch safeguards84* `claude.ai`: authentication for claude.ai accounts

81* `statsig.anthropic.com` - Telemetry and metrics85* `platform.claude.com`: authentication for Anthropic Console accounts

82* `sentry.io` - Error reporting

83 86 

84Ensure these URLs are allowlisted in your proxy configuration and firewall rules. This is especially important when using Claude Code in containerized or restricted network environments.87Ensure these URLs are allowlisted in your proxy configuration and firewall rules. This is especially important when using Claude Code in containerized or restricted network environments.

85 88 

86## Additional resources89## Additional resources

87 90 

88* [Claude Code settings](/en/docs/claude-code/settings)91* [Claude Code settings](/en/settings)

89* [Environment variables reference](/en/docs/claude-code/settings#environment-variables)92* [Environment variables reference](/en/settings#environment-variables)

90* [Troubleshooting guide](/en/docs/claude-code/troubleshooting)93* [Troubleshooting guide](/en/troubleshooting)

output-styles.md +62 −134

Details

1# Output styles1> ## Documentation Index

2 2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> [DEPRECATED] Adapt Claude Code for uses beyond software engineering3> Use this file to discover all available pages before exploring further.

4 

5<Warning>

6 Output styles are **DEPRECATED.** On **November 5, 2025** or later, we'll

7 automatically convert your **user-level** output style files to plugins and

8 stop supporting the output styles feature. Use

9 [plugins](/en/docs/claude-code/plugins) instead. ([example

10 plugin](https://github.com/anthropics/claude-code/tree/main/plugins/explanatory-output-style)

11 for the built-in Explanatory output style)

12</Warning>

13 

14## Deprecation timeline

15 

16As of **November 5, 2025**, Claude Code will:

17 

18* Automatically convert user-level output style files

19 (`~/.claude/output-styles`) to plugins

20* Stop supporting the output styles feature

21* Remove the `/output-style` command and related functionality

22 

23**What you need to do:**

24 

25* Migrate to plugins before November 5, 2025 for a smoother transition

26* Review the migration guide below to understand your options

27 

28## Alternative: Use plugins instead

29 

30Plugins provide more powerful and flexible ways to customize Claude Code's

31behavior. The

32[`explanatory-output-style` plugin](https://github.com/anthropics/claude-code/tree/main/plugins/explanatory-output-style)

33recreates the deprecated Explanatory output style functionality.

34 

35### Example: Explanatory Output Style Plugin

36 

37The `explanatory-output-style` plugin uses a SessionStart hook to inject

38additional context that encourages Claude to provide educational insights.

39Here's what it does:

40 

41* Provides educational insights about implementation choices

42* Explains codebase patterns and decisions

43* Balances task completion with learning opportunities

44 

45### Installing a plugin

46 

47To install a plugin like `explanatory-output-style`:

48 

49```shell Add the marketplace (if not already added) theme={null}

50/plugin marketplace add anthropics/claude-code

51```

52 

53```shell Install the plugin theme={null}

54/plugin install explanatory-output-style@claude-code-plugins

55```

56 

57```shell Restart Claude Code to activate the plugin theme={null}

58/exit

59```

60 

61```shell Disable the plugin theme={null}

62/plugin manage explanatory-output-style@claude-code-plugins

63 

641. Press enter when you see claude-code-marketplace

652. Press space when you see explanatory-output-style to toggle enabled

663. Press down to "Apply changes", then press enter

67 You should see "Disabled 1 plugin. Restart Claude Code to apply changes."

68 

69/exit

70```

71 4 

72For more details on plugins, see the5# Output styles

73[Plugins documentation](/en/docs/claude-code/plugins).

74 

75## Migration guide

76 

77Output styles directly modified Claude Code's system prompt. Here's how to

78achieve similar effects with hooks and subagents, both available through Claude

79Code plugins:

80 

81### Use SessionStart hooks for context injection

82 

83If you used output styles to add context at the start of sessions, use

84[SessionStart hooks](/en/docs/claude-code/hooks#sessionstart) instead.

85 

86The hook's output (stdout) is added to the conversation context. You can also:

87 

88* Run scripts that dynamically generate context

89* Load project-specific information

90 

91<Note>

92 SessionStart hooks, just like CLAUDE.md, do not change the system prompt.

93</Note>

94 

95### Use Subagents for different system prompts

96 

97If you used output styles to change Claude's behavior for specific tasks, use

98[Subagents](/en/docs/claude-code/sub-agents) instead.

99 

100Subagents are specialized AI assistants with:

101 

102* Custom system prompts (must be in a separate context window from main loop)

103* Specific tool access permissions

104* Optional model to use, if not the main loop model

105 

106***

107 

108## Reference: Original output styles documentation

109 6 

110<Note>7> Adapt Claude Code for uses beyond software engineering

111 The content below is preserved for reference only. Output styles are

112 deprecated and will be removed on November 5, 2025. Please migrate to plugins,

113 hooks, or subagents.

114</Note>

115 8 

116Output styles allow you to use Claude Code as any type of agent while keeping9Output styles allow you to use Claude Code as any type of agent while keeping

117its core capabilities, such as running local scripts, reading/writing files, and10its core capabilities, such as running local scripts, reading/writing files, and

118tracking TODOs.11tracking TODOs.

119 12 

120### Built-in output styles13## Built-in output styles

121 14 

122Claude Code's **Default** output style is the existing system prompt, designed15Claude Code's **Default** output style is the existing system prompt, designed

123to help you complete software engineering tasks efficiently.16to help you complete software engineering tasks efficiently.


134 pieces of code yourself. Claude Code will add `TODO(human)` markers in your27 pieces of code yourself. Claude Code will add `TODO(human)` markers in your

135 code for you to implement.28 code for you to implement.

136 29 

137### How output styles work30## How output styles work

138 31 

139Output styles directly modify Claude Code's system prompt.32Output styles directly modify Claude Code's system prompt.

140 33 

141* Non-default output styles exclude instructions specific to code generation and34* All output styles exclude instructions for efficient output (such as

142 efficient output normally built into Claude Code (such as responding concisely35 responding concisely).

143 and verifying code with tests).36* Custom output styles exclude instructions for coding (such as verifying code

144* Instead, these output styles have their own custom instructions added to the37 with tests), unless `keep-coding-instructions` is true.

38* All output styles have their own custom instructions added to the end of the

145 system prompt.39 system prompt.

40* All output styles trigger reminders for Claude to adhere to the output style

41 instructions during the conversation.

146 42 

147### Change your output style43## Change your output style

148 44 

149You can either:45You can either:

150 46 

151* Run `/output-style` to access the menu and select your output style (this can47* Run `/output-style` to access a menu and select your output style (this can

152 also be accessed from the `/config` menu)48 also be accessed from the `/config` menu)

153 49 

154* Run `/output-style [style]`, such as `/output-style explanatory`, to directly50* Run `/output-style [style]`, such as `/output-style explanatory`, to directly

155 switch to a style51 switch to a style

156 52 

157These changes apply to the [local project level](/en/docs/claude-code/settings)53These changes apply to the [local project level](/en/settings) and are saved in

158and are saved in `.claude/settings.local.json`.54`.claude/settings.local.json`. You can also directly edit the `outputStyle`

55field in a settings file at a different level.

56 

57## Create a custom output style

58 

59Custom output styles are Markdown files with frontmatter and the text that will

60be added to the system prompt:

61 

62```markdown theme={null}

63---

64name: My Custom Style

65description:

66 A brief description of what this style does, to be displayed to the user

67---

68 

69# Custom Style Instructions

70 

71You are an interactive CLI tool that helps users with software engineering

72tasks. [Your custom instructions here...]

73 

74## Specific Behaviors

75 

76[Define how the assistant should behave in this style...]

77```

78 

79You can save these files at the user level (`~/.claude/output-styles`) or

80project level (`.claude/output-styles`).

81 

82### Frontmatter

83 

84Output style files support frontmatter, useful for specifying metadata about the

85command:

159 86 

160You can also create your own output style Markdown files and save them either at87| Frontmatter | Purpose | Default |

161the user level (`~/.claude/output-styles`) or the project level88| :------------------------- | :-------------------------------------------------------------------------- | :---------------------- |

162(`.claude/output-styles`).89| `name` | Name of the output style, if not the file name | Inherits from file name |

90| `description` | Description of the output style. Used only in the UI of `/output-style` | None |

91| `keep-coding-instructions` | Whether to keep the parts of Claude Code's system prompt related to coding. | false |

163 92 

164### Comparisons to related features93## Comparisons to related features

165 94 

166#### Output Styles vs. CLAUDE.md vs. --append-system-prompt95### Output Styles vs. CLAUDE.md vs. --append-system-prompt

167 96 

168Output styles completely turn off the parts of Claude Codes default system97Output styles completely "turn off" the parts of Claude Code's default system

169prompt specific to software engineering. Neither CLAUDE.md nor98prompt specific to software engineering. Neither CLAUDE.md nor

170`--append-system-prompt` edit Claude Codes default system prompt. CLAUDE.md99`--append-system-prompt` edit Claude Code's default system prompt. CLAUDE.md

171adds the contents as a user message *following* Claude Codes default system100adds the contents as a user message *following* Claude Code's default system

172prompt. `--append-system-prompt` appends the content to the system prompt.101prompt. `--append-system-prompt` appends the content to the system prompt.

173 102 

174#### Output Styles vs. [Agents](/en/docs/claude-code/sub-agents)103### Output Styles vs. [Agents](/en/sub-agents)

175 104 

176Output styles directly affect the main agent loop and only affect the system105Output styles directly affect the main agent loop and only affect the system

177prompt. Agents are invoked to handle specific tasks and can include additional106prompt. Agents are invoked to handle specific tasks and can include additional

178settings like the model to use, the tools they have available, and some context107settings like the model to use, the tools they have available, and some context

179about when to use the agent.108about when to use the agent.

180 109 

181#### Output Styles vs. [Custom Slash Commands](/en/docs/claude-code/slash-commands)110### Output Styles vs. [Skills](/en/skills)

182 111 

183You can think of output styles as “stored system prompts” and custom slash112Output styles modify how Claude responds (formatting, tone, structure) and are always active once selected. Skills are task-specific prompts that you invoke with `/skill-name` or that Claude loads automatically when relevant. Use output styles for consistent formatting preferences; use skills for reusable workflows and tasks.

184commands as “stored prompts”.

overview.md +174 −70

Details

1# Claude Code overview1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Learn about Claude Code, Anthropic's agentic coding tool that lives in your terminal and helps you turn ideas into code faster than ever before.5# Claude Code overview

4 6 

5## Get started in 30 seconds7> Claude Code is an agentic coding tool that reads your codebase, edits files, runs commands, and integrates with your development tools. Available in your terminal, IDE, desktop app, and browser.

6 8 

7Prerequisites:9Claude Code is an AI-powered coding assistant that helps you build features, fix bugs, and automate development tasks. It understands your entire codebase and can work across multiple files and tools to get things done.

8 10 

9* A [Claude.ai](https://claude.ai) (recommended) or [Claude Console](https://console.anthropic.com/) account11## Get started

10 12 

11**Install Claude Code:**13Choose your environment to get started. Most surfaces require a [Claude subscription](https://claude.com/pricing) or [Anthropic Console](https://console.anthropic.com/) account. The Terminal CLI and VS Code also support [third-party providers](/en/third-party-integrations).

12 14 

13<Tabs>15<Tabs>

14 <Tab title="macOS/Linux">16 <Tab title="Terminal">

17 The full-featured CLI for working with Claude Code directly in your terminal. Edit files, run commands, and manage your entire project from the command line.

18 

19 To install Claude Code, use one of the following methods:

20 

21 <Tabs>

22 <Tab title="Native Install (Recommended)">

23 **macOS, Linux, WSL:**

24 

15 ```bash theme={null}25 ```bash theme={null}

16 curl -fsSL https://claude.ai/install.sh | bash26 curl -fsSL https://claude.ai/install.sh | bash

17 ```27 ```

28 

29 **Windows PowerShell:**

30 

31 ```powershell theme={null}

32 irm https://claude.ai/install.ps1 | iex

33 ```

34 

35 **Windows CMD:**

36 

37 ```batch theme={null}

38 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

39 ```

40 

41 **Windows requires [Git for Windows](https://git-scm.com/downloads/win).** Install it first if you don't have it.

42 

43 <Info>

44 Native installations automatically update in the background to keep you on the latest version.

45 </Info>

18 </Tab>46 </Tab>

19 47 

20 <Tab title="Homebrew">48 <Tab title="Homebrew">

21 ```bash theme={null}49 ```bash theme={null}

22 brew install --cask claude-code50 brew install --cask claude-code

23 ```51 ```

52 

53 <Info>

54 Homebrew installations do not auto-update. Run `brew upgrade claude-code` periodically to get the latest features and security fixes.

55 </Info>

24 </Tab>56 </Tab>

25 57 

26 <Tab title="Windows">58 <Tab title="WinGet">

27 ```powershell theme={null}59 ```powershell theme={null}

28 irm https://claude.ai/install.ps1 | iex60 winget install Anthropic.ClaudeCode

29 ```61 ```

62 

63 <Info>

64 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

65 </Info>

30 </Tab>66 </Tab>

67 </Tabs>

68 

69 Then start Claude Code in any project:

31 70 

32 <Tab title="NPM">

33 ```bash theme={null}71 ```bash theme={null}

34 npm install -g @anthropic-ai/claude-code72 cd your-project

73 claude

35 ```74 ```

36 75 

37 Requires [Node.js 18+](https://nodejs.org/en/download/)76 You'll be prompted to log in on first use. That's it! [Continue with the Quickstart →](/en/quickstart)

77 

78 <Tip>

79 See [advanced setup](/en/setup) for installation options, manual updates, or uninstallation instructions. Visit [troubleshooting](/en/troubleshooting) if you hit issues.

80 </Tip>

81 </Tab>

82 

83 <Tab title="VS Code">

84 The VS Code extension provides inline diffs, @-mentions, plan review, and conversation history directly in your editor.

85 

86 * [Install for VS Code](vscode:extension/anthropic.claude-code)

87 * [Install for Cursor](cursor:extension/anthropic.claude-code)

88 

89 Or search for "Claude Code" in the Extensions view (`Cmd+Shift+X` on Mac, `Ctrl+Shift+X` on Windows/Linux). After installing, open the Command Palette (`Cmd+Shift+P` / `Ctrl+Shift+P`), type "Claude Code", and select **Open in New Tab**.

90 

91 [Get started with VS Code →](/en/vs-code#get-started)

92 </Tab>

93 

94 <Tab title="Desktop app">

95 A standalone app for running Claude Code outside your IDE or terminal. Review diffs visually, run multiple sessions side by side, and kick off cloud sessions.

96 

97 Download and install:

98 

99 * [macOS](https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code\&utm_medium=docs) (Intel and Apple Silicon)

100 * [Windows](https://claude.ai/api/desktop/win32/x64/exe/latest/redirect?utm_source=claude_code\&utm_medium=docs) (x64)

101 * [Windows ARM64](https://claude.ai/api/desktop/win32/arm64/exe/latest/redirect?utm_source=claude_code\&utm_medium=docs) (remote sessions only)

102 

103 After installing, launch Claude, sign in, and click the **Code** tab to start coding. A [paid subscription](https://claude.com/pricing) is required.

104 

105 [Learn more about the desktop app →](/en/desktop-quickstart)

106 </Tab>

107 

108 <Tab title="Web">

109 Run Claude Code in your browser with no local setup. Kick off long-running tasks and check back when they're done, work on repos you don't have locally, or run multiple tasks in parallel. Available on desktop browsers and the Claude iOS app.

110 

111 Start coding at [claude.ai/code](https://claude.ai/code).

112 

113 [Get started on the web →](/en/claude-code-on-the-web#getting-started)

114 </Tab>

115 

116 <Tab title="JetBrains">

117 A plugin for IntelliJ IDEA, PyCharm, WebStorm, and other JetBrains IDEs with interactive diff viewing and selection context sharing.

118 

119 Install the [Claude Code plugin](https://plugins.jetbrains.com/plugin/27310-claude-code-beta-) from the JetBrains Marketplace and restart your IDE.

120 

121 [Get started with JetBrains →](/en/jetbrains)

38 </Tab>122 </Tab>

39</Tabs>123</Tabs>

40 124 

41**Start using Claude Code:**125## What you can do

42 126 

43```bash theme={null}127Here are some of the ways you can use Claude Code:

44cd your-project

45claude

46```

47 128 

48You'll be prompted to log in on first use. That's it! [Continue with Quickstart (5 mins) →](/en/docs/claude-code/quickstart)129<AccordionGroup>

130 <Accordion title="Automate the work you keep putting off" icon="wand-magic-sparkles">

131 Claude Code handles the tedious tasks that eat up your day: writing tests for untested code, fixing lint errors across a project, resolving merge conflicts, updating dependencies, and writing release notes.

49 132 

50<Tip>133 ```bash theme={null}

51 See [advanced setup](/en/docs/claude-code/setup) for installation options or [troubleshooting](/en/docs/claude-code/troubleshooting) if you hit issues.134 claude "write tests for the auth module, run them, and fix any failures"

52</Tip>135 ```

136 </Accordion>

53 137 

54<Note>138 <Accordion title="Build features and fix bugs" icon="hammer">

55 **New VS Code Extension (Beta)**: Prefer a graphical interface? Our new [VS Code extension](/en/docs/claude-code/vs-code) provides an easy-to-use native IDE experience without requiring terminal familiarity. Simply install from the marketplace and start coding with Claude directly in your sidebar.139 Describe what you want in plain language. Claude Code plans the approach, writes the code across multiple files, and verifies it works.

56</Note>

57 140 

58## What Claude Code does for you141 For bugs, paste an error message or describe the symptom. Claude Code traces the issue through your codebase, identifies the root cause, and implements a fix. See [common workflows](/en/common-workflows) for more examples.

142 </Accordion>

59 143 

60* **Build features from descriptions**: Tell Claude what you want to build in plain English. It will make a plan, write the code, and ensure it works.144 <Accordion title="Create commits and pull requests" icon="code-branch">

61* **Debug and fix issues**: Describe a bug or paste an error message. Claude Code will analyze your codebase, identify the problem, and implement a fix.145 Claude Code works directly with git. It stages changes, writes commit messages, creates branches, and opens pull requests.

62* **Navigate any codebase**: Ask anything about your team's codebase, and get a thoughtful answer back. Claude Code maintains awareness of your entire project structure, can find up-to-date information from the web, and with [MCP](/en/docs/claude-code/mcp) can pull from external datasources like Google Drive, Figma, and Slack.

63* **Automate tedious tasks**: Fix fiddly lint issues, resolve merge conflicts, and write release notes. Do all this in a single command from your developer machines, or automatically in CI.

64 146 

65## Why developers love Claude Code147 ```bash theme={null}

148 claude "commit my changes with a descriptive message"

149 ```

66 150 

67* **Works in your terminal**: Not another chat window. Not another IDE. Claude Code meets you where you already work, with the tools you already love.151 In CI, you can automate code review and issue triage with [GitHub Actions](/en/github-actions) or [GitLab CI/CD](/en/gitlab-ci-cd).

68* **Takes action**: Claude Code can directly edit files, run commands, and create commits. Need more? [MCP](/en/docs/claude-code/mcp) lets Claude read your design docs in Google Drive, update your tickets in Jira, or use *your* custom developer tooling.152 </Accordion>

69* **Unix philosophy**: Claude Code is composable and scriptable. `tail -f app.log | claude -p "Slack me if you see any anomalies appear in this log stream"` *works*. Your CI can run `claude -p "If there are new text strings, translate them into French and raise a PR for @lang-fr-team to review"`.

70* **Enterprise-ready**: Use the Claude API, or host on AWS or GCP. Enterprise-grade [security](/en/docs/claude-code/security), [privacy](/en/docs/claude-code/data-usage), and [compliance](https://trust.anthropic.com/) is built-in.

71 153 

72## Next steps154 <Accordion title="Connect your tools with MCP" icon="plug">

155 The [Model Context Protocol (MCP)](/en/mcp) is an open standard for connecting AI tools to external data sources. With MCP, Claude Code can read your design docs in Google Drive, update tickets in Jira, pull data from Slack, or use your own custom tooling.

156 </Accordion>

73 157 

74<CardGroup>158 <Accordion title="Customize with instructions, skills, and hooks" icon="sliders">

75 <Card title="Quickstart" icon="rocket" href="/en/docs/claude-code/quickstart">159 [`CLAUDE.md`](/en/claude-md) is a markdown file you add to your project root that Claude Code reads at the start of every session. Use it to set coding standards, architecture decisions, preferred libraries, and review checklists.

76 See Claude Code in action with practical examples

77 </Card>

78 160 

79 <Card title="Common workflows" icon="graduation-cap" href="/en/docs/claude-code/common-workflows">161 Create [custom slash commands](/en/skills) to package repeatable workflows your team can share, like `/review-pr` or `/deploy-staging`.

80 Step-by-step guides for common workflows

81 </Card>

82 162 

83 <Card title="Troubleshooting" icon="wrench" href="/en/docs/claude-code/troubleshooting">163 [Hooks](/en/hooks) let you run shell commands before or after Claude Code actions, like auto-formatting after every file edit or running lint before a commit.

84 Solutions for common issues with Claude Code164 </Accordion>

85 </Card>

86 165 

87 <Card title="IDE setup" icon="laptop" href="/en/docs/claude-code/ide-integrations">166 <Accordion title="Run agent teams and build custom agents" icon="users">

88 Add Claude Code to your IDE167 Spawn [multiple Claude Code agents](/en/sub-agents) that work on different parts of a task simultaneously. A lead agent coordinates the work, assigns subtasks, and merges results.

89 </Card>

90</CardGroup>

91 168 

92## Additional resources169 For fully custom workflows, the [Agent SDK](https://platform.claude.com/docs/en/agent-sdk/overview) lets you build your own agents powered by Claude Code's tools and capabilities, with full control over orchestration, tool access, and permissions.

170 </Accordion>

93 171 

94<CardGroup>172 <Accordion title="Pipe, script, and automate with the CLI" icon="terminal">

95 <Card title="Host on AWS or GCP" icon="cloud" href="/en/docs/claude-code/third-party-integrations">173 Claude Code is composable and follows the Unix philosophy. Pipe logs into it, run it in CI, or chain it with other tools:

96 Configure Claude Code with Amazon Bedrock or Google Vertex AI174 

97 </Card>175 ```bash theme={null}

176 # Monitor logs and get alerted

177 tail -f app.log | claude -p "Slack me if you see any anomalies"

178 

179 # Automate translations in CI

180 claude -p "translate new strings into French and raise a PR for review"

181 

182 # Bulk operations across files

183 git diff main --name-only | claude -p "review these changed files for security issues"

184 ```

98 185 

99 <Card title="Settings" icon="gear" href="/en/docs/claude-code/settings">186 See the [CLI reference](/en/cli-reference) for the full set of commands and flags.

100 Customize Claude Code for your workflow187 </Accordion>

101 </Card>

102 188 

103 <Card title="Commands" icon="terminal" href="/en/docs/claude-code/cli-reference">189 <Accordion title="Work from anywhere" icon="globe">

104 Learn about CLI commands and controls190 Sessions aren't tied to a single surface. Move work between environments as your context changes:

105 </Card>

106 191 

107 <Card title="Reference implementation" icon="code" href="https://github.com/anthropics/claude-code/tree/main/.devcontainer">192 * Step away from your desk and keep working from your phone or any browser with [Remote Control](/en/remote-control)

108 Clone our development container reference implementation193 * Kick off a long-running task on the [web](/en/claude-code-on-the-web) or [iOS app](https://apps.apple.com/app/claude-by-anthropic/id6473753684), then pull it into your terminal with `/teleport`

109 </Card>194 * Hand off a terminal session to the [Desktop app](/en/desktop) with `/desktop` for visual diff review

195 * Route tasks from team chat: mention `@Claude` in [Slack](/en/slack) with a bug report and get a pull request back

196 </Accordion>

197</AccordionGroup>

198 

199## Use Claude Code everywhere

200 

201Each surface connects to the same underlying Claude Code engine, so your CLAUDE.md files, settings, and MCP servers work across all of them.

202 

203Beyond the [Terminal](/en/quickstart), [VS Code](/en/vs-code), [JetBrains](/en/jetbrains), [Desktop](/en/desktop), and [Web](/en/claude-code-on-the-web) environments above, Claude Code integrates with CI/CD, chat, and browser workflows:

204 

205| I want to... | Best option |

206| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |

207| Continue a local session from my phone or another device | [Remote Control](/en/remote-control) |

208| Start a task locally, continue on mobile | [Web](/en/claude-code-on-the-web) or [Claude iOS app](https://apps.apple.com/app/claude-by-anthropic/id6473753684) |

209| Automate PR reviews and issue triage | [GitHub Actions](/en/github-actions) or [GitLab CI/CD](/en/gitlab-ci-cd) |

210| Route bug reports from Slack to pull requests | [Slack](/en/slack) |

211| Debug live web applications | [Chrome](/en/chrome) |

212| Build custom agents for your own workflows | [Agent SDK](https://platform.claude.com/docs/en/agent-sdk/overview) |

213 

214## Next steps

110 215 

111 <Card title="Security" icon="shield" href="/en/docs/claude-code/security">216Once you've installed Claude Code, these guides help you go deeper.

112 Discover Claude Code's safeguards and best practices for safe usage

113 </Card>

114 217 

115 <Card title="Privacy and data usage" icon="lock" href="/en/docs/claude-code/data-usage">218* [Quickstart](/en/quickstart): walk through your first real task, from exploring a codebase to committing a fix

116 Understand how Claude Code handles your data219* Level up with [best practices](/en/best-practices) and [common workflows](/en/common-workflows)

117 </Card>220* [Settings](/en/settings): customize Claude Code for your workflow

118</CardGroup>221* [Troubleshooting](/en/troubleshooting): solutions for common issues

222* [code.claude.com](https://code.claude.com/): demos, pricing, and product details

permissions.md +251 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Configure permissions

6 

7> Control what Claude Code can access and do with fine-grained permission rules, modes, and managed policies.

8 

9Claude Code supports fine-grained permissions so that you can specify exactly what the agent is allowed to do and what it cannot. Permission settings can be checked into version control and distributed to all developers in your organization, as well as customized by individual developers.

10 

11## Permission system

12 

13Claude Code uses a tiered permission system to balance power and safety:

14 

15| Tool type | Example | Approval required | "Yes, don't ask again" behavior |

16| :---------------- | :--------------- | :---------------- | :-------------------------------------------- |

17| Read-only | File reads, Grep | No | N/A |

18| Bash commands | Shell execution | Yes | Permanently per project directory and command |

19| File modification | Edit/write files | Yes | Until session end |

20 

21## Manage permissions

22 

23You can view and manage Claude Code's tool permissions with `/permissions`. This UI lists all permission rules and the settings.json file they are sourced from.

24 

25* **Allow** rules let Claude Code use the specified tool without manual approval.

26* **Ask** rules prompt for confirmation whenever Claude Code tries to use the specified tool.

27* **Deny** rules prevent Claude Code from using the specified tool.

28 

29Rules are evaluated in order: **deny -> ask -> allow**. The first matching rule wins, so deny rules always take precedence.

30 

31## Permission modes

32 

33Claude Code supports several permission modes that control how tools are approved. Set the `defaultMode` in your [settings files](/en/settings#settings-files):

34 

35| Mode | Description |

36| :------------------ | :------------------------------------------------------------------------------------ |

37| `default` | Standard behavior: prompts for permission on first use of each tool |

38| `acceptEdits` | Automatically accepts file edit permissions for the session |

39| `plan` | Plan Mode: Claude can analyze but not modify files or execute commands |

40| `dontAsk` | Auto-denies tools unless pre-approved via `/permissions` or `permissions.allow` rules |

41| `bypassPermissions` | Skips all permission prompts (requires safe environment, see warning below) |

42 

43<Warning>

44 `bypassPermissions` mode disables all permission checks. Only use this in isolated environments like containers or VMs where Claude Code cannot cause damage. Administrators can prevent this mode by setting `disableBypassPermissionsMode` to `"disable"` in [managed settings](#managed-settings).

45</Warning>

46 

47## Permission rule syntax

48 

49Permission rules follow the format `Tool` or `Tool(specifier)`.

50 

51### Match all uses of a tool

52 

53To match all uses of a tool, use just the tool name without parentheses:

54 

55| Rule | Effect |

56| :--------- | :----------------------------- |

57| `Bash` | Matches all Bash commands |

58| `WebFetch` | Matches all web fetch requests |

59| `Read` | Matches all file reads |

60 

61`Bash(*)` is equivalent to `Bash` and matches all Bash commands.

62 

63### Use specifiers for fine-grained control

64 

65Add a specifier in parentheses to match specific tool uses:

66 

67| Rule | Effect |

68| :----------------------------- | :------------------------------------------------------- |

69| `Bash(npm run build)` | Matches the exact command `npm run build` |

70| `Read(./.env)` | Matches reading the `.env` file in the current directory |

71| `WebFetch(domain:example.com)` | Matches fetch requests to example.com |

72 

73### Wildcard patterns

74 

75Bash rules support glob patterns with `*`. Wildcards can appear at any position in the command. This configuration allows npm and git commit commands while blocking git push:

76 

77```json theme={null}

78{

79 "permissions": {

80 "allow": [

81 "Bash(npm run *)",

82 "Bash(git commit *)",

83 "Bash(git * main)",

84 "Bash(* --version)",

85 "Bash(* --help *)"

86 ],

87 "deny": [

88 "Bash(git push *)"

89 ]

90 }

91}

92```

93 

94The space before `*` matters: `Bash(ls *)` matches `ls -la` but not `lsof`, while `Bash(ls*)` matches both. The legacy `:*` suffix syntax is equivalent to ` *` but is deprecated.

95 

96## Tool-specific permission rules

97 

98### Bash

99 

100Bash permission rules support wildcard matching with `*`. Wildcards can appear at any position in the command, including at the beginning, middle, or end:

101 

102* `Bash(npm run build)` matches the exact Bash command `npm run build`

103* `Bash(npm run test *)` matches Bash commands starting with `npm run test`

104* `Bash(npm *)` matches any command starting with `npm `

105* `Bash(* install)` matches any command ending with ` install`

106* `Bash(git * main)` matches commands like `git checkout main`, `git merge main`

107 

108When `*` appears at the end with a space before it (like `Bash(ls *)`), it enforces a word boundary, requiring the prefix to be followed by a space or end-of-string. For example, `Bash(ls *)` matches `ls -la` but not `lsof`. In contrast, `Bash(ls*)` without a space matches both `ls -la` and `lsof` because there's no word boundary constraint.

109 

110<Tip>

111 Claude Code is aware of shell operators (like `&&`) so a prefix match rule like `Bash(safe-cmd *)` won't give it permission to run the command `safe-cmd && other-cmd`.

112</Tip>

113 

114<Warning>

115 Bash permission patterns that try to constrain command arguments are fragile. For example, `Bash(curl http://github.com/ *)` intends to restrict curl to GitHub URLs, but won't match variations like:

116 

117 * Options before URL: `curl -X GET http://github.com/...`

118 * Different protocol: `curl https://github.com/...`

119 * Redirects: `curl -L http://bit.ly/xyz` (redirects to github)

120 * Variables: `URL=http://github.com && curl $URL`

121 * Extra spaces: `curl http://github.com`

122 

123 For more reliable URL filtering, consider:

124 

125 * **Restrict Bash network tools**: use deny rules to block `curl`, `wget`, and similar commands, then use the WebFetch tool with `WebFetch(domain:github.com)` permission for allowed domains

126 * **Use PreToolUse hooks**: implement a hook that validates URLs in Bash commands and blocks disallowed domains

127 * Instructing Claude Code about your allowed curl patterns via CLAUDE.md

128 

129 Note that using WebFetch alone does not prevent network access. If Bash is allowed, Claude can still use `curl`, `wget`, or other tools to reach any URL.

130</Warning>

131 

132### Read and Edit

133 

134`Edit` rules apply to all built-in tools that edit files. Claude makes a best-effort attempt to apply `Read` rules to all built-in tools that read files like Grep and Glob.

135 

136Read and Edit rules both follow the [gitignore](https://git-scm.com/docs/gitignore) specification with four distinct pattern types:

137 

138| Pattern | Meaning | Example | Matches |

139| ------------------ | -------------------------------------- | -------------------------------- | ------------------------------ |

140| `//path` | **Absolute** path from filesystem root | `Read(//Users/alice/secrets/**)` | `/Users/alice/secrets/**` |

141| `~/path` | Path from **home** directory | `Read(~/Documents/*.pdf)` | `/Users/alice/Documents/*.pdf` |

142| `/path` | Path **relative to project root** | `Edit(/src/**/*.ts)` | `<project root>/src/**/*.ts` |

143| `path` or `./path` | Path **relative to current directory** | `Read(*.env)` | `<cwd>/*.env` |

144 

145<Warning>

146 A pattern like `/Users/alice/file` is NOT an absolute path. It's relative to the project root. Use `//Users/alice/file` for absolute paths.

147</Warning>

148 

149Examples:

150 

151* `Edit(/docs/**)`: edits in `<project>/docs/` (NOT `/docs/` and NOT `<project>/.claude/docs/`)

152* `Read(~/.zshrc)`: reads your home directory's `.zshrc`

153* `Edit(//tmp/scratch.txt)`: edits the absolute path `/tmp/scratch.txt`

154* `Read(src/**)`: reads from `<current-directory>/src/`

155 

156<Note>

157 In gitignore patterns, `*` matches files in a single directory while `**` matches recursively across directories. To allow all file access, use just the tool name without parentheses: `Read`, `Edit`, or `Write`.

158</Note>

159 

160### WebFetch

161 

162* `WebFetch(domain:example.com)` matches fetch requests to example.com

163 

164### MCP

165 

166* `mcp__puppeteer` matches any tool provided by the `puppeteer` server (name configured in Claude Code)

167* `mcp__puppeteer__*` wildcard syntax that also matches all tools from the `puppeteer` server

168* `mcp__puppeteer__puppeteer_navigate` matches the `puppeteer_navigate` tool provided by the `puppeteer` server

169 

170### Task (subagents)

171 

172Use `Task(AgentName)` rules to control which [subagents](/en/sub-agents) Claude can use:

173 

174* `Task(Explore)` matches the Explore subagent

175* `Task(Plan)` matches the Plan subagent

176* `Task(my-custom-agent)` matches a custom subagent named `my-custom-agent`

177 

178Add these rules to the `deny` array in your settings or use the `--disallowedTools` CLI flag to disable specific agents. To disable the Explore agent:

179 

180```json theme={null}

181{

182 "permissions": {

183 "deny": ["Task(Explore)"]

184 }

185}

186```

187 

188## Extend permissions with hooks

189 

190[Claude Code hooks](/en/hooks-guide) provide a way to register custom shell commands to perform permission evaluation at runtime. When Claude Code makes a tool call, PreToolUse hooks run before the permission system, and the hook output can determine whether to approve or deny the tool call in place of the permission system.

191 

192## Working directories

193 

194By default, Claude has access to files in the directory where it was launched. You can extend this access:

195 

196* **During startup**: use `--add-dir <path>` CLI argument

197* **During session**: use `/add-dir` command

198* **Persistent configuration**: add to `additionalDirectories` in [settings files](/en/settings#settings-files)

199 

200Files in additional directories follow the same permission rules as the original working directory: they become readable without prompts, and file editing permissions follow the current permission mode.

201 

202## How permissions interact with sandboxing

203 

204Permissions and [sandboxing](/en/sandboxing) are complementary security layers:

205 

206* **Permissions** control which tools Claude Code can use and which files or domains it can access. They apply to all tools (Bash, Read, Edit, WebFetch, MCP, and others).

207* **Sandboxing** provides OS-level enforcement that restricts the Bash tool's filesystem and network access. It applies only to Bash commands and their child processes.

208 

209Use both for defense-in-depth:

210 

211* Permission deny rules block Claude from even attempting to access restricted resources

212* Sandbox restrictions prevent Bash commands from reaching resources outside defined boundaries, even if a prompt injection bypasses Claude's decision-making

213* Filesystem restrictions in the sandbox use Read and Edit deny rules, not separate sandbox configuration

214* Network restrictions combine WebFetch permission rules with the sandbox's `allowedDomains` list

215 

216## Managed settings

217 

218For organizations that need centralized control over Claude Code configuration, administrators can deploy managed settings that cannot be overridden by user or project settings. These policy settings follow the same format as regular settings files and can be delivered through MDM/OS-level policies, managed settings files, or [server-managed settings](/en/server-managed-settings). See [settings files](/en/settings#settings-files) for delivery mechanisms and file locations.

219 

220### Managed-only settings

221 

222Some settings are only effective in managed settings:

223 

224| Setting | Description |

225| :---------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

226| `disableBypassPermissionsMode` | Set to `"disable"` to prevent `bypassPermissions` mode and the `--dangerously-skip-permissions` flag |

227| `allowManagedPermissionRulesOnly` | When `true`, prevents user and project settings from defining `allow`, `ask`, or `deny` permission rules. Only rules in managed settings apply |

228| `allowManagedHooksOnly` | When `true`, prevents loading of user, project, and plugin hooks. Only managed hooks and SDK hooks are allowed |

229| `allowManagedMcpServersOnly` | When `true`, only `allowedMcpServers` from managed settings are respected. `deniedMcpServers` still merges from all sources. See [Managed MCP configuration](/en/mcp#managed-mcp-configuration) |

230| `blockedMarketplaces` | Blocklist of marketplace sources. Blocked sources are checked before downloading, so they never touch the filesystem. See [managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions) |

231| `sandbox.network.allowManagedDomainsOnly` | When `true`, only `allowedDomains` and `WebFetch(domain:...)` allow rules from managed settings are respected. Denied domains still merge from all sources |

232| `strictKnownMarketplaces` | Controls which plugin marketplaces users can add. See [managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions) |

233| `allow_remote_sessions` | When `true`, allows users to start [Remote Control](/en/remote-control) and [web sessions](/en/claude-code-on-the-web). Defaults to `true`. Set to `false` to prevent remote session access |

234 

235## Settings precedence

236 

237Permission rules follow the same [settings precedence](/en/settings#settings-precedence) as all other Claude Code settings: managed settings have the highest precedence, followed by command line arguments, local project, shared project, and user settings.

238 

239If a permission is allowed in user settings but denied in project settings, the project setting takes precedence and the permission is blocked.

240 

241## Example configurations

242 

243This [repository](https://github.com/anthropics/claude-code/tree/main/examples/settings) includes starter settings configurations for common deployment scenarios. Use these as starting points and adjust them to fit your needs.

244 

245## See also

246 

247* [Settings](/en/settings): complete configuration reference including the permission settings table

248* [Sandboxing](/en/sandboxing): OS-level filesystem and network isolation for Bash commands

249* [Authentication](/en/authentication): set up user access to Claude Code

250* [Security](/en/security): security safeguards and best practices

251* [Hooks](/en/hooks-guide): automate workflows and extend permission evaluation

Details

1# Plugin marketplaces1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Create and manage plugin marketplaces to distribute Claude Code extensions across teams and communities.5# Create and distribute a plugin marketplace

4 6 

5Plugin marketplaces are catalogs of available plugins that make it easy to discover, install, and manage Claude Code extensions. This guide shows you how to use existing marketplaces and create your own for team distribution.7> Build and host plugin marketplaces to distribute Claude Code extensions across teams and communities.

6 8 

7## Overview9A **plugin marketplace** is a catalog that lets you distribute plugins to others. Marketplaces provide centralized discovery, version tracking, automatic updates, and support for multiple source types (git repositories, local paths, and more). This guide shows you how to create your own marketplace to share plugins with your team or community.

8 

9A marketplace is a JSON file that lists available plugins and describes where to find them. Marketplaces provide:

10 

11* **Centralized discovery**: Browse plugins from multiple sources in one place

12* **Version management**: Track and update plugin versions automatically

13* **Team distribution**: Share required plugins across your organization

14* **Flexible sources**: Support for git repositories, GitHub repos, local paths, and package managers

15 

16### Prerequisites

17 

18* Claude Code installed and running

19* Basic familiarity with JSON file format

20* For creating marketplaces: Git repository or local development environment

21 

22## Add and use marketplaces

23 

24Add marketplaces using the `/plugin marketplace` commands to access plugins from different sources:

25 

26### Add GitHub marketplaces

27 

28```shell Add a GitHub repository containing .claude-plugin/marketplace.json theme={null}

29/plugin marketplace add owner/repo

30```

31 10 

32### Add Git repositories11Looking to install plugins from an existing marketplace? See [Discover and install prebuilt plugins](/en/discover-plugins).

33 12 

34```shell Add any git repository theme={null}13## Overview

35/plugin marketplace add https://gitlab.com/company/plugins.git

36```

37 14 

38### Add local marketplaces for development15Creating and distributing a marketplace involves:

39 16 

40```shell Add local directory containing .claude-plugin/marketplace.json theme={null}171. **Creating plugins**: build one or more plugins with commands, agents, hooks, MCP servers, or LSP servers. This guide assumes you already have plugins to distribute; see [Create plugins](/en/plugins) for details on how to create them.

41/plugin marketplace add ./my-marketplace182. **Creating a marketplace file**: define a `marketplace.json` that lists your plugins and where to find them (see [Create the marketplace file](#create-the-marketplace-file)).

42```193. **Host the marketplace**: push to GitHub, GitLab, or another git host (see [Host and distribute marketplaces](#host-and-distribute-marketplaces)).

204. **Share with users**: users add your marketplace with `/plugin marketplace add` and install individual plugins (see [Discover and install plugins](/en/discover-plugins)).

43 21 

44```shell Add direct path to marketplace.json file theme={null}22Once your marketplace is live, you can update it by pushing changes to your repository. Users refresh their local copy with `/plugin marketplace update`.

45/plugin marketplace add ./path/to/marketplace.json

46```

47 23 

48```shell Add remote marketplace.json via URL theme={null}24## Walkthrough: create a local marketplace

49/plugin marketplace add https://url.of/marketplace.json

50```

51 25 

52### Install plugins from marketplaces26This example creates a marketplace with one plugin: a `/review` skill for code reviews. You'll create the directory structure, add a skill, create the plugin manifest and marketplace catalog, then install and test it.

53 27 

54Once you've added marketplaces, install plugins directly:28<Steps>

29 <Step title="Create the directory structure">

30 ```bash theme={null}

31 mkdir -p my-marketplace/.claude-plugin

32 mkdir -p my-marketplace/plugins/review-plugin/.claude-plugin

33 mkdir -p my-marketplace/plugins/review-plugin/skills/review

34 ```

35 </Step>

55 36 

56```shell Install from any known marketplace theme={null}37 <Step title="Create the skill">

57/plugin install plugin-name@marketplace-name38 Create a `SKILL.md` file that defines what the `/review` skill does.

58```

59 39 

60```shell Browse available plugins interactively theme={null}40 ```markdown my-marketplace/plugins/review-plugin/skills/review/SKILL.md theme={null}

61/plugin41 ---

62```42 description: Review code for bugs, security, and performance

43 disable-model-invocation: true

44 ---

63 45 

64### Verify marketplace installation46 Review the code I've selected or the recent changes for:

47 - Potential bugs or edge cases

48 - Security concerns

49 - Performance issues

50 - Readability improvements

65 51 

66After adding a marketplace:52 Be concise and actionable.

53 ```

54 </Step>

67 55 

681. **List marketplaces**: Run `/plugin marketplace list` to confirm it's added56 <Step title="Create the plugin manifest">

692. **Browse plugins**: Use `/plugin` to see available plugins from your marketplace57 Create a `plugin.json` file that describes the plugin. The manifest goes in the `.claude-plugin/` directory.

703. **Test installation**: Try installing a plugin to verify the marketplace works correctly

71 58 

72## Configure team marketplaces59 ```json my-marketplace/plugins/review-plugin/.claude-plugin/plugin.json theme={null}

60 {

61 "name": "review-plugin",

62 "description": "Adds a /review skill for quick code reviews",

63 "version": "1.0.0"

64 }

65 ```

66 </Step>

73 67 

74Set up automatic marketplace installation for team projects by specifying required marketplaces in `.claude/settings.json`:68 <Step title="Create the marketplace file">

69 Create the marketplace catalog that lists your plugin.

75 70 

76```json theme={null}71 ```json my-marketplace/.claude-plugin/marketplace.json theme={null}

77{72 {

78 "extraKnownMarketplaces": {73 "name": "my-plugins",

79 "team-tools": {74 "owner": {

80 "source": {75 "name": "Your Name"

81 "source": "github",

82 "repo": "your-org/claude-plugins"

83 }

84 },76 },

85 "project-specific": {77 "plugins": [

86 "source": {78 {

87 "source": "git",79 "name": "review-plugin",

88 "url": "https://git.company.com/project-plugins.git"80 "source": "./plugins/review-plugin",

89 }81 "description": "Adds a /review skill for quick code reviews"

90 }82 }

83 ]

91 }84 }

92}85 ```

93```86 </Step>

94 87 

95When team members trust the repository folder, Claude Code automatically installs these marketplaces and any plugins specified in the `enabledPlugins` field.88 <Step title="Add and install">

89 Add the marketplace and install the plugin.

96 90 

97***91 ```shell theme={null}

92 /plugin marketplace add ./my-marketplace

93 /plugin install review-plugin@my-plugins

94 ```

95 </Step>

98 96 

99## Create your own marketplace97 <Step title="Try it out">

98 Select some code in your editor and run your new command.

100 99 

101Build and distribute custom plugin collections for your team or community.100 ```shell theme={null}

101 /review

102 ```

103 </Step>

104</Steps>

102 105 

103### Prerequisites for marketplace creation106To learn more about what plugins can do, including hooks, agents, MCP servers, and LSP servers, see [Plugins](/en/plugins).

104 107 

105* Git repository (GitHub, GitLab, or other git hosting)108<Note>

106* Understanding of JSON file format109 **How plugins are installed**: When users install a plugin, Claude Code copies the plugin directory to a cache location. This means plugins can't reference files outside their directory using paths like `../shared-utils`, because those files won't be copied.

107* One or more plugins to distribute110 

111 If you need to share files across plugins, use symlinks (which are followed during copying). See [Plugin caching and file resolution](/en/plugins-reference#plugin-caching-and-file-resolution) for details.

112</Note>

108 113 

109### Create the marketplace file114## Create the marketplace file

110 115 

111Create `.claude-plugin/marketplace.json` in your repository root:116Create `.claude-plugin/marketplace.json` in your repository root. This file defines your marketplace's name, owner information, and a list of plugins with their sources.

117 

118Each plugin entry needs at minimum a `name` and `source` (where to fetch it from). See the [full schema](#marketplace-schema) below for all available fields.

112 119 

113```json theme={null}120```json theme={null}

114{121{

115 "name": "company-tools",122 "name": "company-tools",

116 "owner": {123 "owner": {

117 "name": "DevTools Team",124 "name": "DevTools Team",

118 "email": "devtools@company.com"125 "email": "devtools@example.com"

119 },126 },

120 "plugins": [127 "plugins": [

121 {128 {


139}146}

140```147```

141 148 

142### Marketplace schema149## Marketplace schema

143 150 

144#### Required fields151### Required fields

145 152 

146| Field | Type | Description |153| Field | Type | Description | Example |

147| :-------- | :----- | :--------------------------------------------- |154| :-------- | :----- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------- |

148| `name` | string | Marketplace identifier (kebab-case, no spaces) |155| `name` | string | Marketplace identifier (kebab-case, no spaces). This is public-facing: users see it when installing plugins (for example, `/plugin install my-tool@your-marketplace`). | `"acme-tools"` |

149| `owner` | object | Marketplace maintainer information |156| `owner` | object | Marketplace maintainer information ([see fields below](#owner-fields)) | |

150| `plugins` | array | List of available plugins |157| `plugins` | array | List of available plugins | See below |

158 

159<Note>

160 **Reserved names**: The following marketplace names are reserved for official Anthropic use and cannot be used by third-party marketplaces: `claude-code-marketplace`, `claude-code-plugins`, `claude-plugins-official`, `anthropic-marketplace`, `anthropic-plugins`, `agent-skills`, `life-sciences`. Names that impersonate official marketplaces (like `official-claude-plugins` or `anthropic-tools-v2`) are also blocked.

161</Note>

162 

163### Owner fields

151 164 

152#### Optional metadata165| Field | Type | Required | Description |

166| :------ | :----- | :------- | :------------------------------- |

167| `name` | string | Yes | Name of the maintainer or team |

168| `email` | string | No | Contact email for the maintainer |

169 

170### Optional metadata

153 171 

154| Field | Type | Description |172| Field | Type | Description |

155| :--------------------- | :----- | :------------------------------------ |173| :--------------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

156| `metadata.description` | string | Brief marketplace description |174| `metadata.description` | string | Brief marketplace description |

157| `metadata.version` | string | Marketplace version |175| `metadata.version` | string | Marketplace version |

158| `metadata.pluginRoot` | string | Base path for relative plugin sources |176| `metadata.pluginRoot` | string | Base directory prepended to relative plugin source paths (for example, `"./plugins"` lets you write `"source": "formatter"` instead of `"source": "./plugins/formatter"`) |

159 177 

160### Plugin entries178## Plugin entries

161 179 

162<Note>180Each plugin entry in the `plugins` array describes a plugin and where to find it. You can include any field from the [plugin manifest schema](/en/plugins-reference#plugin-manifest-schema) (like `description`, `version`, `author`, `commands`, `hooks`, etc.), plus these marketplace-specific fields: `source`, `category`, `tags`, and `strict`.

163 Plugin entries are based on the *plugin manifest schema* (with all fields made optional) plus marketplace-specific fields (`source`, `category`, `tags`, `strict`), with `name` being required.

164</Note>

165 181 

166**Required fields:**182### Required fields

167 183 

168| Field | Type | Description |184| Field | Type | Description |

169| :------- | :------------- | :---------------------------------------- |185| :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |

170| `name` | string | Plugin identifier (kebab-case, no spaces) |186| `name` | string | Plugin identifier (kebab-case, no spaces). This is public-facing: users see it when installing (for example, `/plugin install my-plugin@marketplace`). |

171| `source` | string\|object | Where to fetch the plugin from |187| `source` | string\|object | Where to fetch the plugin from (see [Plugin sources](#plugin-sources) below) |

172 188 

173#### Optional plugin fields189### Optional plugin fields

174 190 

175**Standard metadata fields:**191**Standard metadata fields:**

176 192 

177| Field | Type | Description |193| Field | Type | Description |

178| :------------ | :------ | :---------------------------------------------------------------- |194| :------------ | :------ | :-------------------------------------------------------------------------------------------------------------------------------- |

179| `description` | string | Brief plugin description |195| `description` | string | Brief plugin description |

180| `version` | string | Plugin version |196| `version` | string | Plugin version |

181| `author` | object | Plugin author information |197| `author` | object | Plugin author information (`name` required, `email` optional) |

182| `homepage` | string | Plugin homepage or documentation URL |198| `homepage` | string | Plugin homepage or documentation URL |

183| `repository` | string | Source code repository URL |199| `repository` | string | Source code repository URL |

184| `license` | string | SPDX license identifier (e.g., MIT, Apache-2.0) |200| `license` | string | SPDX license identifier (for example, MIT, Apache-2.0) |

185| `keywords` | array | Tags for plugin discovery and categorization |201| `keywords` | array | Tags for plugin discovery and categorization |

186| `category` | string | Plugin category for organization |202| `category` | string | Plugin category for organization |

187| `tags` | array | Tags for searchability |203| `tags` | array | Tags for searchability |

188| `strict` | boolean | Require plugin.json in plugin folder (default: true) <sup>1</sup> |204| `strict` | boolean | Controls whether `plugin.json` is the authority for component definitions (default: true). See [Strict mode](#strict-mode) below. |

189 205 

190**Component configuration fields:**206**Component configuration fields:**

191 207 


195| `agents` | string\|array | Custom paths to agent files |211| `agents` | string\|array | Custom paths to agent files |

196| `hooks` | string\|object | Custom hooks configuration or path to hooks file |212| `hooks` | string\|object | Custom hooks configuration or path to hooks file |

197| `mcpServers` | string\|object | MCP server configurations or path to MCP config |213| `mcpServers` | string\|object | MCP server configurations or path to MCP config |

214| `lspServers` | string\|object | LSP server configurations or path to LSP config |

215 

216## Plugin sources

217 

218Plugin sources tell Claude Code where to fetch each individual plugin listed in your marketplace. These are set in the `source` field of each plugin entry in `marketplace.json`.

198 219 

199*<sup>1 - When `strict: true` (default), the plugin must include a `plugin.json` manifest file, and marketplace fields supplement those values. When `strict: false`, the plugin.json is optional. If it's missing, the marketplace entry serves as the complete plugin manifest.</sup>*220Once a plugin is cloned or copied into the local machine, it is copied into the local versioned plugin cache at `~/.claude/plugins/cache`.

200 221 

201### Plugin sources222| Source | Type | Fields | Notes |

223| ------------- | ------------------------------- | ------------------------------------- | ----------------------------------------------------------------- |

224| Relative path | `string` (e.g. `"./my-plugin"`) | — | Local directory within the marketplace repo. Must start with `./` |

225| `github` | object | `repo`, `ref?`, `sha?` | |

226| `url` | object | `url` (must end .git), `ref?`, `sha?` | Git URL source |

227| `npm` | object | `package`, `version?`, `registry?` | Installed via `npm install` |

228| `pip` | object | `package`, `version?`, `registry?` | Installed via pip |

202 229 

203#### Relative paths230<Note>

231 **Marketplace sources vs plugin sources**: These are different concepts that control different things.

232 

233 * **Marketplace source** — where to fetch the `marketplace.json` catalog itself. Set when users run `/plugin marketplace add` or in `extraKnownMarketplaces` settings. Supports `ref` (branch/tag) but not `sha`.

234 * **Plugin source** — where to fetch an individual plugin listed in the marketplace. Set in the `source` field of each plugin entry inside `marketplace.json`. Supports both `ref` (branch/tag) and `sha` (exact commit).

235 

236 For example, a marketplace hosted at `acme-corp/plugin-catalog` (marketplace source) can list a plugin fetched from `acme-corp/code-formatter` (plugin source). The marketplace source and plugin source point to different repositories and are pinned independently.

237</Note>

238 

239### Relative paths

204 240 

205For plugins in the same repository:241For plugins in the same repository:

206 242 


211}247}

212```248```

213 249 

214#### GitHub repositories250<Note>

251 Relative paths only work when users add your marketplace via Git (GitHub, GitLab, or git URL). If users add your marketplace via a direct URL to the `marketplace.json` file, relative paths will not resolve correctly. For URL-based distribution, use GitHub, npm, or git URL sources instead. See [Troubleshooting](#plugins-with-relative-paths-fail-in-url-based-marketplaces) for details.

252</Note>

253 

254### GitHub repositories

215 255 

216```json theme={null}256```json theme={null}

217{257{


223}263}

224```264```

225 265 

226#### Git repositories266You can pin to a specific branch, tag, or commit:

267 

268```json theme={null}

269{

270 "name": "github-plugin",

271 "source": {

272 "source": "github",

273 "repo": "owner/plugin-repo",

274 "ref": "v2.0.0",

275 "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"

276 }

277}

278```

279 

280| Field | Type | Description |

281| :----- | :----- | :-------------------------------------------------------------------- |

282| `repo` | string | Required. GitHub repository in `owner/repo` format |

283| `ref` | string | Optional. Git branch or tag (defaults to repository default branch) |

284| `sha` | string | Optional. Full 40-character git commit SHA to pin to an exact version |

285 

286### Git repositories

227 287 

228```json theme={null}288```json theme={null}

229{289{


235}295}

236```296```

237 297 

238#### Advanced plugin entries298You can pin to a specific branch, tag, or commit:

299 

300```json theme={null}

301{

302 "name": "git-plugin",

303 "source": {

304 "source": "url",

305 "url": "https://gitlab.com/team/plugin.git",

306 "ref": "main",

307 "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"

308 }

309}

310```

311 

312| Field | Type | Description |

313| :---- | :----- | :-------------------------------------------------------------------- |

314| `url` | string | Required. Full git repository URL (must end with `.git`) |

315| `ref` | string | Optional. Git branch or tag (defaults to repository default branch) |

316| `sha` | string | Optional. Full 40-character git commit SHA to pin to an exact version |

317 

318### npm packages

319 

320Plugins distributed as npm packages are installed using `npm install`. This works with any package on the public npm registry or a private registry your team hosts.

321 

322```json theme={null}

323{

324 "name": "my-npm-plugin",

325 "source": {

326 "source": "npm",

327 "package": "@acme/claude-plugin"

328 }

329}

330```

331 

332To pin to a specific version, add the `version` field:

333 

334```json theme={null}

335{

336 "name": "my-npm-plugin",

337 "source": {

338 "source": "npm",

339 "package": "@acme/claude-plugin",

340 "version": "2.1.0"

341 }

342}

343```

239 344 

240Plugin entries can override default component locations and provide additional metadata. Note that `${CLAUDE_PLUGIN_ROOT}` is an environment variable that resolves to the plugin's installation directory (for details see [Environment variables](/en/docs/claude-code/plugins-reference#environment-variables)):345To install from a private or internal registry, add the `registry` field:

346 

347```json theme={null}

348{

349 "name": "my-npm-plugin",

350 "source": {

351 "source": "npm",

352 "package": "@acme/claude-plugin",

353 "version": "^2.0.0",

354 "registry": "https://npm.example.com"

355 }

356}

357```

358 

359| Field | Type | Description |

360| :--------- | :----- | :------------------------------------------------------------------------------------------- |

361| `package` | string | Required. Package name or scoped package (for example, `@org/plugin`) |

362| `version` | string | Optional. Version or version range (for example, `2.1.0`, `^2.0.0`, `~1.5.0`) |

363| `registry` | string | Optional. Custom npm registry URL. Defaults to the system npm registry (typically npmjs.org) |

364 

365### Advanced plugin entries

366 

367This example shows a plugin entry using many of the optional fields, including custom paths for commands, agents, hooks, and MCP servers:

241 368 

242```json theme={null}369```json theme={null}

243{370{


250 "version": "2.1.0",377 "version": "2.1.0",

251 "author": {378 "author": {

252 "name": "Enterprise Team",379 "name": "Enterprise Team",

253 "email": "enterprise@company.com"380 "email": "enterprise@example.com"

254 },381 },

255 "homepage": "https://docs.company.com/plugins/enterprise-tools",382 "homepage": "https://docs.example.com/plugins/enterprise-tools",

256 "repository": "https://github.com/company/enterprise-plugin",383 "repository": "https://github.com/company/enterprise-plugin",

257 "license": "MIT",384 "license": "MIT",

258 "keywords": ["enterprise", "workflow", "automation"],385 "keywords": ["enterprise", "workflow", "automation"],


262 "./commands/enterprise/",389 "./commands/enterprise/",

263 "./commands/experimental/preview.md"390 "./commands/experimental/preview.md"

264 ],391 ],

265 "agents": [392 "agents": ["./agents/security-reviewer.md", "./agents/compliance-checker.md"],

266 "./agents/security-reviewer.md",

267 "./agents/compliance-checker.md"

268 ],

269 "hooks": {393 "hooks": {

270 "PostToolUse": [394 "PostToolUse": [

271 {395 {

272 "matcher": "Write|Edit",396 "matcher": "Write|Edit",

273 "hooks": [{"type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"}]397 "hooks": [

398 {

399 "type": "command",

400 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"

401 }

402 ]

274 }403 }

275 ]404 ]

276 },405 },


284}413}

285```414```

286 415 

287<Note>416Key things to notice:

288 **Schema relationship**: Plugin entries use the plugin manifest schema with all fields made optional, plus marketplace-specific fields (`source`, `strict`, `category`, `tags`). This means any field valid in a `plugin.json` file can also be used in a marketplace entry. When `strict: false`, the marketplace entry serves as the complete plugin manifest if no `plugin.json` exists. When `strict: true` (default), marketplace fields supplement the plugin's own manifest file.

289</Note>

290 417 

291***418* **`commands` and `agents`**: You can specify multiple directories or individual files. Paths are relative to the plugin root.

419* **`${CLAUDE_PLUGIN_ROOT}`**: Use this variable in hooks and MCP server configs to reference files within the plugin's installation directory. This is necessary because plugins are copied to a cache location when installed.

420* **`strict: false`**: Since this is set to false, the plugin doesn't need its own `plugin.json`. The marketplace entry defines everything. See [Strict mode](#strict-mode) below.

292 421 

293## Host and distribute marketplaces422### Strict mode

294 423 

295Choose the best hosting strategy for your plugin distribution needs.424The `strict` field controls whether `plugin.json` is the authority for component definitions (commands, agents, hooks, skills, MCP servers, output styles).

425 

426| Value | Behavior |

427| :--------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------- |

428| `true` (default) | `plugin.json` is the authority. The marketplace entry can supplement it with additional components, and both sources are merged. |

429| `false` | The marketplace entry is the entire definition. If the plugin also has a `plugin.json` that declares components, that's a conflict and the plugin fails to load. |

430 

431**When to use each mode:**

432 

433* **`strict: true`**: the plugin has its own `plugin.json` and manages its own components. The marketplace entry can add extra commands or hooks on top. This is the default and works for most plugins.

434* **`strict: false`**: the marketplace operator wants full control. The plugin repo provides raw files, and the marketplace entry defines which of those files are exposed as commands, agents, hooks, etc. Useful when the marketplace restructures or curates a plugin's components differently than the plugin author intended.

435 

436## Host and distribute marketplaces

296 437 

297### Host on GitHub (recommended)438### Host on GitHub (recommended)

298 439 


300 441 

3011. **Create a repository**: Set up a new repository for your marketplace4421. **Create a repository**: Set up a new repository for your marketplace

3022. **Add marketplace file**: Create `.claude-plugin/marketplace.json` with your plugin definitions4432. **Add marketplace file**: Create `.claude-plugin/marketplace.json` with your plugin definitions

3033. **Share with teams**: Team members add with `/plugin marketplace add owner/repo`4443. **Share with teams**: Users add your marketplace with `/plugin marketplace add owner/repo`

304 445 

305**Benefits**: Built-in version control, issue tracking, and team collaboration features.446**Benefits**: Built-in version control, issue tracking, and team collaboration features.

306 447 

307### Host on other git services448### Host on other git services

308 449 

309Any git hosting service works for marketplace distribution, using a URL to an arbitrary git repository.450Any git hosting service works, such as GitLab, Bitbucket, and self-hosted servers. Users add with the full repository URL:

310 

311For example, using GitLab:

312 451 

313```shell theme={null}452```shell theme={null}

314/plugin marketplace add https://gitlab.com/company/plugins.git453/plugin marketplace add https://gitlab.com/company/plugins.git

315```454```

316 455 

317### Use local marketplaces for development456### Private repositories

318 457 

319Test your marketplace locally before distribution:458Claude Code supports installing plugins from private repositories. For manual installation and updates, Claude Code uses your existing git credential helpers. If `git clone` works for a private repository in your terminal, it works in Claude Code too. Common credential helpers include `gh auth login` for GitHub, macOS Keychain, and `git-credential-store`.

320 459 

321```shell Add local marketplace for testing theme={null}460Background auto-updates run at startup without credential helpers, since interactive prompts would block Claude Code from starting. To enable auto-updates for private marketplaces, set the appropriate authentication token in your environment:

322/plugin marketplace add ./my-local-marketplace461 

462| Provider | Environment variables | Notes |

463| :-------- | :--------------------------- | :---------------------------------------- |

464| GitHub | `GITHUB_TOKEN` or `GH_TOKEN` | Personal access token or GitHub App token |

465| GitLab | `GITLAB_TOKEN` or `GL_TOKEN` | Personal access token or project token |

466| Bitbucket | `BITBUCKET_TOKEN` | App password or repository access token |

467 

468Set the token in your shell configuration (for example, `.bashrc`, `.zshrc`) or pass it when running Claude Code:

469 

470```bash theme={null}

471export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx

323```472```

324 473 

325```shell Test plugin installation theme={null}474<Note>

475 For CI/CD environments, configure the token as a secret environment variable. GitHub Actions automatically provides `GITHUB_TOKEN` for repositories in the same organization.

476</Note>

477 

478### Test locally before distribution

479 

480Test your marketplace locally before sharing:

481 

482```shell theme={null}

483/plugin marketplace add ./my-local-marketplace

326/plugin install test-plugin@my-local-marketplace484/plugin install test-plugin@my-local-marketplace

327```485```

328 486 

329## Manage marketplace operations487For the full range of add commands (GitHub, Git URLs, local paths, remote URLs), see [Add marketplaces](/en/discover-plugins#add-marketplaces).

488 

489### Require marketplaces for your team

330 490 

331### List known marketplaces491You can configure your repository so team members are automatically prompted to install your marketplace when they trust the project folder. Add your marketplace to `.claude/settings.json`:

332 492 

333```shell List all configured marketplaces theme={null}493```json theme={null}

334/plugin marketplace list494{

495 "extraKnownMarketplaces": {

496 "company-tools": {

497 "source": {

498 "source": "github",

499 "repo": "your-org/claude-plugins"

500 }

501 }

502 }

503}

504```

505 

506You can also specify which plugins should be enabled by default:

507 

508```json theme={null}

509{

510 "enabledPlugins": {

511 "code-formatter@company-tools": true,

512 "deployment-tools@company-tools": true

513 }

514}

335```515```

336 516 

337Shows all configured marketplaces with their sources and status.517For full configuration options, see [Plugin settings](/en/settings#plugin-settings).

338 518 

339### Update marketplace metadata519### Managed marketplace restrictions

340 520 

341```shell Refresh marketplace metadata theme={null}521For organizations requiring strict control over plugin sources, administrators can restrict which plugin marketplaces users are allowed to add using the [`strictKnownMarketplaces`](/en/settings#strictknownmarketplaces) setting in managed settings.

342/plugin marketplace update marketplace-name522 

523When `strictKnownMarketplaces` is configured in managed settings, the restriction behavior depends on the value:

524 

525| Value | Behavior |

526| ------------------- | ---------------------------------------------------------------- |

527| Undefined (default) | No restrictions. Users can add any marketplace |

528| Empty array `[]` | Complete lockdown. Users cannot add any new marketplaces |

529| List of sources | Users can only add marketplaces that match the allowlist exactly |

530 

531#### Common configurations

532 

533Disable all marketplace additions:

534 

535```json theme={null}

536{

537 "strictKnownMarketplaces": []

538}

343```539```

344 540 

345Refreshes plugin listings and metadata from the marketplace source.541Allow specific marketplaces only:

542 

543```json theme={null}

544{

545 "strictKnownMarketplaces": [

546 {

547 "source": "github",

548 "repo": "acme-corp/approved-plugins"

549 },

550 {

551 "source": "github",

552 "repo": "acme-corp/security-tools",

553 "ref": "v2.0"

554 },

555 {

556 "source": "url",

557 "url": "https://plugins.example.com/marketplace.json"

558 }

559 ]

560}

561```

346 562 

347### Remove a marketplace563Allow all marketplaces from an internal git server using regex pattern matching:

348 564 

349```shell Remove a marketplace theme={null}565```json theme={null}

350/plugin marketplace remove marketplace-name566{

567 "strictKnownMarketplaces": [

568 {

569 "source": "hostPattern",

570 "hostPattern": "^github\\.example\\.com$"

571 }

572 ]

573}

351```574```

352 575 

353Removes the marketplace from your configuration.576#### How restrictions work

577 

578Restrictions are validated early in the plugin installation process, before any network requests or filesystem operations occur. This prevents unauthorized marketplace access attempts.

579 

580The allowlist uses exact matching for most source types. For a marketplace to be allowed, all specified fields must match exactly:

581 

582* For GitHub sources: `repo` is required, and `ref` or `path` must also match if specified in the allowlist

583* For URL sources: the full URL must match exactly

584* For `hostPattern` sources: the marketplace host is matched against the regex pattern

585 

586Because `strictKnownMarketplaces` is set in [managed settings](/en/settings#settings-files), individual users and project configurations cannot override these restrictions.

587 

588For complete configuration details including all supported source types and comparison with `extraKnownMarketplaces`, see the [strictKnownMarketplaces reference](/en/settings#strictknownmarketplaces).

589 

590### Version resolution and release channels

591 

592Plugin versions determine cache paths and update detection. You can specify the version in the plugin manifest (`plugin.json`) or in the marketplace entry (`marketplace.json`).

354 593 

355<Warning>594<Warning>

356 Removing a marketplace will uninstall any plugins you installed from it.595 When possible, avoid setting the version in both places. The plugin manifest always wins silently, which can cause the marketplace version to be ignored. For relative-path plugins, set the version in the marketplace entry. For all other plugin sources, set it in the plugin manifest.

357</Warning>596</Warning>

358 597 

359***598#### Set up release channels

360 599 

361## Troubleshooting marketplaces600To support "stable" and "latest" release channels for your plugins, you can set up two marketplaces that point to different refs or SHAs of the same repo. You can then assign the two marketplaces to different user groups through [managed settings](/en/settings#settings-files).

362 601 

363### Common marketplace issues602<Warning>

603 The plugin's `plugin.json` must declare a different `version` at each pinned ref or commit. If two refs or commits have the same manifest version, Claude Code treats them as identical and skips the update.

604</Warning>

364 605 

365#### Marketplace not loading606##### Example

607 

608```json theme={null}

609{

610 "name": "stable-tools",

611 "plugins": [

612 {

613 "name": "code-formatter",

614 "source": {

615 "source": "github",

616 "repo": "acme-corp/code-formatter",

617 "ref": "stable"

618 }

619 }

620 ]

621}

622```

623 

624```json theme={null}

625{

626 "name": "latest-tools",

627 "plugins": [

628 {

629 "name": "code-formatter",

630 "source": {

631 "source": "github",

632 "repo": "acme-corp/code-formatter",

633 "ref": "latest"

634 }

635 }

636 ]

637}

638```

639 

640##### Assign channels to user groups

641 

642Assign each marketplace to the appropriate user group through managed settings. For example, the stable group receives:

643 

644```json theme={null}

645{

646 "extraKnownMarketplaces": {

647 "stable-tools": {

648 "source": {

649 "source": "github",

650 "repo": "acme-corp/stable-tools"

651 }

652 }

653 }

654}

655```

656 

657The early-access group receives `latest-tools` instead:

658 

659```json theme={null}

660{

661 "extraKnownMarketplaces": {

662 "latest-tools": {

663 "source": {

664 "source": "github",

665 "repo": "acme-corp/latest-tools"

666 }

667 }

668 }

669}

670```

671 

672## Validation and testing

673 

674Test your marketplace before sharing.

675 

676Validate your marketplace JSON syntax:

677 

678```bash theme={null}

679claude plugin validate .

680```

681 

682Or from within Claude Code:

683 

684```shell theme={null}

685/plugin validate .

686```

687 

688Add the marketplace for testing:

689 

690```shell theme={null}

691/plugin marketplace add ./path/to/marketplace

692```

693 

694Install a test plugin to verify everything works:

695 

696```shell theme={null}

697/plugin install test-plugin@marketplace-name

698```

699 

700For complete plugin testing workflows, see [Test your plugins locally](/en/plugins#test-your-plugins-locally). For technical troubleshooting, see [Plugins reference](/en/plugins-reference).

701 

702## Troubleshooting

703 

704### Marketplace not loading

366 705 

367**Symptoms**: Can't add marketplace or see plugins from it706**Symptoms**: Can't add marketplace or see plugins from it

368 707 


370 709 

371* Verify the marketplace URL is accessible710* Verify the marketplace URL is accessible

372* Check that `.claude-plugin/marketplace.json` exists at the specified path711* Check that `.claude-plugin/marketplace.json` exists at the specified path

373* Ensure JSON syntax is valid using `claude plugin validate`712* Ensure JSON syntax is valid using `claude plugin validate` or `/plugin validate`

374* For private repositories, confirm you have access permissions713* For private repositories, confirm you have access permissions

375 714 

376#### Plugin installation failures715### Marketplace validation errors

716 

717Run `claude plugin validate .` or `/plugin validate .` from your marketplace directory to check for issues. Common errors:

718 

719| Error | Cause | Solution |

720| :------------------------------------------------ | :------------------------------ | :------------------------------------------------------------ |

721| `File not found: .claude-plugin/marketplace.json` | Missing manifest | Create `.claude-plugin/marketplace.json` with required fields |

722| `Invalid JSON syntax: Unexpected token...` | JSON syntax error | Check for missing commas, extra commas, or unquoted strings |

723| `Duplicate plugin name "x" found in marketplace` | Two plugins share the same name | Give each plugin a unique `name` value |

724| `plugins[0].source: Path traversal not allowed` | Source path contains `..` | Use paths relative to marketplace root without `..` |

725 

726**Warnings** (non-blocking):

727 

728* `Marketplace has no plugins defined`: add at least one plugin to the `plugins` array

729* `No marketplace description provided`: add `metadata.description` to help users understand your marketplace

730 

731### Plugin installation failures

377 732 

378**Symptoms**: Marketplace appears but plugin installation fails733**Symptoms**: Marketplace appears but plugin installation fails

379 734 


384* For GitHub sources, ensure repositories are public or you have access739* For GitHub sources, ensure repositories are public or you have access

385* Test plugin sources manually by cloning/downloading740* Test plugin sources manually by cloning/downloading

386 741 

387### Validation and testing742### Private repository authentication fails

388 743 

389Test your marketplace before sharing:744**Symptoms**: Authentication errors when installing plugins from private repositories

390 745 

391```bash Validate marketplace JSON syntax theme={null}746**Solutions**:

392claude plugin validate .

393```

394 747 

395```shell Add marketplace for testing theme={null}748For manual installation and updates:

396/plugin marketplace add ./path/to/marketplace

397```

398 749 

399```shell Install test plugin theme={null}750* Verify you're authenticated with your git provider (for example, run `gh auth status` for GitHub)

400/plugin install test-plugin@marketplace-name751* Check that your credential helper is configured correctly: `git config --global credential.helper`

752* Try cloning the repository manually to verify your credentials work

753 

754For background auto-updates:

755 

756* Set the appropriate token in your environment: `echo $GITHUB_TOKEN`

757* Check that the token has the required permissions (read access to the repository)

758* For GitHub, ensure the token has the `repo` scope for private repositories

759* For GitLab, ensure the token has at least `read_repository` scope

760* Verify the token hasn't expired

761 

762### Git operations time out

763 

764**Symptoms**: Plugin installation or marketplace updates fail with a timeout error like "Git clone timed out after 120s" or "Git pull timed out after 120s".

765 

766**Cause**: Claude Code uses a 120-second timeout for all git operations, including cloning plugin repositories and pulling marketplace updates. Large repositories or slow network connections may exceed this limit.

767 

768**Solution**: Increase the timeout using the `CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS` environment variable. The value is in milliseconds:

769 

770```bash theme={null}

771export CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS=300000 # 5 minutes

401```772```

402 773 

403For complete plugin testing workflows, see [Test your plugins locally](/en/docs/claude-code/plugins#test-your-plugins-locally). For technical troubleshooting, see [Plugins reference](/en/docs/claude-code/plugins-reference).774### Plugins with relative paths fail in URL-based marketplaces

404 775 

405***776**Symptoms**: Added a marketplace via URL (such as `https://example.com/marketplace.json`), but plugins with relative path sources like `"./plugins/my-plugin"` fail to install with "path not found" errors.

406 777 

407## Next steps778**Cause**: URL-based marketplaces only download the `marketplace.json` file itself. They do not download plugin files from the server. Relative paths in the marketplace entry reference files on the remote server that were not downloaded.

779 

780**Solutions**:

408 781 

409### For marketplace users782* **Use external sources**: Change plugin entries to use GitHub, npm, or git URL sources instead of relative paths:

783 ```json theme={null}

784 { "name": "my-plugin", "source": { "source": "github", "repo": "owner/repo" } }

785 ```

786* **Use a Git-based marketplace**: Host your marketplace in a Git repository and add it with the git URL. Git-based marketplaces clone the entire repository, making relative paths work correctly.

410 787 

411* **Discover community marketplaces**: Search GitHub for Claude Code plugin collections788### Files not found after installation

412* **Contribute feedback**: Report issues and suggest improvements to marketplace maintainers

413* **Share useful marketplaces**: Help your team discover valuable plugin collections

414 789 

415### For marketplace creators790**Symptoms**: Plugin installs but references to files fail, especially files outside the plugin directory

416 791 

417* **Build plugin collections**: Create themed marketplace around specific use cases792**Cause**: Plugins are copied to a cache directory rather than used in-place. Paths that reference files outside the plugin's directory (such as `../shared-utils`) won't work because those files aren't copied.

418* **Establish versioning**: Implement clear versioning and update policies

419* **Community engagement**: Gather feedback and maintain active marketplace communities

420* **Documentation**: Provide clear README files explaining your marketplace contents

421 793 

422### For organizations794**Solutions**: See [Plugin caching and file resolution](/en/plugins-reference#plugin-caching-and-file-resolution) for workarounds including symlinks and directory restructuring.

423 795 

424* **Private marketplaces**: Set up internal marketplaces for proprietary tools796For additional debugging tools and common issues, see [Debugging and development tools](/en/plugins-reference#debugging-and-development-tools).

425* **Governance policies**: Establish guidelines for plugin approval and security review

426* **Training resources**: Help teams discover and adopt useful plugins effectively

427 797 

428## See also798## See also

429 799 

430* [Plugins](/en/docs/claude-code/plugins) - Installing and using plugins800* [Discover and install prebuilt plugins](/en/discover-plugins) - Installing plugins from existing marketplaces

431* [Plugins reference](/en/docs/claude-code/plugins-reference) - Complete technical specifications and schemas801* [Plugins](/en/plugins) - Creating your own plugins

432* [Plugin development](/en/docs/claude-code/plugins#develop-more-complex-plugins) - Creating your own plugins802* [Plugins reference](/en/plugins-reference) - Complete technical specifications and schemas

433* [Settings](/en/docs/claude-code/settings#plugin-configuration) - Plugin configuration options803* [Plugin settings](/en/settings#plugin-settings) - Plugin configuration options

804* [strictKnownMarketplaces reference](/en/settings#strictknownmarketplaces) - Managed marketplace restrictions

plugins.md +284 −250

Details

1# Plugins1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Extend Claude Code with custom commands, agents, hooks, Skills, and MCP servers through the plugin system.5# Create plugins

6 

7> Create custom plugins to extend Claude Code with skills, agents, hooks, and MCP servers.

8 

9Plugins let you extend Claude Code with custom functionality that can be shared across projects and teams. This guide covers creating your own plugins with skills, agents, hooks, and MCP servers.

10 

11Looking to install existing plugins? See [Discover and install plugins](/en/discover-plugins). For complete technical specifications, see [Plugins reference](/en/plugins-reference).

12 

13## When to use plugins vs standalone configuration

14 

15Claude Code supports two ways to add custom skills, agents, and hooks:

16 

17| Approach | Skill names | Best for |

18| :---------------------------------------------------------- | :------------------- | :---------------------------------------------------------------------------------------------- |

19| **Standalone** (`.claude/` directory) | `/hello` | Personal workflows, project-specific customizations, quick experiments |

20| **Plugins** (directories with `.claude-plugin/plugin.json`) | `/plugin-name:hello` | Sharing with teammates, distributing to community, versioned releases, reusable across projects |

21 

22**Use standalone configuration when**:

23 

24* You're customizing Claude Code for a single project

25* The configuration is personal and doesn't need to be shared

26* You're experimenting with skills or hooks before packaging them

27* You want short skill names like `/hello` or `/review`

28 

29**Use plugins when**:

30 

31* You want to share functionality with your team or community

32* You need the same skills/agents across multiple projects

33* You want version control and easy updates for your extensions

34* You're distributing through a marketplace

35* You're okay with namespaced skills like `/my-plugin:hello` (namespacing prevents conflicts between plugins)

4 36 

5<Tip>37<Tip>

6 For complete technical specifications and schemas, see [Plugins reference](/en/docs/claude-code/plugins-reference). For marketplace management, see [Plugin marketplaces](/en/docs/claude-code/plugin-marketplaces).38 Start with standalone configuration in `.claude/` for quick iteration, then [convert to a plugin](#convert-existing-configurations-to-plugins) when you're ready to share.

7</Tip>39</Tip>

8 40 

9Plugins let you extend Claude Code with custom functionality that can be shared across projects and teams. Install plugins from [marketplaces](/en/docs/claude-code/plugin-marketplaces) to add pre-built commands, agents, hooks, Skills, and MCP servers, or create your own to automate your workflows.

10 

11## Quickstart41## Quickstart

12 42 

13Let's create a simple greeting plugin to get you familiar with the plugin system. We'll build a working plugin that adds a custom command, test it locally, and understand the core concepts.43This quickstart walks you through creating a plugin with a custom skill. You'll create a manifest (the configuration file that defines your plugin), add a skill, and test it locally using the `--plugin-dir` flag.

14 44 

15### Prerequisites45### Prerequisites

16 46 

17* Claude Code installed on your machine47* Claude Code [installed and authenticated](/en/quickstart#step-1-install-claude-code)

18* Basic familiarity with command-line tools48* Claude Code version 1.0.33 or later (run `claude --version` to check)

49 

50<Note>

51 If you don't see the `/plugin` command, update Claude Code to the latest version. See [Troubleshooting](/en/troubleshooting) for upgrade instructions.

52</Note>

19 53 

20### Create your first plugin54### Create your first plugin

21 55 

22<Steps>56<Steps>

23 <Step title="Create the marketplace structure">

24 ```bash theme={null}

25 mkdir test-marketplace

26 cd test-marketplace

27 ```

28 </Step>

29 

30 <Step title="Create the plugin directory">57 <Step title="Create the plugin directory">

58 Every plugin lives in its own directory containing a manifest and your skills, agents, or hooks. Create one now:

59 

31 ```bash theme={null}60 ```bash theme={null}

32 mkdir my-first-plugin61 mkdir my-first-plugin

33 cd my-first-plugin

34 ```62 ```

35 </Step>63 </Step>

36 64 

37 <Step title="Create the plugin manifest">65 <Step title="Create the plugin manifest">

38 ```bash Create .claude-plugin/plugin.json theme={null}66 The manifest file at `.claude-plugin/plugin.json` defines your plugin's identity: its name, description, and version. Claude Code uses this metadata to display your plugin in the plugin manager.

39 mkdir .claude-plugin67 

40 cat > .claude-plugin/plugin.json << 'EOF'68 Create the `.claude-plugin` directory inside your plugin folder:

69 

70 ```bash theme={null}

71 mkdir my-first-plugin/.claude-plugin

72 ```

73 

74 Then create `my-first-plugin/.claude-plugin/plugin.json` with this content:

75 

76 ```json my-first-plugin/.claude-plugin/plugin.json theme={null}

41 {77 {

42 "name": "my-first-plugin",78 "name": "my-first-plugin",

43 "description": "A simple greeting plugin to learn the basics",79 "description": "A greeting plugin to learn the basics",

44 "version": "1.0.0",80 "version": "1.0.0",

45 "author": {81 "author": {

46 "name": "Your Name"82 "name": "Your Name"

47 }83 }

48 }84 }

49 EOF

50 ```85 ```

86 

87 | Field | Purpose |

88 | :------------ | :----------------------------------------------------------------------------------------------------- |

89 | `name` | Unique identifier and skill namespace. Skills are prefixed with this (e.g., `/my-first-plugin:hello`). |

90 | `description` | Shown in the plugin manager when browsing or installing plugins. |

91 | `version` | Track releases using [semantic versioning](/en/plugins-reference#version-management). |

92 | `author` | Optional. Helpful for attribution. |

93 

94 For additional fields like `homepage`, `repository`, and `license`, see the [full manifest schema](/en/plugins-reference#plugin-manifest-schema).

51 </Step>95 </Step>

52 96 

53 <Step title="Add a custom command">97 <Step title="Add a skill">

54 ```bash Create commands/hello.md theme={null}98 Skills live in the `skills/` directory. Each skill is a folder containing a `SKILL.md` file. The folder name becomes the skill name, prefixed with the plugin's namespace (`hello/` in a plugin named `my-first-plugin` creates `/my-first-plugin:hello`).

55 mkdir commands

56 cat > commands/hello.md << 'EOF'

57 ---

58 description: Greet the user with a personalized message

59 ---

60 99 

61 # Hello Command100 Create a skill directory in your plugin folder:

62 101 

63 Greet the user warmly and ask how you can help them today. Make the greeting personal and encouraging.102 ```bash theme={null}

64 EOF103 mkdir -p my-first-plugin/skills/hello

65 ```104 ```

66 </Step>

67 105 

68 <Step title="Create the marketplace manifest">106 Then create `my-first-plugin/skills/hello/SKILL.md` with this content:

69 ```bash Create marketplace.json theme={null}107 

70 cd ..108 ```markdown my-first-plugin/skills/hello/SKILL.md theme={null}

71 mkdir .claude-plugin109 ---

72 cat > .claude-plugin/marketplace.json << 'EOF'110 description: Greet the user with a friendly message

73 {111 disable-model-invocation: true

74 "name": "test-marketplace",112 ---

75 "owner": {113 

76 "name": "Test User"114 Greet the user warmly and ask how you can help them today.

77 },

78 "plugins": [

79 {

80 "name": "my-first-plugin",

81 "source": "./my-first-plugin",

82 "description": "My first test plugin"

83 }

84 ]

85 }

86 EOF

87 ```115 ```

88 </Step>116 </Step>

89 117 

90 <Step title="Install and test your plugin">118 <Step title="Test your plugin">

91 ```bash Start Claude Code from parent directory theme={null}119 Run Claude Code with the `--plugin-dir` flag to load your plugin:

92 cd ..120 

93 claude121 ```bash theme={null}

122 claude --plugin-dir ./my-first-plugin

94 ```123 ```

95 124 

96 ```shell Add the test marketplace theme={null}125 Once Claude Code starts, try your new skill:

97 /plugin marketplace add ./test-marketplace126 

127 ```shell theme={null}

128 /my-first-plugin:hello

98 ```129 ```

99 130 

100 ```shell Install your plugin theme={null}131 You'll see Claude respond with a greeting. Run `/help` to see your skill listed under the plugin namespace.

101 /plugin install my-first-plugin@test-marketplace132 

133 <Note>

134 **Why namespacing?** Plugin skills are always namespaced (like `/greet:hello`) to prevent conflicts when multiple plugins have skills with the same name.

135 

136 To change the namespace prefix, update the `name` field in `plugin.json`.

137 </Note>

138 </Step>

139 

140 <Step title="Add skill arguments">

141 Make your skill dynamic by accepting user input. The `$ARGUMENTS` placeholder captures any text the user provides after the skill name.

142 

143 Update your `SKILL.md` file:

144 

145 ```markdown my-first-plugin/skills/hello/SKILL.md theme={null}

146 ---

147 description: Greet the user with a personalized message

148 ---

149 

150 # Hello Skill

151 

152 Greet the user named "$ARGUMENTS" warmly and ask how you can help them today. Make the greeting personal and encouraging.

102 ```153 ```

103 154 

104 Select "Install now". You'll then need to restart Claude Code in order to use the new plugin.155 Restart Claude Code to pick up the changes, then try the skill with your name:

105 156 

106 ```shell Try your new command theme={null}157 ```shell theme={null}

107 /hello158 /my-first-plugin:hello Alex

108 ```159 ```

109 160 

110 You'll see Claude use your greeting command! Check `/help` to see your new command listed.161 Claude will greet you by name. For more on passing arguments to skills, see [Skills](/en/skills#pass-arguments-to-skills).

111 </Step>162 </Step>

112</Steps>163</Steps>

113 164 

114You've successfully created and tested a plugin with these key components:165You've successfully created and tested a plugin with these key components:

115 166 

116* **Plugin manifest** (`.claude-plugin/plugin.json`) - Describes your plugin's metadata167* **Plugin manifest** (`.claude-plugin/plugin.json`): describes your plugin's metadata

117* **Commands directory** (`commands/`) - Contains your custom slash commands168* **Skills directory** (`skills/`): contains your custom skills

118* **Test marketplace** - Allows you to test your plugin locally169* **Skill arguments** (`$ARGUMENTS`): captures user input for dynamic behavior

119 170 

120### Plugin structure overview171<Tip>

172 The `--plugin-dir` flag is useful for development and testing. When you're ready to share your plugin with others, see [Create and distribute a plugin marketplace](/en/plugin-marketplaces).

173</Tip>

121 174 

122Your plugin follows this basic structure:175## Plugin structure overview

123 176 

124```177You've created a plugin with a skill, but plugins can include much more: custom agents, hooks, MCP servers, and LSP servers.

125my-first-plugin/

126├── .claude-plugin/

127│ └── plugin.json # Plugin metadata

128├── commands/ # Custom slash commands (optional)

129│ └── hello.md

130├── agents/ # Custom agents (optional)

131│ └── helper.md

132├── skills/ # Agent Skills (optional)

133│ └── my-skill/

134│ └── SKILL.md

135└── hooks/ # Event handlers (optional)

136 └── hooks.json

137```

138 178 

139**Additional components you can add:**179<Warning>

180 **Common mistake**: Don't put `commands/`, `agents/`, `skills/`, or `hooks/` inside the `.claude-plugin/` directory. Only `plugin.json` goes inside `.claude-plugin/`. All other directories must be at the plugin root level.

181</Warning>

140 182 

141* **Commands**: Create markdown files in `commands/` directory183| Directory | Location | Purpose |

142* **Agents**: Create agent definitions in `agents/` directory184| :---------------- | :---------- | :----------------------------------------------------------------------------- |

143* **Skills**: Create `SKILL.md` files in `skills/` directory185| `.claude-plugin/` | Plugin root | Contains `plugin.json` manifest (optional if components use default locations) |

144* **Hooks**: Create `hooks/hooks.json` for event handling186| `commands/` | Plugin root | Skills as Markdown files |

145* **MCP servers**: Create `.mcp.json` for external tool integration187| `agents/` | Plugin root | Custom agent definitions |

188| `skills/` | Plugin root | Agent Skills with `SKILL.md` files |

189| `hooks/` | Plugin root | Event handlers in `hooks.json` |

190| `.mcp.json` | Plugin root | MCP server configurations |

191| `.lsp.json` | Plugin root | LSP server configurations for code intelligence |

192| `settings.json` | Plugin root | Default [settings](/en/settings) applied when the plugin is enabled |

146 193 

147<Note>194<Note>

148 **Next steps**: Ready to add more features? Jump to [Develop more complex plugins](#develop-more-complex-plugins) to add agents, hooks, and MCP servers. For complete technical specifications of all plugin components, see [Plugins reference](/en/docs/claude-code/plugins-reference).195 **Next steps**: Ready to add more features? Jump to [Develop more complex plugins](#develop-more-complex-plugins) to add agents, hooks, MCP servers, and LSP servers. For complete technical specifications of all plugin components, see [Plugins reference](/en/plugins-reference).

149</Note>196</Note>

150 197 

151***198## Develop more complex plugins

152 199 

153## Install and manage plugins200Once you're comfortable with basic plugins, you can create more sophisticated extensions.

201 

202### Add Skills to your plugin

154 203 

155Learn how to discover, install, and manage plugins to extend your Claude Code capabilities.204Plugins can include [Agent Skills](/en/skills) to extend Claude's capabilities. Skills are model-invoked: Claude automatically uses them based on the task context.

156 205 

157### Prerequisites206Add a `skills/` directory at your plugin root with Skill folders containing `SKILL.md` files:

158 207 

159* Claude Code installed and running208```

160* Basic familiarity with command-line interfaces209my-plugin/

210├── .claude-plugin/

211│ └── plugin.json

212└── skills/

213 └── code-review/

214 └── SKILL.md

215```

161 216 

162### Add marketplaces217Each `SKILL.md` needs frontmatter with `name` and `description` fields, followed by instructions:

163 218 

164Marketplaces are catalogs of available plugins. Add them to discover and install plugins:219```yaml theme={null}

220---

221name: code-review

222description: Reviews code for best practices and potential issues. Use when reviewing code, checking PRs, or analyzing code quality.

223---

165 224 

166```shell Add a marketplace theme={null}225When reviewing code, check for:

167/plugin marketplace add your-org/claude-plugins2261. Code organization and structure

2272. Error handling

2283. Security concerns

2294. Test coverage

168```230```

169 231 

170```shell Browse available plugins theme={null}232After installing the plugin, restart Claude Code to load the Skills. For complete Skill authoring guidance including progressive disclosure and tool restrictions, see [Agent Skills](/en/skills).

171/plugin

172```

173 233 

174For detailed marketplace management including Git repositories, local development, and team distribution, see [Plugin marketplaces](/en/docs/claude-code/plugin-marketplaces).234### Add LSP servers to your plugin

175 235 

176### Install plugins236<Tip>

237 For common languages like TypeScript, Python, and Rust, install the pre-built LSP plugins from the official marketplace. Create custom LSP plugins only when you need support for languages not already covered.

238</Tip>

177 239 

178#### Via interactive menu (recommended for discovery)240LSP (Language Server Protocol) plugins give Claude real-time code intelligence. If you need to support a language that doesn't have an official LSP plugin, you can create your own by adding an `.lsp.json` file to your plugin:

179 241 

180```shell Open the plugin management interface theme={null}242```json .lsp.json theme={null}

181/plugin243{

244 "go": {

245 "command": "gopls",

246 "args": ["serve"],

247 "extensionToLanguage": {

248 ".go": "go"

249 }

250 }

251}

182```252```

183 253 

184Select "Browse Plugins" to see available options with descriptions, features, and installation options.254Users installing your plugin must have the language server binary installed on their machine.

185 255 

186#### Via direct commands (for quick installation)256For complete LSP configuration options, see [LSP servers](/en/plugins-reference#lsp-servers).

187 257 

188```shell Install a specific plugin theme={null}258### Ship default settings with your plugin

189/plugin install formatter@your-org

190```

191 259 

192```shell Enable a disabled plugin theme={null}260Plugins can include a `settings.json` file at the plugin root to apply default configuration when the plugin is enabled. Currently, only the `agent` key is supported.

193/plugin enable plugin-name@marketplace-name

194```

195 261 

196```shell Disable without uninstalling theme={null}262Setting `agent` activates one of the plugin's [custom agents](/en/sub-agents) as the main thread, applying its system prompt, tool restrictions, and model. This lets a plugin change how Claude Code behaves by default when enabled.

197/plugin disable plugin-name@marketplace-name

198```

199 263 

200```shell Completely remove a plugin theme={null}264```json settings.json theme={null}

201/plugin uninstall plugin-name@marketplace-name265{

266 "agent": "security-reviewer"

267}

202```268```

203 269 

204### Verify installation270This example activates the `security-reviewer` agent defined in the plugin's `agents/` directory. Settings from `settings.json` take priority over `settings` declared in `plugin.json`. Unknown keys are silently ignored.

205 271 

206After installing a plugin:272### Organize complex plugins

207 273 

2081. **Check available commands**: Run `/help` to see new commands274For plugins with many components, organize your directory structure by functionality. For complete directory layouts and organization patterns, see [Plugin directory structure](/en/plugins-reference#plugin-directory-structure).

2092. **Test plugin features**: Try the plugin's commands and features

2103. **Review plugin details**: Use `/plugin` → "Manage Plugins" to see what the plugin provides

211 275 

212## Set up team plugin workflows276### Test your plugins locally

213 277 

214Configure plugins at the repository level to ensure consistent tooling across your team. When team members trust your repository folder, Claude Code automatically installs specified marketplaces and plugins.278Use the `--plugin-dir` flag to test plugins during development. This loads your plugin directly without requiring installation.

215 279 

216**To set up team plugins:**280```bash theme={null}

281claude --plugin-dir ./my-plugin

282```

217 283 

2181. Add marketplace and plugin configuration to your repository's `.claude/settings.json`284As you make changes to your plugin, restart Claude Code to pick up the updates. Test your plugin components:

2192. Team members trust the repository folder

2203. Plugins install automatically for all team members

221 285 

222For complete instructions including configuration examples, marketplace setup, and rollout best practices, see [Configure team marketplaces](/en/docs/claude-code/plugin-marketplaces#how-to-configure-team-marketplaces).286* Try your skills with `/plugin-name:skill-name`

287* Check that agents appear in `/agents`

288* Verify hooks work as expected

223 289 

224***290<Tip>

291 You can load multiple plugins at once by specifying the flag multiple times:

225 292 

226## Develop more complex plugins293 ```bash theme={null}

294 claude --plugin-dir ./plugin-one --plugin-dir ./plugin-two

295 ```

296</Tip>

227 297 

228Once you're comfortable with basic plugins, you can create more sophisticated extensions.298### Debug plugin issues

229 299 

230### Add Skills to your plugin300If your plugin isn't working as expected:

231 301 

232Plugins can include [Agent Skills](/en/docs/claude-code/skills) to extend Claude's capabilities. Skills are model-invoked—Claude autonomously uses them based on the task context.3021. **Check the structure**: Ensure your directories are at the plugin root, not inside `.claude-plugin/`

3032. **Test components individually**: Check each command, agent, and hook separately

3043. **Use validation and debugging tools**: See [Debugging and development tools](/en/plugins-reference#debugging-and-development-tools) for CLI commands and troubleshooting techniques

233 305 

234To add Skills to your plugin, create a `skills/` directory at your plugin root and add Skill folders with `SKILL.md` files. Plugin Skills are automatically available when the plugin is installed.306### Share your plugins

235 307 

236For complete Skill authoring guidance, see [Agent Skills](/en/docs/claude-code/skills).308When your plugin is ready to share:

237 309 

238### Organize complex plugins3101. **Add documentation**: Include a `README.md` with installation and usage instructions

3112. **Version your plugin**: Use [semantic versioning](/en/plugins-reference#version-management) in your `plugin.json`

3123. **Create or use a marketplace**: Distribute through [plugin marketplaces](/en/plugin-marketplaces) for installation

3134. **Test with others**: Have team members test the plugin before wider distribution

239 314 

240For plugins with many components, organize your directory structure by functionality. For complete directory layouts and organization patterns, see [Plugin directory structure](/en/docs/claude-code/plugins-reference#plugin-directory-structure).315Once your plugin is in a marketplace, others can install it using the instructions in [Discover and install plugins](/en/discover-plugins).

241 316 

242### Test your plugins locally317<Note>

318 For complete technical specifications, debugging techniques, and distribution strategies, see [Plugins reference](/en/plugins-reference).

319</Note>

243 320 

244When developing plugins, use a local marketplace to test changes iteratively. This workflow builds on the quickstart pattern and works for plugins of any complexity.321## Convert existing configurations to plugins

245 322 

246<Steps>323If you already have skills or hooks in your `.claude/` directory, you can convert them into a plugin for easier sharing and distribution.

247 <Step title="Set up your development structure">

248 Organize your plugin and marketplace for testing:

249 324 

250 ```bash Create directory structure theme={null}325### Migration steps

251 mkdir dev-marketplace

252 cd dev-marketplace

253 mkdir my-plugin

254 ```

255 326 

256 This creates:327<Steps>

328 <Step title="Create the plugin structure">

329 Create a new plugin directory:

257 330 

331 ```bash theme={null}

332 mkdir -p my-plugin/.claude-plugin

258 ```333 ```

259 dev-marketplace/

260 ├── .claude-plugin/marketplace.json (you'll create this)

261 └── my-plugin/ (your plugin under development)

262 ├── .claude-plugin/plugin.json

263 ├── commands/

264 ├── agents/

265 └── hooks/

266 ```

267 </Step>

268 334 

269 <Step title="Create the marketplace manifest">335 Create the manifest file at `my-plugin/.claude-plugin/plugin.json`:

270 ```bash Create marketplace.json theme={null}336 

271 mkdir .claude-plugin337 ```json my-plugin/.claude-plugin/plugin.json theme={null}

272 cat > .claude-plugin/marketplace.json << 'EOF'

273 {

274 "name": "dev-marketplace",

275 "owner": {

276 "name": "Developer"

277 },

278 "plugins": [

279 {338 {

280 "name": "my-plugin",339 "name": "my-plugin",

281 "source": "./my-plugin",340 "description": "Migrated from standalone configuration",

282 "description": "Plugin under development"341 "version": "1.0.0"

283 }

284 ]

285 }342 }

286 EOF

287 ```343 ```

288 </Step>344 </Step>

289 345 

290 <Step title="Install and test">346 <Step title="Copy your existing files">

291 ```bash Start Claude Code from parent directory theme={null}347 Copy your existing configurations to the plugin directory:

292 cd ..

293 claude

294 ```

295 348 

296 ```shell Add your development marketplace theme={null}349 ```bash theme={null}

297 /plugin marketplace add ./dev-marketplace350 # Copy commands

298 ```351 cp -r .claude/commands my-plugin/

299 

300 ```shell Install your plugin theme={null}

301 /plugin install my-plugin@dev-marketplace

302 ```

303 352 

304 Test your plugin components:353 # Copy agents (if any)

354 cp -r .claude/agents my-plugin/

305 355 

306 * Try your commands with `/command-name`356 # Copy skills (if any)

307 * Check that agents appear in `/agents`357 cp -r .claude/skills my-plugin/

308 * Verify hooks work as expected358 ```

309 </Step>359 </Step>

310 360 

311 <Step title="Iterate on your plugin">361 <Step title="Migrate hooks">

312 After making changes to your plugin code:362 If you have hooks in your settings, create a hooks directory:

313 363 

314 ```shell Uninstall the current version theme={null}364 ```bash theme={null}

315 /plugin uninstall my-plugin@dev-marketplace365 mkdir my-plugin/hooks

316 ```366 ```

317 367 

318 ```shell Reinstall to test changes theme={null}368 Create `my-plugin/hooks/hooks.json` with your hooks configuration. Copy the `hooks` object from your `.claude/settings.json` or `settings.local.json`, since the format is the same. The command receives hook input as JSON on stdin, so use `jq` to extract the file path:

319 /plugin install my-plugin@dev-marketplace

320 ```

321 369 

322 Repeat this cycle as you develop and refine your plugin.370 ```json my-plugin/hooks/hooks.json theme={null}

371 {

372 "hooks": {

373 "PostToolUse": [

374 {

375 "matcher": "Write|Edit",

376 "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npm run lint:fix" }]

377 }

378 ]

379 }

380 }

381 ```

323 </Step>382 </Step>

324</Steps>

325 383 

326<Note>384 <Step title="Test your migrated plugin">

327 **For multiple plugins**: Organize plugins in subdirectories like `./plugins/plugin-name` and update your marketplace.json accordingly. See [Plugin sources](/en/docs/claude-code/plugin-marketplaces#plugin-sources) for organization patterns.385 Load your plugin to verify everything works:

328</Note>

329 

330### Debug plugin issues

331 386 

332If your plugin isn't working as expected:387 ```bash theme={null}

333 388 claude --plugin-dir ./my-plugin

3341. **Check the structure**: Ensure your directories are at the plugin root, not inside `.claude-plugin/`389 ```

3352. **Test components individually**: Check each command, agent, and hook separately

3363. **Use validation and debugging tools**: See [Debugging and development tools](/en/docs/claude-code/plugins-reference#debugging-and-development-tools) for CLI commands and troubleshooting techniques

337 390 

338### Share your plugins391 Test each component: run your commands, check agents appear in `/agents`, and verify hooks trigger correctly.

392 </Step>

393</Steps>

339 394 

340When your plugin is ready to share:395### What changes when migrating

341 396 

3421. **Add documentation**: Include a README.md with installation and usage instructions397| Standalone (`.claude/`) | Plugin |

3432. **Version your plugin**: Use semantic versioning in your `plugin.json`398| :---------------------------- | :------------------------------- |

3443. **Create or use a marketplace**: Distribute through plugin marketplaces for easy installation399| Only available in one project | Can be shared via marketplaces |

3454. **Test with others**: Have team members test the plugin before wider distribution400| Files in `.claude/commands/` | Files in `plugin-name/commands/` |

401| Hooks in `settings.json` | Hooks in `hooks/hooks.json` |

402| Must manually copy to share | Install with `/plugin install` |

346 403 

347<Note>404<Note>

348 For complete technical specifications, debugging techniques, and distribution strategies, see [Plugins reference](/en/docs/claude-code/plugins-reference).405 After migrating, you can remove the original files from `.claude/` to avoid duplicates. The plugin version will take precedence when loaded.

349</Note>406</Note>

350 407 

351***

352 

353## Next steps408## Next steps

354 409 

355Now that you understand Claude Code's plugin system, here are suggested paths for different goals:410Now that you understand Claude Code's plugin system, here are suggested paths for different goals:

356 411 

357### For plugin users412### For plugin users

358 413 

359* **Discover plugins**: Browse community marketplaces for useful tools414* [Discover and install plugins](/en/discover-plugins): browse marketplaces and install plugins

360* **Team adoption**: Set up repository-level plugins for your projects415* [Configure team marketplaces](/en/discover-plugins#configure-team-marketplaces): set up repository-level plugins for your team

361* **Marketplace management**: Learn to manage multiple plugin sources

362* **Advanced usage**: Explore plugin combinations and workflows

363 416 

364### For plugin developers417### For plugin developers

365 418 

366* **Create your first marketplace**: [Plugin marketplaces guide](/en/docs/claude-code/plugin-marketplaces)419* [Create and distribute a marketplace](/en/plugin-marketplaces): package and share your plugins

367* **Advanced components**: Dive deeper into specific plugin components:420* [Plugins reference](/en/plugins-reference): complete technical specifications

368 * [Slash commands](/en/docs/claude-code/slash-commands) - Command development details421* Dive deeper into specific plugin components:

369 * [Subagents](/en/docs/claude-code/sub-agents) - Agent configuration and capabilities422 * [Skills](/en/skills): skill development details

370 * [Agent Skills](/en/docs/claude-code/skills) - Extend Claude's capabilities423 * [Subagents](/en/sub-agents): agent configuration and capabilities

371 * [Hooks](/en/docs/claude-code/hooks) - Event handling and automation424 * [Hooks](/en/hooks): event handling and automation

372 * [MCP](/en/docs/claude-code/mcp) - External tool integration425 * [MCP](/en/mcp): external tool integration

373* **Distribution strategies**: Package and share your plugins effectively

374* **Community contribution**: Consider contributing to community plugin collections

375 

376### For team leads and administrators

377 

378* **Repository configuration**: Set up automatic plugin installation for team projects

379* **Plugin governance**: Establish guidelines for plugin approval and security review

380* **Marketplace maintenance**: Create and maintain organization-specific plugin catalogs

381* **Training and documentation**: Help team members adopt plugin workflows effectively

382 

383## See also

384 

385* [Plugin marketplaces](/en/docs/claude-code/plugin-marketplaces) - Creating and managing plugin catalogs

386* [Slash commands](/en/docs/claude-code/slash-commands) - Understanding custom commands

387* [Subagents](/en/docs/claude-code/sub-agents) - Creating and using specialized agents

388* [Agent Skills](/en/docs/claude-code/skills) - Extend Claude's capabilities

389* [Hooks](/en/docs/claude-code/hooks) - Automating workflows with event handlers

390* [MCP](/en/docs/claude-code/mcp) - Connecting to external tools and services

391* [Settings](/en/docs/claude-code/settings) - Configuration options for plugins

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Plugins reference5# Plugins reference

2 6 

3> Complete technical reference for Claude Code plugin system, including schemas, CLI commands, and component specifications.7> Complete technical reference for Claude Code plugin system, including schemas, CLI commands, and component specifications.

4 8 

5<Tip>9<Tip>

6 For hands-on tutorials and practical usage, see [Plugins](/en/docs/claude-code/plugins). For plugin management across teams and communities, see [Plugin marketplaces](/en/docs/claude-code/plugin-marketplaces).10 Looking to install plugins? See [Discover and install plugins](/en/discover-plugins). For creating plugins, see [Plugins](/en/plugins). For distributing plugins, see [Plugin marketplaces](/en/plugin-marketplaces).

7</Tip>11</Tip>

8 12 

9This reference provides complete technical specifications for the Claude Code plugin system, including component schemas, CLI commands, and development tools.13This reference provides complete technical specifications for the Claude Code plugin system, including component schemas, CLI commands, and development tools.

10 14 

15A **plugin** is a self-contained directory of components that extends Claude Code with custom functionality. Plugin components include skills, agents, hooks, MCP servers, and LSP servers.

16 

11## Plugin components reference17## Plugin components reference

12 18 

13This section documents the five types of components that plugins can provide.19### Skills

14 20 

15### Commands21Plugins add skills to Claude Code, creating `/name` shortcuts that you or Claude can invoke.

16 22 

17Plugins add custom slash commands that integrate seamlessly with Claude Code's command system.23**Location**: `skills/` or `commands/` directory in plugin root

18 24 

19**Location**: `commands/` directory in plugin root25**File format**: Skills are directories with `SKILL.md`; commands are simple markdown files

20 26 

21**File format**: Markdown files with frontmatter27**Skill structure**:

22 28 

23For complete details on plugin command structure, invocation patterns, and features, see [Plugin commands](/en/docs/claude-code/slash-commands#plugin-commands).29```

30skills/

31├── pdf-processor/

32│ ├── SKILL.md

33│ ├── reference.md (optional)

34│ └── scripts/ (optional)

35└── code-reviewer/

36 └── SKILL.md

37```

38 

39**Integration behavior**:

40 

41* Skills and commands are automatically discovered when the plugin is installed

42* Claude can invoke them automatically based on task context

43* Skills can include supporting files alongside SKILL.md

44 

45For complete details, see [Skills](/en/skills).

24 46 

25### Agents47### Agents

26 48 


34 56 

35```markdown theme={null}57```markdown theme={null}

36---58---

37description: What this agent specializes in59name: agent-name

38capabilities: ["task1", "task2", "task3"]60description: What this agent specializes in and when Claude should invoke it

39---61---

40 62 

41# Agent Name63Detailed system prompt for the agent describing its role, expertise, and behavior.

42 

43Detailed description of the agent's role, expertise, and when Claude should invoke it.

44 

45## Capabilities

46- Specific task the agent excels at

47- Another specialized capability

48- When to use this agent vs others

49 

50## Context and examples

51Provide examples of when this agent should be used and what kinds of problems it solves.

52```64```

53 65 

54**Integration points**:66**Integration points**:


58* Agents can be invoked manually by users70* Agents can be invoked manually by users

59* Plugin agents work alongside built-in Claude agents71* Plugin agents work alongside built-in Claude agents

60 72 

61### Skills73For complete details, see [Subagents](/en/sub-agents).

62 

63Plugins can provide Agent Skills that extend Claude's capabilities. Skills are model-invoked—Claude autonomously decides when to use them based on the task context.

64 

65**Location**: `skills/` directory in plugin root

66 

67**File format**: Directories containing `SKILL.md` files with frontmatter

68 

69**Skill structure**:

70 

71```

72skills/

73├── pdf-processor/

74│ ├── SKILL.md

75│ ├── reference.md (optional)

76│ └── scripts/ (optional)

77└── code-reviewer/

78 └── SKILL.md

79```

80 

81**Integration behavior**:

82 

83* Plugin Skills are automatically discovered when the plugin is installed

84* Claude autonomously invokes Skills based on matching task context

85* Skills can include supporting files alongside SKILL.md

86 

87For SKILL.md format and complete Skill authoring guidance, see:

88 

89* [Use Skills in Claude Code](/en/docs/claude-code/skills)

90* [Agent Skills overview](/en/docs/agents-and-tools/agent-skills/overview#skill-structure)

91 74 

92### Hooks75### Hooks

93 76 


120**Available events**:103**Available events**:

121 104 

122* `PreToolUse`: Before Claude uses any tool105* `PreToolUse`: Before Claude uses any tool

123* `PostToolUse`: After Claude uses any tool106* `PostToolUse`: After Claude successfully uses any tool

107* `PostToolUseFailure`: After Claude tool execution fails

108* `PermissionRequest`: When a permission dialog is shown

124* `UserPromptSubmit`: When user submits a prompt109* `UserPromptSubmit`: When user submits a prompt

125* `Notification`: When Claude Code sends notifications110* `Notification`: When Claude Code sends notifications

126* `Stop`: When Claude attempts to stop111* `Stop`: When Claude attempts to stop

112* `SubagentStart`: When a subagent is started

127* `SubagentStop`: When a subagent attempts to stop113* `SubagentStop`: When a subagent attempts to stop

128* `SessionStart`: At the beginning of sessions114* `SessionStart`: At the beginning of sessions

129* `SessionEnd`: At the end of sessions115* `SessionEnd`: At the end of sessions

116* `TeammateIdle`: When an agent team teammate is about to go idle

117* `TaskCompleted`: When a task is being marked as completed

130* `PreCompact`: Before conversation history is compacted118* `PreCompact`: Before conversation history is compacted

131 119 

132**Hook types**:120**Hook types**:

133 121 

134* `command`: Execute shell commands or scripts122* `command`: Execute shell commands or scripts

135* `validation`: Validate file contents or project state123* `prompt`: Evaluate a prompt with an LLM (uses `$ARGUMENTS` placeholder for context)

136* `notification`: Send alerts or status updates124* `agent`: Run an agentic verifier with tools for complex verification tasks

137 125 

138### MCP servers126### MCP servers

139 127 


171* Server capabilities integrate seamlessly with Claude's existing tools159* Server capabilities integrate seamlessly with Claude's existing tools

172* Plugin servers can be configured independently of user MCP servers160* Plugin servers can be configured independently of user MCP servers

173 161 

162### LSP servers

163 

164<Tip>

165 Looking to use LSP plugins? Install them from the official marketplace: search for "lsp" in the `/plugin` Discover tab. This section documents how to create LSP plugins for languages not covered by the official marketplace.

166</Tip>

167 

168Plugins can provide [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) servers to give Claude real-time code intelligence while working on your codebase.

169 

170LSP integration provides:

171 

172* **Instant diagnostics**: Claude sees errors and warnings immediately after each edit

173* **Code navigation**: go to definition, find references, and hover information

174* **Language awareness**: type information and documentation for code symbols

175 

176**Location**: `.lsp.json` in plugin root, or inline in `plugin.json`

177 

178**Format**: JSON configuration mapping language server names to their configurations

179 

180**`.lsp.json` file format**:

181 

182```json theme={null}

183{

184 "go": {

185 "command": "gopls",

186 "args": ["serve"],

187 "extensionToLanguage": {

188 ".go": "go"

189 }

190 }

191}

192```

193 

194**Inline in `plugin.json`**:

195 

196```json theme={null}

197{

198 "name": "my-plugin",

199 "lspServers": {

200 "go": {

201 "command": "gopls",

202 "args": ["serve"],

203 "extensionToLanguage": {

204 ".go": "go"

205 }

206 }

207 }

208}

209```

210 

211**Required fields:**

212 

213| Field | Description |

214| :-------------------- | :------------------------------------------- |

215| `command` | The LSP binary to execute (must be in PATH) |

216| `extensionToLanguage` | Maps file extensions to language identifiers |

217 

218**Optional fields:**

219 

220| Field | Description |

221| :---------------------- | :-------------------------------------------------------- |

222| `args` | Command-line arguments for the LSP server |

223| `transport` | Communication transport: `stdio` (default) or `socket` |

224| `env` | Environment variables to set when starting the server |

225| `initializationOptions` | Options passed to the server during initialization |

226| `settings` | Settings passed via `workspace/didChangeConfiguration` |

227| `workspaceFolder` | Workspace folder path for the server |

228| `startupTimeout` | Max time to wait for server startup (milliseconds) |

229| `shutdownTimeout` | Max time to wait for graceful shutdown (milliseconds) |

230| `restartOnCrash` | Whether to automatically restart the server if it crashes |

231| `maxRestarts` | Maximum number of restart attempts before giving up |

232 

233<Warning>

234 **You must install the language server binary separately.** LSP plugins configure how Claude Code connects to a language server, but they don't include the server itself. If you see `Executable not found in $PATH` in the `/plugin` Errors tab, install the required binary for your language.

235</Warning>

236 

237**Available LSP plugins:**

238 

239| Plugin | Language server | Install command |

240| :--------------- | :------------------------- | :----------------------------------------------------------------------------------------- |

241| `pyright-lsp` | Pyright (Python) | `pip install pyright` or `npm install -g pyright` |

242| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |

243| `rust-lsp` | rust-analyzer | [See rust-analyzer installation](https://rust-analyzer.github.io/manual.html#installation) |

244 

245Install the language server first, then install the plugin from the marketplace.

246 

247***

248 

249## Plugin installation scopes

250 

251When you install a plugin, you choose a **scope** that determines where the plugin is available and who else can use it:

252 

253| Scope | Settings file | Use case |

254| :-------- | :---------------------------------------------- | :------------------------------------------------------- |

255| `user` | `~/.claude/settings.json` | Personal plugins available across all projects (default) |

256| `project` | `.claude/settings.json` | Team plugins shared via version control |

257| `local` | `.claude/settings.local.json` | Project-specific plugins, gitignored |

258| `managed` | [Managed settings](/en/settings#settings-files) | Managed plugins (read-only, update only) |

259 

260Plugins use the same scope system as other Claude Code configurations. For installation instructions and scope flags, see [Install plugins](/en/discover-plugins#install-plugins). For a complete explanation of scopes, see [Configuration scopes](/en/settings#configuration-scopes).

261 

174***262***

175 263 

176## Plugin manifest schema264## Plugin manifest schema

177 265 

178The `plugin.json` file defines your plugin's metadata and configuration. This section documents all supported fields and options.266The `.claude-plugin/plugin.json` file defines your plugin's metadata and configuration. This section documents all supported fields and options.

267 

268The manifest is optional. If omitted, Claude Code auto-discovers components in [default locations](#file-locations-reference) and derives the plugin name from the directory name. Use a manifest when you need to provide metadata or custom component paths.

179 269 

180### Complete schema270### Complete schema

181 271 


195 "keywords": ["keyword1", "keyword2"],285 "keywords": ["keyword1", "keyword2"],

196 "commands": ["./custom/commands/special.md"],286 "commands": ["./custom/commands/special.md"],

197 "agents": "./custom/agents/",287 "agents": "./custom/agents/",

288 "skills": "./custom/skills/",

198 "hooks": "./config/hooks.json",289 "hooks": "./config/hooks.json",

199 "mcpServers": "./mcp-config.json"290 "mcpServers": "./mcp-config.json",

291 "outputStyles": "./styles/",

292 "lspServers": "./.lsp.json"

200}293}

201```294```

202 295 

203### Required fields296### Required fields

204 297 

298If you include a manifest, `name` is the only required field.

299 

205| Field | Type | Description | Example |300| Field | Type | Description | Example |

206| :----- | :----- | :---------------------------------------- | :------------------- |301| :----- | :----- | :---------------------------------------- | :------------------- |

207| `name` | string | Unique identifier (kebab-case, no spaces) | `"deployment-tools"` |302| `name` | string | Unique identifier (kebab-case, no spaces) | `"deployment-tools"` |

208 303 

304This name is used for namespacing components. For example, in the UI, the

305agent `agent-creator` for the plugin with name `plugin-dev` will appear as

306`plugin-dev:agent-creator`.

307 

209### Metadata fields308### Metadata fields

210 309 

211| Field | Type | Description | Example |310| Field | Type | Description | Example |

212| :------------ | :----- | :---------------------------------- | :------------------------------------------------- |311| :------------ | :----- | :-------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------- |

213| `version` | string | Semantic version | `"2.1.0"` |312| `version` | string | Semantic version. If also set in the marketplace entry, `plugin.json` takes priority. You only need to set it in one place. | `"2.1.0"` |

214| `description` | string | Brief explanation of plugin purpose | `"Deployment automation tools"` |313| `description` | string | Brief explanation of plugin purpose | `"Deployment automation tools"` |

215| `author` | object | Author information | `{"name": "Dev Team", "email": "dev@company.com"}` |314| `author` | object | Author information | `{"name": "Dev Team", "email": "dev@company.com"}` |

216| `homepage` | string | Documentation URL | `"https://docs.example.com"` |315| `homepage` | string | Documentation URL | `"https://docs.example.com"` |


221### Component path fields320### Component path fields

222 321 

223| Field | Type | Description | Example |322| Field | Type | Description | Example |

224| :----------- | :------------- | :----------------------------------- | :------------------------------------- |323| :------------- | :-------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------- |

225| `commands` | string\|array | Additional command files/directories | `"./custom/cmd.md"` or `["./cmd1.md"]` |324| `commands` | string\|array | Additional command files/directories | `"./custom/cmd.md"` or `["./cmd1.md"]` |

226| `agents` | string\|array | Additional agent files | `"./custom/agents/"` |325| `agents` | string\|array | Additional agent files | `"./custom/agents/reviewer.md"` |

227| `hooks` | string\|object | Hook config path or inline config | `"./hooks.json"` |326| `skills` | string\|array | Additional skill directories | `"./custom/skills/"` |

228| `mcpServers` | string\|object | MCP config path or inline config | `"./mcp.json"` |327| `hooks` | string\|array\|object | Hook config paths or inline config | `"./my-extra-hooks.json"` |

328| `mcpServers` | string\|array\|object | MCP config paths or inline config | `"./my-extra-mcp-config.json"` |

329| `outputStyles` | string\|array | Additional output style files/directories | `"./styles/"` |

330| `lspServers` | string\|array\|object | [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) configs for code intelligence (go to definition, find references, etc.) | `"./.lsp.json"` |

229 331 

230### Path behavior rules332### Path behavior rules

231 333 


274 376 

275***377***

276 378 

379## Plugin caching and file resolution

380 

381Plugins are specified in one of two ways:

382 

383* Through `claude --plugin-dir`, for the duration of a session.

384* Through a marketplace, installed for future sessions.

385 

386For security and verification purposes, Claude Code copies *marketplace* plugins to the user's local **plugin cache** (`~/.claude/plugins/cache`) rather than using them in-place. Understanding this behavior is important when developing plugins that reference external files.

387 

388### Path traversal limitations

389 

390Installed plugins cannot reference files outside their directory. Paths that traverse outside the plugin root (such as `../shared-utils`) will not work after installation because those external files are not copied to the cache.

391 

392### Working with external dependencies

393 

394If your plugin needs to access files outside its directory, you can create symbolic links to external files within your plugin directory. Symlinks are honored during the copy process:

395 

396```bash theme={null}

397# Inside your plugin directory

398ln -s /path/to/shared-utils ./shared-utils

399```

400 

401The symlinked content will be copied into the plugin cache. This provides flexibility while maintaining the security benefits of the caching system.

402 

403***

404 

277## Plugin directory structure405## Plugin directory structure

278 406 

279### Standard plugin layout407### Standard plugin layout


282 410 

283```411```

284enterprise-plugin/412enterprise-plugin/

285├── .claude-plugin/ # Metadata directory413├── .claude-plugin/ # Metadata directory (optional)

286│ └── plugin.json # Required: plugin manifest414│ └── plugin.json # plugin manifest

287├── commands/ # Default command location415├── commands/ # Default command location

288│ ├── status.md416│ ├── status.md

289│ └── logs.md417│ └── logs.md


300├── hooks/ # Hook configurations428├── hooks/ # Hook configurations

301│ ├── hooks.json # Main hook config429│ ├── hooks.json # Main hook config

302│ └── security-hooks.json # Additional hooks430│ └── security-hooks.json # Additional hooks

431├── settings.json # Default settings for the plugin

303├── .mcp.json # MCP server definitions432├── .mcp.json # MCP server definitions

433├── .lsp.json # LSP server configurations

304├── scripts/ # Hook and utility scripts434├── scripts/ # Hook and utility scripts

305│ ├── security-scan.sh435│ ├── security-scan.sh

306│ ├── format-code.py436│ ├── format-code.py


316### File locations reference446### File locations reference

317 447 

318| Component | Default Location | Purpose |448| Component | Default Location | Purpose |

319| :-------------- | :--------------------------- | :------------------------------- |449| :-------------- | :--------------------------- | :------------------------------------------------------------------------------------------------------------------------ |

320| **Manifest** | `.claude-plugin/plugin.json` | Required metadata file |450| **Manifest** | `.claude-plugin/plugin.json` | Plugin metadata and configuration (optional) |

321| **Commands** | `commands/` | Slash command markdown files |451| **Commands** | `commands/` | Skill Markdown files (legacy; use `skills/` for new skills) |

322| **Agents** | `agents/` | Subagent markdown files |452| **Agents** | `agents/` | Subagent Markdown files |

323| **Skills** | `skills/` | Agent Skills with SKILL.md files |453| **Skills** | `skills/` | Skills with `<name>/SKILL.md` structure |

324| **Hooks** | `hooks/hooks.json` | Hook configuration |454| **Hooks** | `hooks/hooks.json` | Hook configuration |

325| **MCP servers** | `.mcp.json` | MCP server definitions |455| **MCP servers** | `.mcp.json` | MCP server definitions |

456| **LSP servers** | `.lsp.json` | Language server configurations |

457| **Settings** | `settings.json` | Default configuration applied when the plugin is enabled. Only [`agent`](/en/sub-agents) settings are currently supported |

326 458 

327***459***

328 460 

329## Debugging and development tools461## CLI commands reference

330 462 

331### Debugging commands463Claude Code provides CLI commands for non-interactive plugin management, useful for scripting and automation.

464 

465### plugin install

466 

467Install a plugin from available marketplaces.

468 

469```bash theme={null}

470claude plugin install <plugin> [options]

471```

472 

473**Arguments:**

474 

475* `<plugin>`: Plugin name or `plugin-name@marketplace-name` for a specific marketplace

476 

477**Options:**

478 

479| Option | Description | Default |

480| :-------------------- | :------------------------------------------------ | :------ |

481| `-s, --scope <scope>` | Installation scope: `user`, `project`, or `local` | `user` |

482| `-h, --help` | Display help for command | |

483 

484Scope determines which settings file the installed plugin is added to. For example, --scope project writes to `enabledPlugins` in .claude/settings.json, making the plugin available to everyone who clones the project repository.

485 

486**Examples:**

487 

488```bash theme={null}

489# Install to user scope (default)

490claude plugin install formatter@my-marketplace

491 

492# Install to project scope (shared with team)

493claude plugin install formatter@my-marketplace --scope project

494 

495# Install to local scope (gitignored)

496claude plugin install formatter@my-marketplace --scope local

497```

498 

499### plugin uninstall

500 

501Remove an installed plugin.

502 

503```bash theme={null}

504claude plugin uninstall <plugin> [options]

505```

506 

507**Arguments:**

508 

509* `<plugin>`: Plugin name or `plugin-name@marketplace-name`

510 

511**Options:**

512 

513| Option | Description | Default |

514| :-------------------- | :-------------------------------------------------- | :------ |

515| `-s, --scope <scope>` | Uninstall from scope: `user`, `project`, or `local` | `user` |

516| `-h, --help` | Display help for command | |

517 

518**Aliases:** `remove`, `rm`

519 

520### plugin enable

521 

522Enable a disabled plugin.

523 

524```bash theme={null}

525claude plugin enable <plugin> [options]

526```

527 

528**Arguments:**

529 

530* `<plugin>`: Plugin name or `plugin-name@marketplace-name`

531 

532**Options:**

533 

534| Option | Description | Default |

535| :-------------------- | :--------------------------------------------- | :------ |

536| `-s, --scope <scope>` | Scope to enable: `user`, `project`, or `local` | `user` |

537| `-h, --help` | Display help for command | |

538 

539### plugin disable

540 

541Disable a plugin without uninstalling it.

542 

543```bash theme={null}

544claude plugin disable <plugin> [options]

545```

546 

547**Arguments:**

548 

549* `<plugin>`: Plugin name or `plugin-name@marketplace-name`

550 

551**Options:**

552 

553| Option | Description | Default |

554| :-------------------- | :---------------------------------------------- | :------ |

555| `-s, --scope <scope>` | Scope to disable: `user`, `project`, or `local` | `user` |

556| `-h, --help` | Display help for command | |

557 

558### plugin update

332 559 

333Use `claude --debug` to see plugin loading details:560Update a plugin to the latest version.

334 561 

335```bash theme={null}562```bash theme={null}

336claude --debug563claude plugin update <plugin> [options]

337```564```

338 565 

566**Arguments:**

567 

568* `<plugin>`: Plugin name or `plugin-name@marketplace-name`

569 

570**Options:**

571 

572| Option | Description | Default |

573| :-------------------- | :-------------------------------------------------------- | :------ |

574| `-s, --scope <scope>` | Scope to update: `user`, `project`, `local`, or `managed` | `user` |

575| `-h, --help` | Display help for command | |

576 

577***

578 

579## Debugging and development tools

580 

581### Debugging commands

582 

583Use `claude --debug` (or `/debug` within the TUI) to see plugin loading details:

584 

339This shows:585This shows:

340 586 

341* Which plugins are being loaded587* Which plugins are being loaded


346### Common issues592### Common issues

347 593 

348| Issue | Cause | Solution |594| Issue | Cause | Solution |

349| :--------------------- | :------------------------------ | :--------------------------------------------------- |595| :---------------------------------- | :------------------------------ | :-------------------------------------------------------------------------------- |

350| Plugin not loading | Invalid `plugin.json` | Validate JSON syntax |596| Plugin not loading | Invalid `plugin.json` | Validate JSON syntax with `claude plugin validate` or `/plugin validate` |

351| Commands not appearing | Wrong directory structure | Ensure `commands/` at root, not in `.claude-plugin/` |597| Commands not appearing | Wrong directory structure | Ensure `commands/` at root, not in `.claude-plugin/` |

352| Hooks not firing | Script not executable | Run `chmod +x script.sh` |598| Hooks not firing | Script not executable | Run `chmod +x script.sh` |

353| MCP server fails | Missing `${CLAUDE_PLUGIN_ROOT}` | Use variable for all plugin paths |599| MCP server fails | Missing `${CLAUDE_PLUGIN_ROOT}` | Use variable for all plugin paths |

354| Path errors | Absolute paths used | All paths must be relative and start with `./` |600| Path errors | Absolute paths used | All paths must be relative and start with `./` |

601| LSP `Executable not found in $PATH` | Language server not installed | Install the binary (e.g., `npm install -g typescript-language-server typescript`) |

602 

603### Example error messages

604 

605**Manifest validation errors**:

606 

607* `Invalid JSON syntax: Unexpected token } in JSON at position 142`: check for missing commas, extra commas, or unquoted strings

608* `Plugin has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Required`: a required field is missing

609* `Plugin has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...`: JSON syntax error

610 

611**Plugin loading errors**:

612 

613* `Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.`: command path exists but contains no valid command files

614* `Plugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.`: the `source` path in marketplace.json points to a non-existent directory

615* `Plugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.`: remove duplicate component definitions or remove `strict: false` in marketplace entry

616 

617### Hook troubleshooting

618 

619**Hook script not executing**:

620 

6211. Check the script is executable: `chmod +x ./scripts/your-script.sh`

6222. Verify the shebang line: First line should be `#!/bin/bash` or `#!/usr/bin/env bash`

6233. Check the path uses `${CLAUDE_PLUGIN_ROOT}`: `"command": "${CLAUDE_PLUGIN_ROOT}/scripts/your-script.sh"`

6244. Test the script manually: `./scripts/your-script.sh`

625 

626**Hook not triggering on expected events**:

627 

6281. Verify the event name is correct (case-sensitive): `PostToolUse`, not `postToolUse`

6292. Check the matcher pattern matches your tools: `"matcher": "Write|Edit"` for file operations

6303. Confirm the hook type is valid: `command`, `prompt`, or `agent`

631 

632### MCP server troubleshooting

633 

634**Server not starting**:

635 

6361. Check the command exists and is executable

6372. Verify all paths use `${CLAUDE_PLUGIN_ROOT}` variable

6383. Check the MCP server logs: `claude --debug` shows initialization errors

6394. Test the server manually outside of Claude Code

640 

641**Server tools not appearing**:

642 

6431. Ensure the server is properly configured in `.mcp.json` or `plugin.json`

6442. Verify the server implements the MCP protocol correctly

6453. Check for connection timeouts in debug output

646 

647### Directory structure mistakes

648 

649**Symptoms**: Plugin loads but components (commands, agents, hooks) are missing.

650 

651**Correct structure**: Components must be at the plugin root, not inside `.claude-plugin/`. Only `plugin.json` belongs in `.claude-plugin/`.

652 

653```

654my-plugin/

655├── .claude-plugin/

656│ └── plugin.json ← Only manifest here

657├── commands/ ← At root level

658├── agents/ ← At root level

659└── hooks/ ← At root level

660```

661 

662If your components are inside `.claude-plugin/`, move them to the plugin root.

663 

664**Debug checklist**:

665 

6661. Run `claude --debug` and look for "loading plugin" messages

6672. Check that each component directory is listed in the debug output

6683. Verify file permissions allow reading the plugin files

355 669 

356***670***

357 671 


362Follow semantic versioning for plugin releases:676Follow semantic versioning for plugin releases:

363 677 

364```json theme={null}678```json theme={null}

679{

680 "name": "my-plugin",

681 "version": "2.1.0"

682}

683```

684 

685**Version format**: `MAJOR.MINOR.PATCH`

686 

687* **MAJOR**: Breaking changes (incompatible API changes)

688* **MINOR**: New features (backward-compatible additions)

689* **PATCH**: Bug fixes (backward-compatible fixes)

690 

691**Best practices**:

692 

693* Start at `1.0.0` for your first stable release

694* Update the version in `plugin.json` before distributing changes

695* Document changes in a `CHANGELOG.md` file

696* Use pre-release versions like `2.0.0-beta.1` for testing

697 

698<Warning>

699 Claude Code uses the version to determine whether to update your plugin. If you change your plugin's code but don't bump the version in `plugin.json`, your plugin's existing users won't see your changes due to caching.

700 

701 If your plugin is within a [marketplace](/en/plugin-marketplaces) directory, you can manage the version through `marketplace.json` instead and omit the `version` field from `plugin.json`.

702</Warning>

703 

704***

365 705 

366## See also706## See also

367 707 

368- [Plugins](/en/docs/claude-code/plugins) - Tutorials and practical usage708* [Plugins](/en/plugins) - Tutorials and practical usage

369- [Plugin marketplaces](/en/docs/claude-code/plugin-marketplaces) - Creating and managing marketplaces709* [Plugin marketplaces](/en/plugin-marketplaces) - Creating and managing marketplaces

370- [Slash commands](/en/docs/claude-code/slash-commands) - Command development details710* [Skills](/en/skills) - Skill development details

371- [Subagents](/en/docs/claude-code/sub-agents) - Agent configuration and capabilities711* [Subagents](/en/sub-agents) - Agent configuration and capabilities

372- [Agent Skills](/en/docs/claude-code/skills) - Extend Claude's capabilities712* [Hooks](/en/hooks) - Event handling and automation

373- [Hooks](/en/docs/claude-code/hooks) - Event handling and automation713* [MCP](/en/mcp) - External tool integration

374- [MCP](/en/docs/claude-code/mcp) - External tool integration714* [Settings](/en/settings) - Configuration options for plugins

375- [Settings](/en/docs/claude-code/settings) - Configuration options for plugins

376```

quickstart.md +80 −70

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Quickstart5# Quickstart

2 6 

3> Welcome to Claude Code!7> Welcome to Claude Code!


9Make sure you have:13Make sure you have:

10 14 

11* A terminal or command prompt open15* A terminal or command prompt open

16 * If you've never used the terminal before, check out the [terminal guide](/en/terminal-guide)

12* A code project to work with17* A code project to work with

13* A [Claude.ai](https://claude.ai) (recommended) or [Claude Console](https://console.anthropic.com/) account18* A [Claude subscription](https://claude.com/pricing) (Pro, Max, Teams, or Enterprise), [Claude Console](https://console.anthropic.com/) account, or access through a [supported cloud provider](/en/third-party-integrations)

19 

20<Note>

21 This guide covers the terminal CLI. Claude Code is also available on the [web](https://claude.ai/code), as a [desktop app](/en/desktop), in [VS Code](/en/vs-code) and [JetBrains IDEs](/en/jetbrains), in [Slack](/en/slack), and in CI/CD with [GitHub Actions](/en/github-actions) and [GitLab](/en/gitlab-ci-cd). See [all interfaces](/en/overview#use-claude-code-everywhere).

22</Note>

14 23 

15## Step 1: Install Claude Code24## Step 1: Install Claude Code

16 25 


18 27 

19<Tabs>28<Tabs>

20 <Tab title="Native Install (Recommended)">29 <Tab title="Native Install (Recommended)">

21 **Homebrew (macOS, Linux):**

22 

23 ```sh theme={null}

24 brew install --cask claude-code

25 ```

26 

27 **macOS, Linux, WSL:**30 **macOS, Linux, WSL:**

28 31 

29 ```bash theme={null}32 ```bash theme={null}


41 ```batch theme={null}44 ```batch theme={null}

42 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd45 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

43 ```46 ```

47 

48 **Windows requires [Git for Windows](https://git-scm.com/downloads/win).** Install it first if you don't have it.

49 

50 <Info>

51 Native installations automatically update in the background to keep you on the latest version.

52 </Info>

44 </Tab>53 </Tab>

45 54 

46 <Tab title="NPM">55 <Tab title="Homebrew">

47 If you have [Node.js 18 or newer installed](https://nodejs.org/en/download/):56 ```bash theme={null}

57 brew install --cask claude-code

58 ```

59 

60 <Info>

61 Homebrew installations do not auto-update. Run `brew upgrade claude-code` periodically to get the latest features and security fixes.

62 </Info>

63 </Tab>

48 64 

49 ```sh theme={null}65 <Tab title="WinGet">

50 npm install -g @anthropic-ai/claude-code66 ```powershell theme={null}

67 winget install Anthropic.ClaudeCode

51 ```68 ```

69 

70 <Info>

71 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

72 </Info>

52 </Tab>73 </Tab>

53</Tabs>74</Tabs>

54 75 


66# Follow the prompts to log in with your account87# Follow the prompts to log in with your account

67```88```

68 89 

69You can log in using either account type:90You can log in using any of these account types:

70 

71* [Claude.ai](https://claude.ai) (subscription plans - recommended)

72* [Claude Console](https://console.anthropic.com/) (API access with pre-paid credits)

73 91 

74Once logged in, your credentials are stored and you won't need to log in again.92* [Claude Pro, Max, Teams, or Enterprise](https://claude.com/pricing) (recommended)

75 93* [Claude Console](https://console.anthropic.com/) (API access with pre-paid credits). On first login, a "Claude Code" workspace is automatically created in the Console for centralized cost tracking.

76<Note>94* [Amazon Bedrock, Google Vertex AI, or Microsoft Foundry](/en/third-party-integrations) (enterprise cloud providers)

77 When you first authenticate Claude Code with your Claude Console account, a workspace called "Claude Code" is automatically created for you. This workspace provides centralized cost tracking and management for all Claude Code usage in your organization.

78</Note>

79 95 

80<Note>96Once logged in, your credentials are stored and you won't need to log in again. To switch accounts later, use the `/login` command.

81 You can have both account types under the same email address. If you need to log in again or switch accounts, use the `/login` command within Claude Code.

82</Note>

83 97 

84## Step 3: Start your first session98## Step 3: Start your first session

85 99 


93You'll see the Claude Code welcome screen with your session information, recent conversations, and latest updates. Type `/help` for available commands or `/resume` to continue a previous conversation.107You'll see the Claude Code welcome screen with your session information, recent conversations, and latest updates. Type `/help` for available commands or `/resume` to continue a previous conversation.

94 108 

95<Tip>109<Tip>

96 After logging in (Step 2), your credentials are stored on your system. Learn more in [Credential Management](/en/docs/claude-code/iam#credential-management).110 After logging in (Step 2), your credentials are stored on your system. Learn more in [Credential Management](/en/authentication#credential-management).

97</Tip>111</Tip>

98 112 

99## Step 4: Ask your first question113## Step 4: Ask your first question


101Let's start with understanding your codebase. Try one of these commands:115Let's start with understanding your codebase. Try one of these commands:

102 116 

103```117```

104> what does this project do?118what does this project do?

105```119```

106 120 

107Claude will analyze your files and provide a summary. You can also ask more specific questions:121Claude will analyze your files and provide a summary. You can also ask more specific questions:

108 122 

109```123```

110> what technologies does this project use?124what technologies does this project use?

111```125```

112 126 

113```127```

114> where is the main entry point?128where is the main entry point?

115```129```

116 130 

117```131```

118> explain the folder structure132explain the folder structure

119```133```

120 134 

121You can also ask Claude about its own capabilities:135You can also ask Claude about its own capabilities:

122 136 

123```137```

124> what can Claude Code do?138what can Claude Code do?

125```139```

126 140 

127```141```

128> how do I use slash commands in Claude Code?142how do I create custom skills in Claude Code?

129```143```

130 144 

131```145```

132> can Claude Code work with Docker?146can Claude Code work with Docker?

133```147```

134 148 

135<Note>149<Note>


141Now let's make Claude Code do some actual coding. Try a simple task:155Now let's make Claude Code do some actual coding. Try a simple task:

142 156 

143```157```

144> add a hello world function to the main file158add a hello world function to the main file

145```159```

146 160 

147Claude Code will:161Claude Code will:


160Claude Code makes Git operations conversational:174Claude Code makes Git operations conversational:

161 175 

162```176```

163> what files have I changed?177what files have I changed?

164```178```

165 179 

166```180```

167> commit my changes with a descriptive message181commit my changes with a descriptive message

168```182```

169 183 

170You can also prompt for more complex Git operations:184You can also prompt for more complex Git operations:

171 185 

172```186```

173> create a new branch called feature/quickstart187create a new branch called feature/quickstart

174```188```

175 189 

176```190```

177> show me the last 5 commits191show me the last 5 commits

178```192```

179 193 

180```194```

181> help me resolve merge conflicts195help me resolve merge conflicts

182```196```

183 197 

184## Step 7: Fix a bug or add a feature198## Step 7: Fix a bug or add a feature


188Describe what you want in natural language:202Describe what you want in natural language:

189 203 

190```204```

191> add input validation to the user registration form205add input validation to the user registration form

192```206```

193 207 

194Or fix existing issues:208Or fix existing issues:

195 209 

196```210```

197> there's a bug where users can submit empty forms - fix it211there's a bug where users can submit empty forms - fix it

198```212```

199 213 

200Claude Code will:214Claude Code will:


211**Refactor code**225**Refactor code**

212 226 

213```227```

214> refactor the authentication module to use async/await instead of callbacks228refactor the authentication module to use async/await instead of callbacks

215```229```

216 230 

217**Write tests**231**Write tests**

218 232 

219```233```

220> write unit tests for the calculator functions234write unit tests for the calculator functions

221```235```

222 236 

223**Update documentation**237**Update documentation**

224 238 

225```239```

226> update the README with installation instructions240update the README with installation instructions

227```241```

228 242 

229**Code review**243**Code review**

230 244 

231```245```

232> review my changes and suggest improvements246review my changes and suggest improvements

233```247```

234 248 

235<Tip>249<Tip>


241Here are the most important commands for daily use:255Here are the most important commands for daily use:

242 256 

243| Command | What it does | Example |257| Command | What it does | Example |

244| ------------------- | --------------------------------- | ----------------------------------- |258| ------------------- | ------------------------------------------------------ | ----------------------------------- |

245| `claude` | Start interactive mode | `claude` |259| `claude` | Start interactive mode | `claude` |

246| `claude "task"` | Run a one-time task | `claude "fix the build error"` |260| `claude "task"` | Run a one-time task | `claude "fix the build error"` |

247| `claude -p "query"` | Run one-off query, then exit | `claude -p "explain this function"` |261| `claude -p "query"` | Run one-off query, then exit | `claude -p "explain this function"` |

248| `claude -c` | Continue most recent conversation | `claude -c` |262| `claude -c` | Continue most recent conversation in current directory | `claude -c` |

249| `claude -r` | Resume a previous conversation | `claude -r` |263| `claude -r` | Resume a previous conversation | `claude -r` |

250| `claude commit` | Create a Git commit | `claude commit` |264| `claude commit` | Create a Git commit | `claude commit` |

251| `/clear` | Clear conversation history | `> /clear` |265| `/clear` | Clear conversation history | `/clear` |

252| `/help` | Show available commands | `> /help` |266| `/help` | Show available commands | `/help` |

253| `exit` or Ctrl+C | Exit Claude Code | `> exit` |267| `exit` or Ctrl+C | Exit Claude Code | `exit` |

254 268 

255See the [CLI reference](/en/docs/claude-code/cli-reference) for a complete list of commands.269See the [CLI reference](/en/cli-reference) for a complete list of commands.

256 270 

257## Pro tips for beginners271## Pro tips for beginners

258 272 

273For more, see [best practices](/en/best-practices) and [common workflows](/en/common-workflows).

274 

259<AccordionGroup>275<AccordionGroup>

260 <Accordion title="Be specific with your requests">276 <Accordion title="Be specific with your requests">

261 Instead of: "fix the bug"277 Instead of: "fix the bug"


267 Break complex tasks into steps:283 Break complex tasks into steps:

268 284 

269 ```285 ```

270 > 1. create a new database table for user profiles286 1. create a new database table for user profiles

271 ```287 2. create an API endpoint to get and update user profiles

272 288 3. build a webpage that allows users to see and edit their information

273 ```

274 > 2. create an API endpoint to get and update user profiles

275 ```

276 

277 ```

278 > 3. build a webpage that allows users to see and edit their information

279 ```289 ```

280 </Accordion>290 </Accordion>

281 291 


283 Before making changes, let Claude understand your code:293 Before making changes, let Claude understand your code:

284 294 

285 ```295 ```

286 > analyze the database schema296 analyze the database schema

287 ```297 ```

288 298 

289 ```299 ```

290 > build a dashboard showing products that are most frequently returned by our UK customers300 build a dashboard showing products that are most frequently returned by our UK customers

291 ```301 ```

292 </Accordion>302 </Accordion>

293 303 


295 * Press `?` to see all available keyboard shortcuts305 * Press `?` to see all available keyboard shortcuts

296 * Use Tab for command completion306 * Use Tab for command completion

297 * Press ↑ for command history307 * Press ↑ for command history

298 * Type `/` to see all slash commands308 * Type `/` to see all commands and skills

299 </Accordion>309 </Accordion>

300</AccordionGroup>310</AccordionGroup>

301 311 


303 313 

304Now that you've learned the basics, explore more advanced features:314Now that you've learned the basics, explore more advanced features:

305 315 

306<CardGroup cols={3}>316<CardGroup cols={2}>

307 <Card title="Common workflows" icon="graduation-cap" href="/en/docs/claude-code/common-workflows">317 <Card title="How Claude Code works" icon="microchip" href="/en/how-claude-code-works">

308 Step-by-step guides for common tasks318 Understand the agentic loop, built-in tools, and how Claude Code interacts with your project

309 </Card>319 </Card>

310 320 

311 <Card title="CLI reference" icon="terminal" href="/en/docs/claude-code/cli-reference">321 <Card title="Best practices" icon="star" href="/en/best-practices">

312 Master all commands and options322 Get better results with effective prompting and project setup

313 </Card>323 </Card>

314 324 

315 <Card title="Configuration" icon="gear" href="/en/docs/claude-code/settings">325 <Card title="Common workflows" icon="graduation-cap" href="/en/common-workflows">

316 Customize Claude Code for your workflow326 Step-by-step guides for common tasks

317 </Card>327 </Card>

318 328 

319 <Card title="Claude Code on the web" icon="cloud" href="/en/docs/claude-code/claude-code-on-the-web">329 <Card title="Extend Claude Code" icon="puzzle-piece" href="/en/features-overview">

320 Run tasks asynchronously in the cloud330 Customize with CLAUDE.md, skills, hooks, MCP, and more

321 </Card>331 </Card>

322</CardGroup>332</CardGroup>

323 333 

remote-control.md +110 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Continue local sessions from any device with Remote Control

6 

7> Continue a local Claude Code session from your phone, tablet, or any browser using Remote Control. Works with claude.ai/code and the Claude mobile app.

8 

9<Note>

10 Remote Control is available as a research preview on Pro and Max plans. It is not available on Team or Enterprise plans.

11</Note>

12 

13Remote Control connects [claude.ai/code](https://claude.ai/code) or the Claude app for [iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) and [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude) to a Claude Code session running on your machine. Start a task at your desk, then pick it up from your phone on the couch or a browser on another computer.

14 

15When you start a Remote Control session on your machine, Claude keeps running locally the entire time, so nothing moves to the cloud. With Remote Control you can:

16 

17* **Use your full local environment remotely**: your filesystem, [MCP servers](/en/mcp), tools, and project configuration all stay available

18* **Work from both surfaces at once**: the conversation stays in sync across all connected devices, so you can send messages from your terminal, browser, and phone interchangeably

19* **Survive interruptions**: if your laptop sleeps or your network drops, the session reconnects automatically when your machine comes back online

20 

21Unlike [Claude Code on the web](/en/claude-code-on-the-web), which runs on cloud infrastructure, Remote Control sessions run directly on your machine and interact with your local filesystem. The web and mobile interfaces are just a window into that local session.

22 

23This page covers setup, how to start and connect to sessions, and how Remote Control compares to Claude Code on the web.

24 

25## Requirements

26 

27Before using Remote Control, confirm that your environment meets these conditions:

28 

29* **Subscription**: requires a Pro or Max plan. API keys are not supported.

30* **Authentication**: run `claude` and use `/login` to sign in through claude.ai if you haven't already.

31* **Workspace trust**: run `claude` in your project directory at least once to accept the workspace trust dialog.

32 

33## Start a Remote Control session

34 

35You can start a new session directly in Remote Control, or connect a session that's already running.

36 

37<Tabs>

38 <Tab title="New session">

39 Navigate to your project directory and run:

40 

41 ```bash theme={null}

42 claude remote-control

43 ```

44 

45 The process stays running in your terminal, waiting for remote connections. It displays a session URL you can use to [connect from another device](#connect-from-another-device), and you can press spacebar to show a QR code for quick access from your phone. While a remote session is active, the terminal shows connection status and tool activity.

46 

47 This command supports the following flags:

48 

49 * **`--verbose`**: show detailed connection and session logs

50 * **`--sandbox`** / **`--no-sandbox`**: enable or disable [sandboxing](/en/sandboxing) for filesystem and network isolation during the session. Sandboxing is off by default.

51 </Tab>

52 

53 <Tab title="From an existing session">

54 If you're already in a Claude Code session and want to continue it remotely, use the `/remote-control` (or `/rc`) command:

55 

56 ```

57 /remote-control

58 ```

59 

60 This starts a Remote Control session that carries over your current conversation history and displays a session URL and QR code you can use to [connect from another device](#connect-from-another-device). The `--verbose`, `--sandbox`, and `--no-sandbox` flags are not available with this command.

61 

62 <Tip>

63 Use `/rename` before running `/remote-control` to give the session a descriptive name. This makes it easier to find in the session list across devices.

64 </Tip>

65 </Tab>

66</Tabs>

67 

68### Connect from another device

69 

70Once a Remote Control session is active, you have a few ways to connect from another device:

71 

72* **Open the session URL** in any browser to go directly to the session on [claude.ai/code](https://claude.ai/code). Both `claude remote-control` and `/remote-control` display this URL in the terminal.

73* **Scan the QR code** shown alongside the session URL to open it directly in the Claude app. With `claude remote-control`, press spacebar to toggle the QR code display.

74* **Open [claude.ai/code](https://claude.ai/code) or the Claude app** and find the session by name in the session list. Remote Control sessions show a computer icon with a green status dot when online.

75 

76The remote session takes its name from your last message, your `/rename` value, or "Remote Control session" if there's no conversation history. If the environment already has an active session, you'll be asked whether to continue it or start a new one.

77 

78If you don't have the Claude app yet, use the `/mobile` command inside Claude Code to display a download QR code for [iOS](https://apps.apple.com/us/app/claude-by-anthropic/id6473753684) or [Android](https://play.google.com/store/apps/details?id=com.anthropic.claude).

79 

80### Enable Remote Control for all sessions

81 

82By default, Remote Control only activates when you explicitly run `claude remote-control` or `/remote-control`. To enable it automatically for every session, run `/config` inside Claude Code and set **Enable Remote Control for all sessions** to `true`. Set it back to `false` to disable.

83 

84Each Claude Code instance supports one remote session at a time. If you run multiple instances, each one gets its own environment and session.

85 

86## Connection and security

87 

88Your local Claude Code session makes outbound HTTPS requests only and never opens inbound ports on your machine. When you start Remote Control, it registers with the Anthropic API and polls for work. When you connect from another device, the server routes messages between the web or mobile client and your local session over a streaming connection.

89 

90All traffic travels through the Anthropic API over TLS, the same transport security as any Claude Code session. The connection uses multiple short-lived credentials, each scoped to a single purpose and expiring independently.

91 

92## Remote Control vs Claude Code on the web

93 

94Remote Control and [Claude Code on the web](/en/claude-code-on-the-web) both use the claude.ai/code interface. The key difference is where the session runs: Remote Control executes on your machine, so your local MCP servers, tools, and project configuration stay available. Claude Code on the web executes in Anthropic-managed cloud infrastructure.

95 

96Use Remote Control when you're in the middle of local work and want to keep going from another device. Use Claude Code on the web when you want to kick off a task without any local setup, work on a repo you don't have cloned, or run multiple tasks in parallel.

97 

98## Limitations

99 

100* **One remote session at a time**: each Claude Code session supports one remote connection.

101* **Terminal must stay open**: Remote Control runs as a local process. If you close the terminal or stop the `claude` process, the session ends. Run `claude remote-control` again to start a new one.

102* **Extended network outage**: if your machine is awake but unable to reach the network for more than roughly 10 minutes, the session times out and the process exits. Run `claude remote-control` again to start a new session.

103 

104## Related resources

105 

106* [Claude Code on the web](/en/claude-code-on-the-web): run sessions in Anthropic-managed cloud environments instead of on your machine

107* [Authentication](/en/authentication): set up `/login` and manage credentials for claude.ai

108* [CLI reference](/en/cli-reference): full list of flags and commands including `claude remote-control`

109* [Security](/en/security): how Remote Control sessions fit into the Claude Code security model

110* [Data usage](/en/data-usage): what data flows through the Anthropic API during local and remote sessions

sandboxing.md +71 −15

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Sandboxing5# Sandboxing

2 6 

3> Learn how Claude Code's sandboxed bash tool provides filesystem and network isolation for safer, more autonomous agent execution.7> Learn how Claude Code's sandboxed bash tool provides filesystem and network isolation for safer, more autonomous agent execution.


51 55 

52The sandboxed bash tool leverages operating system security primitives:56The sandboxed bash tool leverages operating system security primitives:

53 57 

54* **Linux**: Uses [bubblewrap](https://github.com/containers/bubblewrap) for isolation

55* **macOS**: Uses Seatbelt for sandbox enforcement58* **macOS**: Uses Seatbelt for sandbox enforcement

59* **Linux**: Uses [bubblewrap](https://github.com/containers/bubblewrap) for isolation

60* **WSL2**: Uses bubblewrap, same as Linux

61 

62WSL1 is not supported because bubblewrap requires kernel features only available in WSL2.

56 63 

57These OS-level restrictions ensure that all child processes spawned by Claude Code's commands inherit the same security boundaries.64These OS-level restrictions ensure that all child processes spawned by Claude Code's commands inherit the same security boundaries.

58 65 

59## Getting started66## Getting started

60 67 

68### Prerequisites

69 

70On **macOS**, sandboxing works out of the box using the built-in Seatbelt framework.

71 

72On **Linux and WSL2**, install the required packages first:

73 

74<Tabs>

75 <Tab title="Ubuntu/Debian">

76 ```bash theme={null}

77 sudo apt-get install bubblewrap socat

78 ```

79 </Tab>

80 

81 <Tab title="Fedora">

82 ```bash theme={null}

83 sudo dnf install bubblewrap socat

84 ```

85 </Tab>

86</Tabs>

87 

61### Enable sandboxing88### Enable sandboxing

62 89 

63You can enable sandboxing by running the `/sandbox` slash command:90You can enable sandboxing by running the `/sandbox` command:

64 91 

65```92```

66> /sandbox93> /sandbox

67```94```

68 95 

69This activates the sandboxed bash tool with default settings, allowing access to your current working directory while blocking access to sensitive system locations.96This opens a menu where you can choose between sandbox modes. If required dependencies are missing (such as `bubblewrap` or `socat` on Linux), the menu displays installation instructions for your platform.

97 

98### Sandbox modes

99 

100Claude Code offers two sandbox modes:

101 

102**Auto-allow mode**: Bash commands will attempt to run inside the sandbox and are automatically allowed without requiring permission. Commands that cannot be sandboxed (such as those needing network access to non-allowed hosts) fall back to the regular permission flow. Explicit ask/deny rules you've configured are always respected.

103 

104**Regular permissions mode**: All bash commands go through the standard permission flow, even when sandboxed. This provides more control but requires more approvals.

105 

106In both modes, the sandbox enforces the same filesystem and network restrictions. The difference is only in whether sandboxed commands are auto-approved or require explicit permission.

107 

108<Info>

109 Auto-allow mode works independently of your permission mode setting. Even if you're not in "accept edits" mode, sandboxed bash commands will run automatically when auto-allow is enabled. This means bash commands that modify files within the sandbox boundaries will execute without prompting, even when file edit tools would normally require approval.

110</Info>

70 111 

71### Configure sandboxing112### Configure sandboxing

72 113 

73Customize sandbox behavior through your `settings.json` file. See [Settings](/en/docs/claude-code/settings#sandbox-settings) for complete configuration reference.114Customize sandbox behavior through your `settings.json` file. See [Settings](/en/settings#sandbox-settings) for complete configuration reference.

74 115 

75<Tip>116<Tip>

76 Not all commands are compatible with sandboxing out of the box. Some notes that may help you make the most out of the sandbox:117 Not all commands are compatible with sandboxing out of the box. Some notes that may help you make the most out of the sandbox:


83<Note>124<Note>

84 Claude Code includes an intentional escape hatch mechanism that allows commands to run outside the sandbox when necessary. When a command fails due to sandbox restrictions (such as network connectivity issues or incompatible tools), Claude is prompted to analyze the failure and may retry the command with the `dangerouslyDisableSandbox` parameter. Commands that use this parameter go through the normal Claude Code permissions flow requiring user permission to execute. This allows Claude Code to handle edge cases where certain tools or network operations cannot function within sandbox constraints.125 Claude Code includes an intentional escape hatch mechanism that allows commands to run outside the sandbox when necessary. When a command fails due to sandbox restrictions (such as network connectivity issues or incompatible tools), Claude is prompted to analyze the failure and may retry the command with the `dangerouslyDisableSandbox` parameter. Commands that use this parameter go through the normal Claude Code permissions flow requiring user permission to execute. This allows Claude Code to handle edge cases where certain tools or network operations cannot function within sandbox constraints.

85 126 

86 You can disable this escape hatch by setting `"allowUnsandboxedCommands": false` in your [sandbox settings](/en/docs/claude-code/settings#sandbox-settings). When disabled, the `dangerouslyDisableSandbox` parameter is completely ignored and all commands must run sandboxed or be explicitly listed in `excludedCommands`.127 You can disable this escape hatch by setting `"allowUnsandboxedCommands": false` in your [sandbox settings](/en/settings#sandbox-settings). When disabled, the `dangerouslyDisableSandbox` parameter is completely ignored and all commands must run sandboxed or be explicitly listed in `excludedCommands`.

87</Note>128</Note>

88 129 

89## Security benefits130## Security benefits


96 137 

97* Cannot modify critical config files such as `~/.bashrc`138* Cannot modify critical config files such as `~/.bashrc`

98* Cannot modify system-level files in `/bin/`139* Cannot modify system-level files in `/bin/`

99* Cannot read files that are denied in your [Claude permission settings](/en/docs/claude-code/iam#configuring-permissions)140* Cannot read files that are denied in your [Claude permission settings](/en/permissions#manage-permissions)

100 141 

101**Network protection:**142**Network protection:**

102 143 


141 182 

142* Privilege Escalation via Unix Sockets: The `allowUnixSockets` configuration can inadvertently grant access to powerful system services that could lead to sandbox bypasses. For example, if it is used to allow access to `/var/run/docker.sock` this would effectively grant access to the host system through exploiting the docker socket. Users are encouraged to carefully consider any unix sockets that they allow through the sandbox.183* Privilege Escalation via Unix Sockets: The `allowUnixSockets` configuration can inadvertently grant access to powerful system services that could lead to sandbox bypasses. For example, if it is used to allow access to `/var/run/docker.sock` this would effectively grant access to the host system through exploiting the docker socket. Users are encouraged to carefully consider any unix sockets that they allow through the sandbox.

143* Filesystem Permission Escalation: Overly broad filesystem write permissions can enable privilege escalation attacks. Allowing writes to directories containing executables in `$PATH`, system configuration directories, or user shell configuration files (`.bashrc`, `.zshrc`) can lead to code execution in different security contexts when other users or system processes access these files.184* Filesystem Permission Escalation: Overly broad filesystem write permissions can enable privilege escalation attacks. Allowing writes to directories containing executables in `$PATH`, system configuration directories, or user shell configuration files (`.bashrc`, `.zshrc`) can lead to code execution in different security contexts when other users or system processes access these files.

144* Linux Sandbox Strength: The Linux implementation provides strong filesystem and network isolation but includes an `enableWeakerNestedSandbox` mode that enables it to work inside of Docker environments without privileged namespaces. This option considerably weakens security and should only be used incases where additional isolation is otherwise enforced.185* Linux Sandbox Strength: The Linux implementation provides strong filesystem and network isolation but includes an `enableWeakerNestedSandbox` mode that enables it to work inside of Docker environments without privileged namespaces. This option considerably weakens security and should only be used in cases where additional isolation is otherwise enforced.

186 

187## How sandboxing relates to permissions

188 

189Sandboxing and [permissions](/en/permissions) are complementary security layers that work together:

190 

191* **Permissions** control which tools Claude Code can use and are evaluated before any tool runs. They apply to all tools: Bash, Read, Edit, WebFetch, MCP, and others.

192* **Sandboxing** provides OS-level enforcement that restricts what Bash commands can access at the filesystem and network level. It applies only to Bash commands and their child processes.

193 

194Filesystem and network restrictions are configured through permission rules, not sandbox settings:

195 

196* Use `Read` and `Edit` deny rules to block access to specific files or directories

197* Use `WebFetch` allow/deny rules to control domain access

198* Use sandbox `allowedDomains` to control which domains Bash commands can reach

199 

200This [repository](https://github.com/anthropics/claude-code/tree/main/examples/settings) includes starter settings configurations for common deployment scenarios, including sandbox-specific examples. Use these as starting points and adjust them to fit your needs.

145 201 

146## Advanced usage202## Advanced usage

147 203 


169 225 

170The sandboxed bash tool works alongside:226The sandboxed bash tool works alongside:

171 227 

172* **IAM policies**: Combine with [permission settings](/en/docs/claude-code/iam) for defense-in-depth228* **Permission rules**: Combine with [permission settings](/en/permissions) for defense-in-depth

173* **Development containers**: Use with [devcontainers](/en/docs/claude-code/devcontainer) for additional isolation229* **Development containers**: Use with [devcontainers](/en/devcontainer) for additional isolation

174* **Enterprise policies**: Enforce sandbox configurations through [managed settings](/en/docs/claude-code/settings#settings-precedence)230* **Enterprise policies**: Enforce sandbox configurations through [managed settings](/en/settings#settings-precedence)

175 231 

176## Best practices232## Best practices

177 233 


195 251 

196* **Performance overhead**: Minimal, but some filesystem operations may be slightly slower252* **Performance overhead**: Minimal, but some filesystem operations may be slightly slower

197* **Compatibility**: Some tools that require specific system access patterns may need configuration adjustments, or may even need to be run outside of the sandbox253* **Compatibility**: Some tools that require specific system access patterns may need configuration adjustments, or may even need to be run outside of the sandbox

198* **Platform support**: Currently supports Linux and macOS; Windows support planned254* **Platform support**: Supports macOS, Linux, and WSL2. WSL1 is not supported. Native Windows support is planned.

199 255 

200## See also256## See also

201 257 

202* [Security](/en/docs/claude-code/security) - Comprehensive security features and best practices258* [Security](/en/security) - Comprehensive security features and best practices

203* [IAM](/en/docs/claude-code/iam) - Permission configuration and access control259* [Permissions](/en/permissions) - Permission configuration and access control

204* [Settings](/en/docs/claude-code/settings) - Complete configuration reference260* [Settings](/en/settings) - Complete configuration reference

205* [CLI reference](/en/docs/claude-code/cli-reference) - Command-line options including `-sb`261* [CLI reference](/en/cli-reference) - Command-line options

sdk/migration-guide.md +0 −327 deleted

File DeletedView Diff

1# Migrate to Claude Agent SDK

2 

3> Guide for migrating the Claude Code TypeScript and Python SDKs to the Claude Agent SDK

4 

5## Overview

6 

7The Claude Code SDK has been renamed to the **Claude Agent SDK** and its documentation has been reorganized. This change reflects the SDK's broader capabilities for building AI agents beyond just coding tasks.

8 

9## What's Changed

10 

11| Aspect | Old | New |

12| :------------------------- | :----------------------------- | :------------------------------- |

13| **Package Name (TS/JS)** | `@anthropic-ai/claude-code` | `@anthropic-ai/claude-agent-sdk` |

14| **Python Package** | `claude-code-sdk` | `claude-agent-sdk` |

15| **Documentation Location** | Claude Code docs → SDK section | API Guide → Agent SDK section |

16 

17<Note>

18 **Documentation Changes:** The Agent SDK documentation has moved from the Claude Code docs to the API Guide under a dedicated [Agent SDK](/en/api/agent-sdk/overview) section. The Claude Code docs now focus on the CLI tool and automation features.

19</Note>

20 

21## Migration Steps

22 

23### For TypeScript/JavaScript Projects

24 

25**1. Uninstall the old package:**

26 

27```bash theme={null}

28npm uninstall @anthropic-ai/claude-code

29```

30 

31**2. Install the new package:**

32 

33```bash theme={null}

34npm install @anthropic-ai/claude-agent-sdk

35```

36 

37**3. Update your imports:**

38 

39Change all imports from `@anthropic-ai/claude-code` to `@anthropic-ai/claude-agent-sdk`:

40 

41```typescript theme={null}

42// Before

43import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-code";

44 

45// After

46import {

47 query,

48 tool,

49 createSdkMcpServer,

50} from "@anthropic-ai/claude-agent-sdk";

51```

52 

53**4. Update package.json dependencies:**

54 

55If you have the package listed in your `package.json`, update it:

56 

57```json theme={null}

58// Before

59{

60 "dependencies": {

61 "@anthropic-ai/claude-code": "^1.0.0"

62 }

63}

64 

65// After

66{

67 "dependencies": {

68 "@anthropic-ai/claude-agent-sdk": "^0.1.0"

69 }

70}

71```

72 

73That's it! No other code changes are required.

74 

75### For Python Projects

76 

77**1. Uninstall the old package:**

78 

79```bash theme={null}

80pip uninstall claude-code-sdk

81```

82 

83**2. Install the new package:**

84 

85```bash theme={null}

86pip install claude-agent-sdk

87```

88 

89**3. Update your imports:**

90 

91Change all imports from `claude_code_sdk` to `claude_agent_sdk`:

92 

93```python theme={null}

94# Before

95from claude_code_sdk import query, ClaudeCodeOptions

96 

97# After

98from claude_agent_sdk import query, ClaudeAgentOptions

99```

100 

101**4. Update type names:**

102 

103Change `ClaudeCodeOptions` to `ClaudeAgentOptions`:

104 

105```python theme={null}

106# Before

107from claude_agent_sdk import query, ClaudeCodeOptions

108 

109options = ClaudeCodeOptions(

110 model="claude-sonnet-4-5"

111)

112 

113# After

114from claude_agent_sdk import query, ClaudeAgentOptions

115 

116options = ClaudeAgentOptions(

117 model="claude-sonnet-4-5"

118)

119```

120 

121**5. Review [breaking changes](#breaking-changes)**

122 

123Make any code changes needed to complete the migration.

124 

125## Breaking changes

126 

127<Warning>

128 To improve isolation and explicit configuration, Claude Agent SDK v0.1.0 introduces breaking changes for users migrating from Claude Code SDK. Review this section carefully before migrating.

129</Warning>

130 

131### Python: ClaudeCodeOptions renamed to ClaudeAgentOptions

132 

133**What changed:** The Python SDK type `ClaudeCodeOptions` has been renamed to `ClaudeAgentOptions`.

134 

135**Migration:**

136 

137```python theme={null}

138# BEFORE (v0.0.x)

139from claude_agent_sdk import query, ClaudeCodeOptions

140 

141options = ClaudeCodeOptions(

142 model="claude-sonnet-4-5",

143 permission_mode="acceptEdits"

144)

145 

146# AFTER (v0.1.0)

147from claude_agent_sdk import query, ClaudeAgentOptions

148 

149options = ClaudeAgentOptions(

150 model="claude-sonnet-4-5",

151 permission_mode="acceptEdits"

152)

153```

154 

155**Why this changed:** The type name now matches the "Claude Agent SDK" branding and provides consistency across the SDK's naming conventions.

156 

157### System prompt no longer default

158 

159**What changed:** The SDK no longer uses Claude Code's system prompt by default.

160 

161**Migration:**

162 

163<CodeGroup>

164 ```typescript TypeScript theme={null}

165 // BEFORE (v0.0.x) - Used Claude Code's system prompt by default

166 const result = query({ prompt: "Hello" });

167 

168 // AFTER (v0.1.0) - Uses empty system prompt by default

169 // To get the old behavior, explicitly request Claude Code's preset:

170 const result = query({

171 prompt: "Hello",

172 options: {

173 systemPrompt: { type: "preset", preset: "claude_code" }

174 }

175 });

176 

177 // Or use a custom system prompt:

178 const result = query({

179 prompt: "Hello",

180 options: {

181 systemPrompt: "You are a helpful coding assistant"

182 }

183 });

184 ```

185 

186 ```python Python theme={null}

187 # BEFORE (v0.0.x) - Used Claude Code's system prompt by default

188 async for message in query(prompt="Hello"):

189 print(message)

190 

191 # AFTER (v0.1.0) - Uses empty system prompt by default

192 # To get the old behavior, explicitly request Claude Code's preset:

193 from claude_agent_sdk import query, ClaudeAgentOptions

194 

195 async for message in query(

196 prompt="Hello",

197 options=ClaudeAgentOptions(

198 system_prompt={"type": "preset", "preset": "claude_code"} # Use the preset

199 )

200 ):

201 print(message)

202 

203 # Or use a custom system prompt:

204 async for message in query(

205 prompt="Hello",

206 options=ClaudeAgentOptions(

207 system_prompt="You are a helpful coding assistant"

208 )

209 ):

210 print(message)

211 ```

212</CodeGroup>

213 

214**Why this changed:** Provides better control and isolation for SDK applications. You can now build agents with custom behavior without inheriting Claude Code's CLI-focused instructions.

215 

216### Settings Sources No Longer Loaded by Default

217 

218**What changed:** The SDK no longer reads from filesystem settings (CLAUDE.md, settings.json, slash commands, etc.) by default.

219 

220**Migration:**

221 

222<CodeGroup>

223 ```typescript TypeScript theme={null}

224 // BEFORE (v0.0.x) - Loaded all settings automatically

225 const result = query({ prompt: "Hello" });

226 // Would read from:

227 // - ~/.claude/settings.json (user)

228 // - .claude/settings.json (project)

229 // - .claude/settings.local.json (local)

230 // - CLAUDE.md files

231 // - Custom slash commands

232 

233 // AFTER (v0.1.0) - No settings loaded by default

234 // To get the old behavior:

235 const result = query({

236 prompt: "Hello",

237 options: {

238 settingSources: ["user", "project", "local"]

239 }

240 });

241 

242 // Or load only specific sources:

243 const result = query({

244 prompt: "Hello",

245 options: {

246 settingSources: ["project"] // Only project settings

247 }

248 });

249 ```

250 

251 ```python Python theme={null}

252 # BEFORE (v0.0.x) - Loaded all settings automatically

253 async for message in query(prompt="Hello"):

254 print(message)

255 # Would read from:

256 # - ~/.claude/settings.json (user)

257 # - .claude/settings.json (project)

258 # - .claude/settings.local.json (local)

259 # - CLAUDE.md files

260 # - Custom slash commands

261 

262 # AFTER (v0.1.0) - No settings loaded by default

263 # To get the old behavior:

264 from claude_agent_sdk import query, ClaudeAgentOptions

265 

266 async for message in query(

267 prompt="Hello",

268 options=ClaudeAgentOptions(

269 setting_sources=["user", "project", "local"]

270 )

271 ):

272 print(message)

273 

274 # Or load only specific sources:

275 async for message in query(

276 prompt="Hello",

277 options=ClaudeAgentOptions(

278 setting_sources=["project"] # Only project settings

279 )

280 ):

281 print(message)

282 ```

283</CodeGroup>

284 

285**Why this changed:** Ensures SDK applications have predictable behavior independent of local filesystem configurations. This is especially important for:

286 

287* **CI/CD environments** - Consistent behavior without local customizations

288* **Deployed applications** - No dependency on filesystem settings

289* **Testing** - Isolated test environments

290* **Multi-tenant systems** - Prevent settings leakage between users

291 

292<Note>

293 **Backward compatibility:** If your application relied on filesystem settings (custom slash commands, CLAUDE.md instructions, etc.), add `settingSources: ['user', 'project', 'local']` to your options.

294</Note>

295 

296## Why the Rename?

297 

298The Claude Code SDK was originally designed for coding tasks, but it has evolved into a powerful framework for building all types of AI agents. The new name "Claude Agent SDK" better reflects its capabilities:

299 

300* Building business agents (legal assistants, finance advisors, customer support)

301* Creating specialized coding agents (SRE bots, security reviewers, code review agents)

302* Developing custom agents for any domain with tool use, MCP integration, and more

303 

304## Getting Help

305 

306If you encounter any issues during migration:

307 

308**For TypeScript/JavaScript:**

309 

3101. Check that all imports are updated to use `@anthropic-ai/claude-agent-sdk`

3112. Verify your package.json has the new package name

3123. Run `npm install` to ensure dependencies are updated

313 

314**For Python:**

315 

3161. Check that all imports are updated to use `claude_agent_sdk`

3172. Verify your requirements.txt or pyproject.toml has the new package name

3183. Run `pip install claude-agent-sdk` to ensure the package is installed

319 

320See the [Troubleshooting](/en/docs/claude-code/troubleshooting) guide for common issues.

321 

322## Next Steps

323 

324* Explore the [Agent SDK Overview](/en/api/agent-sdk/overview) to learn about available features

325* Check out the [TypeScript SDK Reference](/en/api/agent-sdk/typescript) for detailed API documentation

326* Review the [Python SDK Reference](/en/api/agent-sdk/python) for Python-specific documentation

327* Learn about [Custom Tools](/en/api/agent-sdk/custom-tools) and [MCP Integration](/en/api/agent-sdk/mcp)

security.md +21 −14

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Security5# Security

2 6 

3> Learn about Claude Code's security safeguards and best practices for safe usage.7> Learn about Claude Code's security safeguards and best practices for safe usage.


14 18 

15We designed Claude Code to be transparent and secure. For example, we require approval for bash commands before executing them, giving you direct control. This approach enables users and organizations to configure permissions directly.19We designed Claude Code to be transparent and secure. For example, we require approval for bash commands before executing them, giving you direct control. This approach enables users and organizations to configure permissions directly.

16 20 

17For detailed permission configuration, see [Identity and Access Management](/en/docs/claude-code/iam).21For detailed permission configuration, see [Permissions](/en/permissions).

18 22 

19### Built-in protections23### Built-in protections

20 24 

21To mitigate risks in agentic systems:25To mitigate risks in agentic systems:

22 26 

23* **Sandboxed bash tool**: [Sandbox](/en/docs/claude-code/sandboxing) bash commands with filesystem and network isolation, reducing permission prompts while maintaining security. Enable with `/sandbox` to define boundaries where Claude Code can work autonomously27* **Sandboxed bash tool**: [Sandbox](/en/sandboxing) bash commands with filesystem and network isolation, reducing permission prompts while maintaining security. Enable with `/sandbox` to define boundaries where Claude Code can work autonomously

24* **Write access restriction**: Claude Code can only write to the folder where it was started and its subfolders—it cannot modify files in parent directories without explicit permission. While Claude Code can read files outside the working directory (useful for accessing system libraries and dependencies), write operations are strictly confined to the project scope, creating a clear security boundary28* **Write access restriction**: Claude Code can only write to the folder where it was started and its subfolders—it cannot modify files in parent directories without explicit permission. While Claude Code can read files outside the working directory (useful for accessing system libraries and dependencies), write operations are strictly confined to the project scope, creating a clear security boundary

25* **Prompt fatigue mitigation**: Support for allowlisting frequently used safe commands per-user, per-codebase, or per-organization29* **Prompt fatigue mitigation**: Support for allowlisting frequently used safe commands per-user, per-codebase, or per-organization

26* **Accept Edits mode**: Batch accept multiple edits while maintaining permission prompts for commands with side effects30* **Accept Edits mode**: Batch accept multiple edits while maintaining permission prompts for commands with side effects


38* **Permission system**: Sensitive operations require explicit approval42* **Permission system**: Sensitive operations require explicit approval

39* **Context-aware analysis**: Detects potentially harmful instructions by analyzing the full request43* **Context-aware analysis**: Detects potentially harmful instructions by analyzing the full request

40* **Input sanitization**: Prevents command injection by processing user inputs44* **Input sanitization**: Prevents command injection by processing user inputs

41* **Command blocklist**: Blocks risky commands that fetch arbitrary content from the web like `curl` and `wget` by default. When explicitly allowed, be aware of [permission pattern limitations](/en/docs/claude-code/iam#tool-specific-permission-rules)45* **Command blocklist**: Blocks risky commands that fetch arbitrary content from the web like `curl` and `wget` by default. When explicitly allowed, be aware of [permission pattern limitations](/en/permissions#tool-specific-permission-rules)

42 46 

43### Privacy safeguards47### Privacy safeguards

44 48 


59* **Command injection detection**: Suspicious bash commands require manual approval even if previously allowlisted63* **Command injection detection**: Suspicious bash commands require manual approval even if previously allowlisted

60* **Fail-closed matching**: Unmatched commands default to requiring manual approval64* **Fail-closed matching**: Unmatched commands default to requiring manual approval

61* **Natural language descriptions**: Complex bash commands include explanations for user understanding65* **Natural language descriptions**: Complex bash commands include explanations for user understanding

62* **Secure credential storage**: API keys and tokens are encrypted. See [Credential Management](/en/docs/claude-code/iam#credential-management)66* **Secure credential storage**: API keys and tokens are encrypted. See [Credential Management](/en/authentication#credential-management)

63 67 

64<Warning>68<Warning>

65 **Windows WebDAV security risk**: When running Claude Code on Windows, we recommend against enabling WebDAV or allowing Claude Code to access paths such as `\\*` that may contain WebDAV subdirectories. [WebDAV has been deprecated by Microsoft](https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features#:~:text=The%20Webclient%20\(WebDAV\)%20service%20is%20deprecated) due to security risks. Enabling WebDAV may allow Claude Code to trigger network requests to remote hosts, bypassing the permission system.69 **Windows WebDAV security risk**: When running Claude Code on Windows, we recommend against enabling WebDAV or allowing Claude Code to access paths such as `\\*` that may contain WebDAV subdirectories. [WebDAV has been deprecated by Microsoft](https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features#:~:text=The%20Webclient%20\(WebDAV\)%20service%20is%20deprecated) due to security risks. Enabling WebDAV may allow Claude Code to trigger network requests to remote hosts, bypassing the permission system.


87 91 

88## IDE security92## IDE security

89 93 

90See [here](/en/docs/claude-code/ide-integrations#security) for more information on the security of running Claude Code in an IDE.94See [VS Code security and privacy](/en/vs-code#security-and-privacy) for more information on running Claude Code in an IDE.

91 95 

92## Cloud execution security96## Cloud execution security

93 97 

94When using [Claude Code on the web](/en/docs/claude-code/claude-code-on-the-web), additional security controls are in place:98When using [Claude Code on the web](/en/claude-code-on-the-web), additional security controls are in place:

95 99 

96* **Isolated virtual machines**: Each cloud session runs in an isolated, Anthropic-managed VM100* **Isolated virtual machines**: Each cloud session runs in an isolated, Anthropic-managed VM

97* **Network access controls**: Network access is limited by default and can be configured to be disabled or allow only specific domains101* **Network access controls**: Network access is limited by default and can be configured to be disabled or allow only specific domains


100* **Audit logging**: All operations in cloud environments are logged for compliance and audit purposes104* **Audit logging**: All operations in cloud environments are logged for compliance and audit purposes

101* **Automatic cleanup**: Cloud environments are automatically terminated after session completion105* **Automatic cleanup**: Cloud environments are automatically terminated after session completion

102 106 

103For more details on cloud execution, see [Claude Code on the web](/en/docs/claude-code/claude-code-on-the-web).107For more details on cloud execution, see [Claude Code on the web](/en/claude-code-on-the-web).

108 

109[Remote Control](/en/remote-control) sessions work differently: the web interface connects to a Claude Code process running on your local machine. All code execution and file access stays local, and the same data that flows during any local Claude Code session travels through the Anthropic API over TLS. No cloud VMs or sandboxing are involved. The connection uses multiple short-lived, narrowly scoped credentials, each limited to a specific purpose and expiring independently, to limit the blast radius of any single compromised credential.

104 110 

105## Security best practices111## Security best practices

106 112 


108 114 

109* Review all suggested changes before approval115* Review all suggested changes before approval

110* Use project-specific permission settings for sensitive repositories116* Use project-specific permission settings for sensitive repositories

111* Consider using [devcontainers](/en/docs/claude-code/devcontainer) for additional isolation117* Consider using [devcontainers](/en/devcontainer) for additional isolation

112* Regularly audit your permission settings with `/permissions`118* Regularly audit your permission settings with `/permissions`

113 119 

114### Team security120### Team security

115 121 

116* Use [enterprise managed policies](/en/docs/claude-code/iam#enterprise-managed-policy-settings) to enforce organizational standards122* Use [managed settings](/en/settings#settings-files) to enforce organizational standards

117* Share approved permission configurations through version control123* Share approved permission configurations through version control

118* Train team members on security best practices124* Train team members on security best practices

119* Monitor Claude Code usage through [OpenTelemetry metrics](/en/docs/claude-code/monitoring-usage)125* Monitor Claude Code usage through [OpenTelemetry metrics](/en/monitoring-usage)

126* Audit or block settings changes during sessions with [`ConfigChange` hooks](/en/hooks#configchange)

120 127 

121### Reporting security issues128### Reporting security issues

122 129 


129 136 

130## Related resources137## Related resources

131 138 

132* [Sandboxing](/en/docs/claude-code/sandboxing) - Filesystem and network isolation for bash commands139* [Sandboxing](/en/sandboxing) - Filesystem and network isolation for bash commands

133* [Identity and Access Management](/en/docs/claude-code/iam) - Configure permissions and access controls140* [Permissions](/en/permissions) - Configure permissions and access controls

134* [Monitoring usage](/en/docs/claude-code/monitoring-usage) - Track and audit Claude Code activity141* [Monitoring usage](/en/monitoring-usage) - Track and audit Claude Code activity

135* [Development containers](/en/docs/claude-code/devcontainer) - Secure, isolated environments142* [Development containers](/en/devcontainer) - Secure, isolated environments

136* [Anthropic Trust Center](https://trust.anthropic.com) - Security certifications and compliance143* [Anthropic Trust Center](https://trust.anthropic.com) - Security certifications and compliance

server-managed-settings.md +164 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Configure server-managed settings (public beta)

6 

7> Centrally configure Claude Code for your organization through server-delivered settings, without requiring device management infrastructure.

8 

9Server-managed settings allow administrators to centrally configure Claude Code through a web-based interface on Claude.ai. Claude Code clients automatically receive these settings when users authenticate with their organization credentials.

10 

11This approach is designed for organizations that do not have device management infrastructure in place, or need to manage settings for users on unmanaged devices.

12 

13<Note>

14 Server-managed settings are in public beta and available for [Claude for Teams](https://claude.com/pricing#team-&-enterprise) and [Claude for Enterprise](https://anthropic.com/contact-sales) customers. Features may evolve before general availability.

15</Note>

16 

17## Requirements

18 

19To use server-managed settings, you need:

20 

21* Claude for Teams or Claude for Enterprise plan

22* Claude Code version 2.1.38 or later for Claude for Teams, or version 2.1.30 or later for Claude for Enterprise

23* Network access to `api.anthropic.com`

24 

25## Choose between server-managed and endpoint-managed settings

26 

27Claude Code supports two approaches for centralized configuration. Server-managed settings deliver configuration from Anthropic's servers. [Endpoint-managed settings](/en/settings#settings-files) are deployed directly to devices through native OS policies (macOS managed preferences, Windows registry) or managed settings files.

28 

29| Approach | Best for | Security model |

30| :----------------------------------------------------------- | :------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------- |

31| **Server-managed settings** | Organizations without MDM, or users on unmanaged devices | Settings delivered from Anthropic's servers at authentication time |

32| **[Endpoint-managed settings](/en/settings#settings-files)** | Organizations with MDM or endpoint management | Settings deployed to devices via MDM configuration profiles, registry policies, or managed settings files |

33 

34If your devices are enrolled in an MDM or endpoint management solution, endpoint-managed settings provide stronger security guarantees because the settings file can be protected from user modification at the OS level.

35 

36## Configure server-managed settings

37 

38<Steps>

39 <Step title="Open the admin console">

40 In [Claude.ai](https://claude.ai), navigate to **Admin Settings > Claude Code > Managed settings**.

41 </Step>

42 

43 <Step title="Define your settings">

44 Add your configuration as JSON. All [settings available in `settings.json`](/en/settings#available-settings) are supported, including [managed-only settings](/en/permissions#managed-only-settings) like `disableBypassPermissionsMode`.

45 

46 This example enforces a permission deny list and prevents users from bypassing permissions:

47 

48 ```json theme={null}

49 {

50 "permissions": {

51 "deny": [

52 "Bash(curl *)",

53 "Read(./.env)",

54 "Read(./.env.*)",

55 "Read(./secrets/**)"

56 ]

57 },

58 "disableBypassPermissionsMode": "disable"

59 }

60 ```

61 </Step>

62 

63 <Step title="Save and deploy">

64 Save your changes. Claude Code clients receive the updated settings on their next startup or hourly polling cycle.

65 </Step>

66</Steps>

67 

68### Verify settings delivery

69 

70To confirm that settings are being applied, ask a user to restart Claude Code. If the configuration includes settings that trigger the [security approval dialog](#security-approval-dialogs), the user sees a prompt describing the managed settings on startup. You can also verify that managed permission rules are active by having a user run `/permissions` to view their effective permission rules.

71 

72### Access control

73 

74The following roles can manage server-managed settings:

75 

76* **Primary Owner**

77* **Owner**

78 

79Restrict access to trusted personnel, as settings changes apply to all users in the organization.

80 

81### Current limitations

82 

83Server-managed settings have the following limitations during the beta period:

84 

85* Settings apply uniformly to all users in the organization. Per-group configurations are not yet supported.

86* [MCP server configurations](/en/mcp#managed-mcp-configuration) cannot be distributed through server-managed settings.

87 

88## Settings delivery

89 

90### Settings precedence

91 

92Server-managed settings and [endpoint-managed settings](/en/settings#settings-files) both occupy the highest tier in the Claude Code [settings hierarchy](/en/settings#settings-precedence), and user or project settings cannot override them. When both are present, server-managed settings take precedence and endpoint-managed settings are not used.

93 

94### Fetch and caching behavior

95 

96Claude Code fetches settings from Anthropic's servers at startup and polls for updates hourly during active sessions.

97 

98**First launch without cached settings:**

99 

100* Claude Code fetches settings asynchronously

101* If the fetch fails, Claude Code continues without managed settings

102* There is a brief window before settings load where restrictions are not yet enforced

103 

104**Subsequent launches with cached settings:**

105 

106* Cached settings apply immediately at startup

107* Claude Code fetches fresh settings in the background

108* Cached settings persist through network failures

109 

110Claude Code applies settings updates automatically without a restart, except for advanced settings like OpenTelemetry configuration, which require a full restart to take effect.

111 

112### Security approval dialogs

113 

114Certain settings that could pose security risks require explicit user approval before being applied:

115 

116* **Shell command settings**: settings that execute shell commands

117* **Custom environment variables**: variables not in the known safe allowlist

118* **Hook configurations**: any hook definition

119 

120When these settings are present, users see a security dialog explaining what is being configured. Users must approve to proceed. If a user rejects the settings, Claude Code exits.

121 

122<Note>

123 In non-interactive mode with the `-p` flag, Claude Code skips security dialogs and applies settings without user approval.

124</Note>

125 

126## Platform availability

127 

128Server-managed settings require a direct connection to `api.anthropic.com` and are not available when using third-party model providers:

129 

130* Amazon Bedrock

131* Google Vertex AI

132* Microsoft Foundry

133* Custom API endpoints via `ANTHROPIC_BASE_URL` or [LLM gateways](/en/llm-gateway)

134 

135## Audit logging

136 

137Audit log events for settings changes are available through the compliance API or audit log export. Contact your Anthropic account team for access.

138 

139Audit events include the type of action performed, the account and device that performed the action, and references to the previous and new values.

140 

141## Security considerations

142 

143Server-managed settings provide centralized policy enforcement, but they operate as a client-side control. On unmanaged devices, users with admin or sudo access can modify the Claude Code binary, filesystem, or network configuration.

144 

145| Scenario | Behavior |

146| :----------------------------------------------- | :-------------------------------------------------------------------------------------------------------------- |

147| User edits the cached settings file | Tampered file applies at startup, but correct settings restore on the next server fetch |

148| User deletes the cached settings file | First-launch behavior occurs: settings fetch asynchronously with a brief unenforced window |

149| API is unavailable | Cached settings apply if available, otherwise managed settings are not enforced until the next successful fetch |

150| User authenticates with a different organization | Settings are not delivered for accounts outside the managed organization |

151| User sets a non-default `ANTHROPIC_BASE_URL` | Server-managed settings are bypassed when using third-party API providers |

152 

153To detect runtime configuration changes, use [`ConfigChange` hooks](/en/hooks#configchange) to log modifications or block unauthorized changes before they take effect.

154 

155For stronger enforcement guarantees, use [endpoint-managed settings](/en/settings#settings-files) on devices enrolled in an MDM solution.

156 

157## See also

158 

159Related pages for managing Claude Code configuration:

160 

161* [Settings](/en/settings): complete configuration reference including all available settings

162* [Endpoint-managed settings](/en/settings#settings-files): managed settings deployed to devices by IT

163* [Authentication](/en/authentication): set up user access to Claude Code

164* [Security](/en/security): security safeguards and best practices

settings.md +686 −133

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Claude Code settings5# Claude Code settings

2 6 

3> Configure Claude Code with global and project-level settings, and environment variables.7> Configure Claude Code with global and project-level settings, and environment variables.

4 8 

5Claude Code offers a variety of settings to configure its behavior to meet your needs. You can configure Claude Code by running the `/config` command when using the interactive REPL, which opens a tabbed Settings interface where you can view status information and modify configuration options.9Claude Code offers a variety of settings to configure its behavior to meet your needs. You can configure Claude Code by running the `/config` command when using the interactive REPL, which opens a tabbed Settings interface where you can view status information and modify configuration options.

6 10 

11## Configuration scopes

12 

13Claude Code uses a **scope system** to determine where configurations apply and who they're shared with. Understanding scopes helps you decide how to configure Claude Code for personal use, team collaboration, or enterprise deployment.

14 

15### Available scopes

16 

17| Scope | Location | Who it affects | Shared with team? |

18| :---------- | :--------------------------------------------------------------------------------- | :----------------------------------- | :--------------------- |

19| **Managed** | Server-managed settings, plist / registry, or system-level `managed-settings.json` | All users on the machine | Yes (deployed by IT) |

20| **User** | `~/.claude/` directory | You, across all projects | No |

21| **Project** | `.claude/` in repository | All collaborators on this repository | Yes (committed to git) |

22| **Local** | `.claude/*.local.*` files | You, in this repository only | No (gitignored) |

23 

24### When to use each scope

25 

26**Managed scope** is for:

27 

28* Security policies that must be enforced organization-wide

29* Compliance requirements that can't be overridden

30* Standardized configurations deployed by IT/DevOps

31 

32**User scope** is best for:

33 

34* Personal preferences you want everywhere (themes, editor settings)

35* Tools and plugins you use across all projects

36* API keys and authentication (stored securely)

37 

38**Project scope** is best for:

39 

40* Team-shared settings (permissions, hooks, MCP servers)

41* Plugins the whole team should have

42* Standardizing tooling across collaborators

43 

44**Local scope** is best for:

45 

46* Personal overrides for a specific project

47* Testing configurations before sharing with the team

48* Machine-specific settings that won't work for others

49 

50### How scopes interact

51 

52When the same setting is configured in multiple scopes, more specific scopes take precedence:

53 

541. **Managed** (highest) - can't be overridden by anything

552. **Command line arguments** - temporary session overrides

563. **Local** - overrides project and user settings

574. **Project** - overrides user settings

585. **User** (lowest) - applies when nothing else specifies the setting

59 

60For example, if a permission is allowed in user settings but denied in project settings, the project setting takes precedence and the permission is blocked.

61 

62### What uses scopes

63 

64Scopes apply to many Claude Code features:

65 

66| Feature | User location | Project location | Local location |

67| :-------------- | :------------------------ | :--------------------------------- | :----------------------------- |

68| **Settings** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` |

69| **Subagents** | `~/.claude/agents/` | `.claude/agents/` | — |

70| **MCP servers** | `~/.claude.json` | `.mcp.json` | `~/.claude.json` (per-project) |

71| **Plugins** | `~/.claude/settings.json` | `.claude/settings.json` | `.claude/settings.local.json` |

72| **CLAUDE.md** | `~/.claude/CLAUDE.md` | `CLAUDE.md` or `.claude/CLAUDE.md` | `CLAUDE.local.md` |

73 

74***

75 

7## Settings files76## Settings files

8 77 

9The `settings.json` file is our official mechanism for configuring Claude78The `settings.json` file is our official mechanism for configuring Claude


14* **Project settings** are saved in your project directory:83* **Project settings** are saved in your project directory:

15 * `.claude/settings.json` for settings that are checked into source control and shared with your team84 * `.claude/settings.json` for settings that are checked into source control and shared with your team

16 * `.claude/settings.local.json` for settings that are not checked in, useful for personal preferences and experimentation. Claude Code will configure git to ignore `.claude/settings.local.json` when it is created.85 * `.claude/settings.local.json` for settings that are not checked in, useful for personal preferences and experimentation. Claude Code will configure git to ignore `.claude/settings.local.json` when it is created.

17* For enterprise deployments of Claude Code, we also support **enterprise86* **Managed settings**: For organizations that need centralized control, Claude Code supports multiple delivery mechanisms for managed settings. All use the same JSON format and cannot be overridden by user or project settings:

18 managed policy settings**. These take precedence over user and project87 

19 settings. System administrators can deploy policies to:88 * **Server-managed settings**: delivered from Anthropic's servers via the Claude.ai admin console. See [server-managed settings](/en/server-managed-settings).

20 * macOS: `/Library/Application Support/ClaudeCode/managed-settings.json`89 * **MDM/OS-level policies**: delivered through native device management on macOS and Windows:

21 * Linux and WSL: `/etc/claude-code/managed-settings.json`90 * macOS: `com.anthropic.claudecode` managed preferences domain (deployed via configuration profiles in Jamf, Kandji, or other MDM tools)

22 * Windows: `C:\ProgramData\ClaudeCode\managed-settings.json`91 * Windows: `HKLM\SOFTWARE\Policies\ClaudeCode` registry key with a `Settings` value (REG\_SZ or REG\_EXPAND\_SZ) containing JSON (deployed via Group Policy or Intune)

23* Enterprise deployments can also configure **managed MCP servers** that override92 * Windows (user-level): `HKCU\SOFTWARE\Policies\ClaudeCode` (lowest policy priority, only used when no admin-level source exists)

24 user-configured servers. See [Enterprise MCP configuration](/en/docs/claude-code/mcp#enterprise-mcp-configuration):93 * **File-based**: `managed-settings.json` and `managed-mcp.json` deployed to system directories:

25 * macOS: `/Library/Application Support/ClaudeCode/managed-mcp.json`94 * macOS: `/Library/Application Support/ClaudeCode/`

26 * Linux and WSL: `/etc/claude-code/managed-mcp.json`95 * Linux and WSL: `/etc/claude-code/`

27 * Windows: `C:\ProgramData\ClaudeCode\managed-mcp.json`96 * Windows: `C:\Program Files\ClaudeCode\`

97 

98 See [managed settings](/en/permissions#managed-only-settings) and [Managed MCP configuration](/en/mcp#managed-mcp-configuration) for details.

99 

100 <Note>

101 Managed deployments can also restrict **plugin marketplace additions** using

102 `strictKnownMarketplaces`. For more information, see [Managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions).

103 </Note>

104* **Other configuration** is stored in `~/.claude.json`. This file contains your preferences (theme, notification settings, editor mode), OAuth session, [MCP server](/en/mcp) configurations for user and local scopes, per-project state (allowed tools, trust settings), and various caches. Project-scoped MCP servers are stored separately in `.mcp.json`.

105 

106<Note>

107 Claude Code automatically creates timestamped backups of configuration files and retains the five most recent backups to prevent data loss.

108</Note>

28 109 

29```JSON Example settings.json theme={null}110```JSON Example settings.json theme={null}

30{111{

112 "$schema": "https://json.schemastore.org/claude-code-settings.json",

31 "permissions": {113 "permissions": {

32 "allow": [114 "allow": [

33 "Bash(npm run lint)",115 "Bash(npm run lint)",

34 "Bash(npm run test:*)",116 "Bash(npm run test *)",

35 "Read(~/.zshrc)"117 "Read(~/.zshrc)"

36 ],118 ],

37 "deny": [119 "deny": [

38 "Bash(curl:*)",120 "Bash(curl *)",

39 "Read(./.env)",121 "Read(./.env)",

40 "Read(./.env.*)",122 "Read(./.env.*)",

41 "Read(./secrets/**)"123 "Read(./secrets/**)"


44 "env": {126 "env": {

45 "CLAUDE_CODE_ENABLE_TELEMETRY": "1",127 "CLAUDE_CODE_ENABLE_TELEMETRY": "1",

46 "OTEL_METRICS_EXPORTER": "otlp"128 "OTEL_METRICS_EXPORTER": "otlp"

47 }129 },

130 "companyAnnouncements": [

131 "Welcome to Acme Corp! Review our code guidelines at docs.acme.com",

132 "Reminder: Code reviews required for all PRs",

133 "New security policy in effect"

134 ]

48}135}

49```136```

50 137 

138The `$schema` line in the example above points to the [official JSON schema](https://json.schemastore.org/claude-code-settings.json) for Claude Code settings. Adding it to your `settings.json` enables autocomplete and inline validation in VS Code, Cursor, and any other editor that supports JSON schema validation.

139 

51### Available settings140### Available settings

52 141 

53`settings.json` supports a number of options:142`settings.json` supports a number of options:

54 143 

55| Key | Description | Example |144| Key | Description | Example |

56| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------- |145| :-------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------- |

57| `apiKeyHelper` | Custom script, to be executed in `/bin/sh`, to generate an auth value. This value will be sent as `X-Api-Key` and `Authorization: Bearer` headers for model requests | `/bin/generate_temp_api_key.sh` |146| `apiKeyHelper` | Custom script, to be executed in `/bin/sh`, to generate an auth value. This value will be sent as `X-Api-Key` and `Authorization: Bearer` headers for model requests | `/bin/generate_temp_api_key.sh` |

58| `cleanupPeriodDays` | How long to locally retain chat transcripts based on last activity date (default: 30 days) | `20` |147| `cleanupPeriodDays` | Sessions inactive for longer than this period are deleted at startup. Setting to `0` immediately deletes all sessions. (default: 30 days) | `20` |

148| `companyAnnouncements` | Announcement to display to users at startup. If multiple announcements are provided, they will be cycled through at random. | `["Welcome to Acme Corp! Review our code guidelines at docs.acme.com"]` |

59| `env` | Environment variables that will be applied to every session | `{"FOO": "bar"}` |149| `env` | Environment variables that will be applied to every session | `{"FOO": "bar"}` |

60| `includeCoAuthoredBy` | Whether to include the `co-authored-by Claude` byline in git commits and pull requests (default: `true`) | `false` |150| `attribution` | Customize attribution for git commits and pull requests. See [Attribution settings](#attribution-settings) | `{"commit": "🤖 Generated with Claude Code", "pr": ""}` |

151| `includeCoAuthoredBy` | **Deprecated**: Use `attribution` instead. Whether to include the `co-authored-by Claude` byline in git commits and pull requests (default: `true`) | `false` |

61| `permissions` | See table below for structure of permissions. | |152| `permissions` | See table below for structure of permissions. | |

62| `hooks` | Configure custom commands to run before or after tool executions. See [hooks documentation](hooks) | `{"PreToolUse": {"Bash": "echo 'Running command...'"}}` |153| `hooks` | Configure custom commands to run at lifecycle events. See [hooks documentation](/en/hooks) for format | See [hooks](/en/hooks) |

63| `disableAllHooks` | Disable all [hooks](hooks) | `true` |154| `disableAllHooks` | Disable all [hooks](/en/hooks) and any custom [status line](/en/statusline) | `true` |

64| `model` | Override the default model to use for Claude Code | `"claude-sonnet-4-5-20250929"` |155| `allowManagedHooksOnly` | (Managed settings only) Prevent loading of user, project, and plugin hooks. Only allows managed hooks and SDK hooks. See [Hook configuration](#hook-configuration) | `true` |

65| `statusLine` | Configure a custom status line to display context. See [statusLine documentation](statusline) | `{"type": "command", "command": "~/.claude/statusline.sh"}` |156| `allowManagedPermissionRulesOnly` | (Managed settings only) Prevent user and project settings from defining `allow`, `ask`, or `deny` permission rules. Only rules in managed settings apply. See [Managed-only settings](/en/permissions#managed-only-settings) | `true` |

66| `outputStyle` | Configure an output style to adjust the system prompt. See [output styles documentation](output-styles) | `"Explanatory"` |157| `allowManagedMcpServersOnly` | (Managed settings only) Only `allowedMcpServers` from managed settings are respected. `deniedMcpServers` still merges from all sources. Users can still add MCP servers, but only the admin-defined allowlist applies. See [Managed MCP configuration](/en/mcp#managed-mcp-configuration) | `true` |

158| `model` | Override the default model to use for Claude Code | `"claude-sonnet-4-6"` |

159| `availableModels` | Restrict which models users can select via `/model`, `--model`, Config tool, or `ANTHROPIC_MODEL`. Does not affect the Default option. See [Restrict model selection](/en/model-config#restrict-model-selection) | `["sonnet", "haiku"]` |

160| `otelHeadersHelper` | Script to generate dynamic OpenTelemetry headers. Runs at startup and periodically (see [Dynamic headers](/en/monitoring-usage#dynamic-headers)) | `/bin/generate_otel_headers.sh` |

161| `statusLine` | Configure a custom status line to display context. See [`statusLine` documentation](/en/statusline) | `{"type": "command", "command": "~/.claude/statusline.sh"}` |

162| `fileSuggestion` | Configure a custom script for `@` file autocomplete. See [File suggestion settings](#file-suggestion-settings) | `{"type": "command", "command": "~/.claude/file-suggestion.sh"}` |

163| `respectGitignore` | Control whether the `@` file picker respects `.gitignore` patterns. When `true` (default), files matching `.gitignore` patterns are excluded from suggestions | `false` |

164| `outputStyle` | Configure an output style to adjust the system prompt. See [output styles documentation](/en/output-styles) | `"Explanatory"` |

67| `forceLoginMethod` | Use `claudeai` to restrict login to Claude.ai accounts, `console` to restrict login to Claude Console (API usage billing) accounts | `claudeai` |165| `forceLoginMethod` | Use `claudeai` to restrict login to Claude.ai accounts, `console` to restrict login to Claude Console (API usage billing) accounts | `claudeai` |

68| `forceLoginOrgUUID` | Specify the UUID of an organization to automatically select it during login, bypassing the organization selection step. Requires `forceLoginMethod` to be set | `"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"` |166| `forceLoginOrgUUID` | Specify the UUID of an organization to automatically select it during login, bypassing the organization selection step. Requires `forceLoginMethod` to be set | `"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"` |

69| `enableAllProjectMcpServers` | Automatically approve all MCP servers defined in project `.mcp.json` files | `true` |167| `enableAllProjectMcpServers` | Automatically approve all MCP servers defined in project `.mcp.json` files | `true` |

70| `enabledMcpjsonServers` | List of specific MCP servers from `.mcp.json` files to approve | `["memory", "github"]` |168| `enabledMcpjsonServers` | List of specific MCP servers from `.mcp.json` files to approve | `["memory", "github"]` |

71| `disabledMcpjsonServers` | List of specific MCP servers from `.mcp.json` files to reject | `["filesystem"]` |169| `disabledMcpjsonServers` | List of specific MCP servers from `.mcp.json` files to reject | `["filesystem"]` |

72| `useEnterpriseMcpConfigOnly` | When set in managed-settings.json, restricts MCP servers to only those defined in managed-mcp.json. See [Enterprise MCP configuration](/en/docs/claude-code/mcp#enterprise-mcp-configuration) | `true` |170| `allowedMcpServers` | When set in managed-settings.json, allowlist of MCP servers users can configure. Undefined = no restrictions, empty array = lockdown. Applies to all scopes. Denylist takes precedence. See [Managed MCP configuration](/en/mcp#managed-mcp-configuration) | `[{ "serverName": "github" }]` |

73| `allowedMcpServers` | When set in managed-settings.json, allowlist of MCP servers users can configure. Undefined = no restrictions, empty array = lockdown. Applies to all scopes. Denylist takes precedence. See [Enterprise MCP configuration](/en/docs/claude-code/mcp#enterprise-mcp-configuration) | `[{ "serverName": "github" }]` |171| `deniedMcpServers` | When set in managed-settings.json, denylist of MCP servers that are explicitly blocked. Applies to all scopes including managed servers. Denylist takes precedence over allowlist. See [Managed MCP configuration](/en/mcp#managed-mcp-configuration) | `[{ "serverName": "filesystem" }]` |

74| `deniedMcpServers` | When set in managed-settings.json, denylist of MCP servers that are explicitly blocked. Applies to all scopes including enterprise servers. Denylist takes precedence over allowlist. See [Enterprise MCP configuration](/en/docs/claude-code/mcp#enterprise-mcp-configuration) | `[{ "serverName": "filesystem" }]` |172| `strictKnownMarketplaces` | When set in managed-settings.json, allowlist of plugin marketplaces users can add. Undefined = no restrictions, empty array = lockdown. Applies to marketplace additions only. See [Managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions) | `[{ "source": "github", "repo": "acme-corp/plugins" }]` |

75| `awsAuthRefresh` | Custom script that modifies the `.aws` directory (see [advanced credential configuration](/en/docs/claude-code/amazon-bedrock#advanced-credential-configuration)) | `aws sso login --profile myprofile` |173| `blockedMarketplaces` | (Managed settings only) Blocklist of marketplace sources. Blocked sources are checked before downloading, so they never touch the filesystem. See [Managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions) | `[{ "source": "github", "repo": "untrusted/plugins" }]` |

76| `awsCredentialExport` | Custom script that outputs JSON with AWS credentials (see [advanced credential configuration](/en/docs/claude-code/amazon-bedrock#advanced-credential-configuration)) | `/bin/generate_aws_grant.sh` |174| `awsAuthRefresh` | Custom script that modifies the `.aws` directory (see [advanced credential configuration](/en/amazon-bedrock#advanced-credential-configuration)) | `aws sso login --profile myprofile` |

175| `awsCredentialExport` | Custom script that outputs JSON with AWS credentials (see [advanced credential configuration](/en/amazon-bedrock#advanced-credential-configuration)) | `/bin/generate_aws_grant.sh` |

176| `alwaysThinkingEnabled` | Enable [extended thinking](/en/common-workflows#use-extended-thinking-thinking-mode) by default for all sessions. Typically configured via the `/config` command rather than editing directly | `true` |

177| `plansDirectory` | Customize where plan files are stored. Path is relative to project root. Default: `~/.claude/plans` | `"./plans"` |

178| `showTurnDuration` | Show turn duration messages after responses (e.g., "Cooked for 1m 6s"). Set to `false` to hide these messages | `true` |

179| `spinnerVerbs` | Customize the action verbs shown in the spinner and turn duration messages. Set `mode` to `"replace"` to use only your verbs, or `"append"` to add them to the defaults | `{"mode": "append", "verbs": ["Pondering", "Crafting"]}` |

180| `language` | Configure Claude's preferred response language (e.g., `"japanese"`, `"spanish"`, `"french"`). Claude will respond in this language by default | `"japanese"` |

181| `autoUpdatesChannel` | Release channel to follow for updates. Use `"stable"` for a version that is typically about one week old and skips versions with major regressions, or `"latest"` (default) for the most recent release | `"stable"` |

182| `spinnerTipsEnabled` | Show tips in the spinner while Claude is working. Set to `false` to disable tips (default: `true`) | `false` |

183| `spinnerTipsOverride` | Override spinner tips with custom strings. `tips`: array of tip strings. `excludeDefault`: if `true`, only show custom tips; if `false` or absent, custom tips are merged with built-in tips | `{ "excludeDefault": true, "tips": ["Use our internal tool X"] }` |

184| `terminalProgressBarEnabled` | Enable the terminal progress bar that shows progress in supported terminals like Windows Terminal and iTerm2 (default: `true`) | `false` |

185| `prefersReducedMotion` | Reduce or disable UI animations (spinners, shimmer, flash effects) for accessibility | `true` |

186| `teammateMode` | How [agent team](/en/agent-teams) teammates display: `auto` (picks split panes in tmux or iTerm2, in-process otherwise), `in-process`, or `tmux`. See [set up agent teams](/en/agent-teams#set-up-agent-teams) | `"in-process"` |

77 187 

78### Permission settings188### Permission settings

79 189 

80| Keys | Description | Example |190| Keys | Description | Example |

81| :----------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- |191| :----------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- |

82| `allow` | Array of [permission rules](/en/docs/claude-code/iam#configuring-permissions) to allow tool use. **Note:** Bash rules use prefix matching, not regex | `[ "Bash(git diff:*)" ]` |192| `allow` | Array of permission rules to allow tool use. See [Permission rule syntax](#permission-rule-syntax) below for pattern matching details | `[ "Bash(git diff *)" ]` |

83| `ask` | Array of [permission rules](/en/docs/claude-code/iam#configuring-permissions) to ask for confirmation upon tool use. | `[ "Bash(git push:*)" ]` |193| `ask` | Array of permission rules to ask for confirmation upon tool use. See [Permission rule syntax](#permission-rule-syntax) below | `[ "Bash(git push *)" ]` |

84| `deny` | Array of [permission rules](/en/docs/claude-code/iam#configuring-permissions) to deny tool use. Use this to also exclude sensitive files from Claude Code access. **Note:** Bash patterns are prefix matches and can be bypassed (see [Bash permission limitations](/en/docs/claude-code/iam#tool-specific-permission-rules)) | `[ "WebFetch", "Bash(curl:*)", "Read(./.env)", "Read(./secrets/**)" ]` |194| `deny` | Array of permission rules to deny tool use. Use this to exclude sensitive files from Claude Code access. See [Permission rule syntax](#permission-rule-syntax) and [Bash permission limitations](/en/permissions#tool-specific-permission-rules) | `[ "WebFetch", "Bash(curl *)", "Read(./.env)", "Read(./secrets/**)" ]` |

85| `additionalDirectories` | Additional [working directories](iam#working-directories) that Claude has access to | `[ "../docs/" ]` |195| `additionalDirectories` | Additional [working directories](/en/permissions#working-directories) that Claude has access to | `[ "../docs/" ]` |

86| `defaultMode` | Default [permission mode](iam#permission-modes) when opening Claude Code | `"acceptEdits"` |196| `defaultMode` | Default [permission mode](/en/permissions#permission-modes) when opening Claude Code | `"acceptEdits"` |

87| `disableBypassPermissionsMode` | Set to `"disable"` to prevent `bypassPermissions` mode from being activated. This disables the `--dangerously-skip-permissions` command-line flag. See [managed policy settings](iam#enterprise-managed-policy-settings) | `"disable"` |197| `disableBypassPermissionsMode` | Set to `"disable"` to prevent `bypassPermissions` mode from being activated. This disables the `--dangerously-skip-permissions` command-line flag. See [managed settings](/en/permissions#managed-only-settings) | `"disable"` |

198 

199### Permission rule syntax

200 

201Permission rules follow the format `Tool` or `Tool(specifier)`. Rules are evaluated in order: deny rules first, then ask, then allow. The first matching rule wins.

202 

203Quick examples:

204 

205| Rule | Effect |

206| :----------------------------- | :--------------------------------------- |

207| `Bash` | Matches all Bash commands |

208| `Bash(npm run *)` | Matches commands starting with `npm run` |

209| `Read(./.env)` | Matches reading the `.env` file |

210| `WebFetch(domain:example.com)` | Matches fetch requests to example.com |

211 

212For the complete rule syntax reference, including wildcard behavior, tool-specific patterns for Read, Edit, WebFetch, MCP, and Task rules, and security limitations of Bash patterns, see [Permission rule syntax](/en/permissions#permission-rule-syntax).

88 213 

89### Sandbox settings214### Sandbox settings

90 215 

91Configure advanced sandboxing behavior. Sandboxing isolates bash commands from your filesystem and network. See [Sandboxing](/en/docs/claude-code/sandboxing) for details.216Configure advanced sandboxing behavior. Sandboxing isolates bash commands from your filesystem and network. See [Sandboxing](/en/sandboxing) for details.

92 217 

93**Filesystem and network restrictions** are configured via Read, Edit, and WebFetch permission rules, not via these sandbox settings.218**Filesystem and network restrictions** are configured via Read, Edit, and WebFetch permission rules, not via these sandbox settings.

94 219 

95| Keys | Description | Example |220| Keys | Description | Example |

96| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------ |221| :-------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ |

97| `enabled` | Enable bash sandboxing (macOS/Linux only). Default: false | `true` |222| `enabled` | Enable bash sandboxing (macOS, Linux, and WSL2). Default: false | `true` |

98| `autoAllowBashIfSandboxed` | Auto-approve bash commands when sandboxed. Default: true | `true` |223| `autoAllowBashIfSandboxed` | Auto-approve bash commands when sandboxed. Default: true | `true` |

99| `excludedCommands` | Commands that should run outside of the sandbox | `["git", "docker"]` |224| `excludedCommands` | Commands that should run outside of the sandbox | `["git", "docker"]` |

100| `allowUnsandboxedCommands` | Allow commands to run outside the sandbox via the `dangerouslyDisableSandbox` parameter. When set to `false`, the `dangerouslyDisableSandbox` escape hatch is completely disabled and all commands must run sandboxed (or be in `excludedCommands`). Useful for enterprise policies that require strict sandboxing. Default: true | `false` |225| `allowUnsandboxedCommands` | Allow commands to run outside the sandbox via the `dangerouslyDisableSandbox` parameter. When set to `false`, the `dangerouslyDisableSandbox` escape hatch is completely disabled and all commands must run sandboxed (or be in `excludedCommands`). Useful for enterprise policies that require strict sandboxing. Default: true | `false` |

101| `network.allowUnixSockets` | Unix socket paths accessible in sandbox (for SSH agents, etc.) | `["~/.ssh/agent-socket"]` |226| `network.allowUnixSockets` | Unix socket paths accessible in sandbox (for SSH agents, etc.) | `["~/.ssh/agent-socket"]` |

102| `network.allowLocalBinding` | Allow binding to localhost ports (MacOS only). Default: false | `true` |227| `network.allowAllUnixSockets` | Allow all Unix socket connections in sandbox. Default: false | `true` |

228| `network.allowLocalBinding` | Allow binding to localhost ports (macOS only). Default: false | `true` |

229| `network.allowedDomains` | Array of domains to allow for outbound network traffic. Supports wildcards (e.g., `*.example.com`). | `["github.com", "*.npmjs.org"]` |

230| `network.allowManagedDomainsOnly` | (Managed settings only) Only `allowedDomains` and `WebFetch(domain:...)` allow rules from managed settings are respected. Domains from user, project, and local settings are ignored. Denied domains are still respected from all sources. Default: false | `true` |

103| `network.httpProxyPort` | HTTP proxy port used if you wish to bring your own proxy. If not specified, Claude will run its own proxy. | `8080` |231| `network.httpProxyPort` | HTTP proxy port used if you wish to bring your own proxy. If not specified, Claude will run its own proxy. | `8080` |

104| `network.socksProxyPort` | SOCKS5 proxy port used if you wish to bring your own proxy. If not specified, Claude will run its own proxy. | `8081` |232| `network.socksProxyPort` | SOCKS5 proxy port used if you wish to bring your own proxy. If not specified, Claude will run its own proxy. | `8081` |

105| `enableWeakerNestedSandbox` | Enable weaker sandbox for unprivileged Docker environments (Linux only). **Reduces security.** Default: false | `true` |233| `enableWeakerNestedSandbox` | Enable weaker sandbox for unprivileged Docker environments (Linux and WSL2 only). **Reduces security.** Default: false | `true` |

106 234 

107**Configuration example:**235**Configuration example:**

108 236 


113 "autoAllowBashIfSandboxed": true,241 "autoAllowBashIfSandboxed": true,

114 "excludedCommands": ["docker"],242 "excludedCommands": ["docker"],

115 "network": {243 "network": {

244 "allowedDomains": ["github.com", "*.npmjs.org", "registry.yarnpkg.com"],

116 "allowUnixSockets": [245 "allowUnixSockets": [

117 "/var/run/docker.sock"246 "/var/run/docker.sock"

118 ],247 ],


128}257}

129```258```

130 259 

131**Filesystem access** is controlled via Read/Edit permissions:260**Filesystem and network restrictions** use standard permission rules:

261 

262* Use `Read` deny rules to block Claude from reading specific files or directories

263* Use `Edit` allow rules to let Claude write to directories beyond the current working directory

264* Use `Edit` deny rules to block writes to specific paths

265* Use `WebFetch` allow/deny rules to control which network domains Claude can access

266 

267### Attribution settings

268 

269Claude Code adds attribution to git commits and pull requests. These are configured separately:

270 

271* Commits use [git trailers](https://git-scm.com/docs/git-interpret-trailers) (like `Co-Authored-By`) by default, which can be customized or disabled

272* Pull request descriptions are plain text

273 

274| Keys | Description |

275| :------- | :----------------------------------------------------------------------------------------- |

276| `commit` | Attribution for git commits, including any trailers. Empty string hides commit attribution |

277| `pr` | Attribution for pull request descriptions. Empty string hides pull request attribution |

278 

279**Default commit attribution:**

280 

281```

282🤖 Generated with [Claude Code](https://claude.com/claude-code)

283 

284 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

285```

286 

287**Default pull request attribution:**

288 

289```

290🤖 Generated with [Claude Code](https://claude.com/claude-code)

291```

292 

293**Example:**

294 

295```json theme={null}

296{

297 "attribution": {

298 "commit": "Generated with AI\n\nCo-Authored-By: AI <ai@example.com>",

299 "pr": ""

300 }

301}

302```

132 303 

133* Read deny rules block file reads in sandbox304<Note>

134* Edit allow rules permit file writes (in addition to the defaults, e.g. the current working directory)305 The `attribution` setting takes precedence over the deprecated `includeCoAuthoredBy` setting. To hide all attribution, set `commit` and `pr` to empty strings.

135* Edit deny rules block writes within allowed paths306</Note>

136 307 

137**Network access** is controlled via WebFetch permissions:308### File suggestion settings

138 309 

139* WebFetch allow rules permit network domains310Configure a custom command for `@` file path autocomplete. The built-in file suggestion uses fast filesystem traversal, but large monorepos may benefit from project-specific indexing such as a pre-built file index or custom tooling.

140* WebFetch deny rules block network domains311 

312```json theme={null}

313{

314 "fileSuggestion": {

315 "type": "command",

316 "command": "~/.claude/file-suggestion.sh"

317 }

318}

319```

320 

321The command runs with the same environment variables as [hooks](/en/hooks), including `CLAUDE_PROJECT_DIR`. It receives JSON via stdin with a `query` field:

322 

323```json theme={null}

324{"query": "src/comp"}

325```

326 

327Output newline-separated file paths to stdout (currently limited to 15):

328 

329```

330src/components/Button.tsx

331src/components/Modal.tsx

332src/components/Form.tsx

333```

334 

335**Example:**

336 

337```bash theme={null}

338#!/bin/bash

339query=$(cat | jq -r '.query')

340your-repo-file-index --query "$query" | head -20

341```

342 

343### Hook configuration

344 

345**Managed settings only**: Controls which hooks are allowed to run. This setting can only be configured in [managed settings](#settings-files) and provides administrators with strict control over hook execution.

346 

347**Behavior when `allowManagedHooksOnly` is `true`:**

348 

349* Managed hooks and SDK hooks are loaded

350* User hooks, project hooks, and plugin hooks are blocked

351 

352**Configuration:**

353 

354```json theme={null}

355{

356 "allowManagedHooksOnly": true

357}

358```

141 359 

142### Settings precedence360### Settings precedence

143 361 

144Settings are applied in order of precedence (highest to lowest):362Settings apply in order of precedence. From highest to lowest:

145 363 

1461. **Enterprise managed policies** (`managed-settings.json`)3641. **Managed settings** ([server-managed](/en/server-managed-settings), [MDM/OS-level policies](#configuration-scopes), or [managed settings](/en/settings#settings-files))

147 * Deployed by IT/DevOps365 * Policies deployed by IT through server delivery, MDM configuration profiles, registry policies, or managed settings files

148 * Cannot be overridden366 * Cannot be overridden by user or project settings

367 * Within the managed tier, precedence is: server-managed > MDM/OS-level policies > `managed-settings.json` > HKCU registry (Windows only). Only one managed source is used; sources do not merge.

149 368 

1502. **Command line arguments**3692. **Command line arguments**

151 * Temporary overrides for a specific session370 * Temporary overrides for a specific session


1595. **User settings** (`~/.claude/settings.json`)3785. **User settings** (`~/.claude/settings.json`)

160 * Personal global settings379 * Personal global settings

161 380 

162This hierarchy ensures that enterprise security policies are always enforced while still allowing teams and individuals to customize their experience.381This hierarchy ensures that organizational policies are always enforced while still allowing teams and individuals to customize their experience.

382 

383For example, if your user settings allow `Bash(npm run *)` but a project's shared settings deny it, the project setting takes precedence and the command is blocked.

384 

385### Verify active settings

386 

387Run `/status` inside Claude Code to see which settings sources are active and where they come from. The output shows each configuration layer (managed, user, project) along with its origin, such as `Enterprise managed settings (remote)`, `Enterprise managed settings (plist)`, `Enterprise managed settings (HKLM)`, or `Enterprise managed settings (file)`. If a settings file contains errors, `/status` reports the issue so you can fix it.

163 388 

164### Key points about the configuration system389### Key points about the configuration system

165 390 

166* **Memory files (CLAUDE.md)**: Contain instructions and context that Claude loads at startup391* **Memory files (`CLAUDE.md`)**: Contain instructions and context that Claude loads at startup

167* **Settings files (JSON)**: Configure permissions, environment variables, and tool behavior392* **Settings files (JSON)**: Configure permissions, environment variables, and tool behavior

168* **Slash commands**: Custom commands that can be invoked during a session with `/command-name`393* **Skills**: Custom prompts that can be invoked with `/skill-name` or loaded by Claude automatically

169* **MCP servers**: Extend Claude Code with additional tools and integrations394* **MCP servers**: Extend Claude Code with additional tools and integrations

170* **Precedence**: Higher-level configurations (Enterprise) override lower-level ones (User/Project)395* **Precedence**: Higher-level configurations (Managed) override lower-level ones (User/Project)

171* **Inheritance**: Settings are merged, with more specific settings adding to or overriding broader ones396* **Inheritance**: Settings are merged, with more specific settings adding to or overriding broader ones

172 397 

173### System prompt availability398### System prompt

174 399 

175<Note>400Claude Code's internal system prompt is not published. To add custom instructions, use `CLAUDE.md` files or the `--append-system-prompt` flag.

176 Unlike for claude.ai, we do not publish Claude Code's internal system prompt on this website. Use CLAUDE.md files or `--append-system-prompt` to add custom instructions to Claude Code's behavior.

177</Note>

178 401 

179### Excluding sensitive files402### Excluding sensitive files

180 403 

181To prevent Claude Code from accessing files containing sensitive information (e.g., API keys, secrets, environment files), use the `permissions.deny` setting in your `.claude/settings.json` file:404To prevent Claude Code from accessing files containing sensitive information like API keys, secrets, and environment files, use the `permissions.deny` setting in your `.claude/settings.json` file:

182 405 

183```json theme={null}406```json theme={null}

184{407{


194}417}

195```418```

196 419 

197This replaces the deprecated `ignorePatterns` configuration. Files matching these patterns will be completely invisible to Claude Code, preventing any accidental exposure of sensitive data.420This replaces the deprecated `ignorePatterns` configuration. Files matching these patterns are excluded from file discovery and search results, and read operations on these files are denied.

198 421 

199## Subagent configuration422## Subagent configuration

200 423 


203* **User subagents**: `~/.claude/agents/` - Available across all your projects426* **User subagents**: `~/.claude/agents/` - Available across all your projects

204* **Project subagents**: `.claude/agents/` - Specific to your project and can be shared with your team427* **Project subagents**: `.claude/agents/` - Specific to your project and can be shared with your team

205 428 

206Subagent files define specialized AI assistants with custom prompts and tool permissions. Learn more about creating and using subagents in the [subagents documentation](/en/docs/claude-code/sub-agents).429Subagent files define specialized AI assistants with custom prompts and tool permissions. Learn more about creating and using subagents in the [subagents documentation](/en/sub-agents).

207 430 

208## Plugin configuration431## Plugin configuration

209 432 

210Claude Code supports a plugin system that lets you extend functionality with custom commands, agents, hooks, and MCP servers. Plugins are distributed through marketplaces and can be configured at both user and repository levels.433Claude Code supports a plugin system that lets you extend functionality with skills, agents, hooks, and MCP servers. Plugins are distributed through marketplaces and can be configured at both user and repository levels.

211 434 

212### Plugin settings435### Plugin settings

213 436 


216```json theme={null}439```json theme={null}

217{440{

218 "enabledPlugins": {441 "enabledPlugins": {

219 "formatter@company-tools": true,442 "formatter@acme-tools": true,

220 "deployer@company-tools": true,443 "deployer@acme-tools": true,

221 "analyzer@security-plugins": false444 "analyzer@security-plugins": false

222 },445 },

223 "extraKnownMarketplaces": {446 "extraKnownMarketplaces": {

224 "company-tools": {447 "acme-tools": {

225 "source": "github",448 "source": "github",

226 "repo": "company/claude-plugins"449 "repo": "acme-corp/claude-plugins"

227 }450 }

228 }451 }

229}452}


267```json theme={null}490```json theme={null}

268{491{

269 "extraKnownMarketplaces": {492 "extraKnownMarketplaces": {

270 "company-tools": {493 "acme-tools": {

271 "source": {494 "source": {

272 "source": "github",495 "source": "github",

273 "repo": "company-org/claude-plugins"496 "repo": "acme-corp/claude-plugins"

274 }497 }

275 },498 },

276 "security-plugins": {499 "security-plugins": {

277 "source": {500 "source": {

278 "source": "git",501 "source": "git",

279 "url": "https://git.company.com/security/plugins.git"502 "url": "https://git.example.com/security/plugins.git"

280 }503 }

281 }504 }

282 }505 }


288* `github`: GitHub repository (uses `repo`)511* `github`: GitHub repository (uses `repo`)

289* `git`: Any git URL (uses `url`)512* `git`: Any git URL (uses `url`)

290* `directory`: Local filesystem path (uses `path`, for development only)513* `directory`: Local filesystem path (uses `path`, for development only)

514* `hostPattern`: regex pattern to match marketplace hosts (uses `hostPattern`)

515 

516#### `strictKnownMarketplaces`

517 

518**Managed settings only**: Controls which plugin marketplaces users are allowed to add. This setting can only be configured in [managed settings](/en/settings#settings-files) and provides administrators with strict control over marketplace sources.

519 

520**Managed settings file locations**:

521 

522* **macOS**: `/Library/Application Support/ClaudeCode/managed-settings.json`

523* **Linux and WSL**: `/etc/claude-code/managed-settings.json`

524* **Windows**: `C:\Program Files\ClaudeCode\managed-settings.json`

525 

526**Key characteristics**:

527 

528* Only available in managed settings (`managed-settings.json`)

529* Cannot be overridden by user or project settings (highest precedence)

530* Enforced BEFORE network/filesystem operations (blocked sources never execute)

531* Uses exact matching for source specifications (including `ref`, `path` for git sources), except `hostPattern`, which uses regex matching

532 

533**Allowlist behavior**:

534 

535* `undefined` (default): No restrictions - users can add any marketplace

536* Empty array `[]`: Complete lockdown - users cannot add any new marketplaces

537* List of sources: Users can only add marketplaces that match exactly

538 

539**All supported source types**:

540 

541The allowlist supports seven marketplace source types. Most sources use exact matching, while `hostPattern` uses regex matching against the marketplace host.

542 

5431. **GitHub repositories**:

544 

545```json theme={null}

546{ "source": "github", "repo": "acme-corp/approved-plugins" }

547{ "source": "github", "repo": "acme-corp/security-tools", "ref": "v2.0" }

548{ "source": "github", "repo": "acme-corp/plugins", "ref": "main", "path": "marketplace" }

549```

550 

551Fields: `repo` (required), `ref` (optional: branch/tag/SHA), `path` (optional: subdirectory)

552 

5532. **Git repositories**:

554 

555```json theme={null}

556{ "source": "git", "url": "https://gitlab.example.com/tools/plugins.git" }

557{ "source": "git", "url": "https://bitbucket.org/acme-corp/plugins.git", "ref": "production" }

558{ "source": "git", "url": "ssh://git@git.example.com/plugins.git", "ref": "v3.1", "path": "approved" }

559```

560 

561Fields: `url` (required), `ref` (optional: branch/tag/SHA), `path` (optional: subdirectory)

562 

5633. **URL-based marketplaces**:

564 

565```json theme={null}

566{ "source": "url", "url": "https://plugins.example.com/marketplace.json" }

567{ "source": "url", "url": "https://cdn.example.com/marketplace.json", "headers": { "Authorization": "Bearer ${TOKEN}" } }

568```

569 

570Fields: `url` (required), `headers` (optional: HTTP headers for authenticated access)

571 

572<Note>

573 URL-based marketplaces only download the `marketplace.json` file. They do not download plugin files from the server. Plugins in URL-based marketplaces must use external sources (GitHub, npm, or git URLs) rather than relative paths. For plugins with relative paths, use a Git-based marketplace instead. See [Troubleshooting](/en/plugin-marketplaces#plugins-with-relative-paths-fail-in-url-based-marketplaces) for details.

574</Note>

575 

5764. **NPM packages**:

577 

578```json theme={null}

579{ "source": "npm", "package": "@acme-corp/claude-plugins" }

580{ "source": "npm", "package": "@acme-corp/approved-marketplace" }

581```

582 

583Fields: `package` (required, supports scoped packages)

584 

5855. **File paths**:

586 

587```json theme={null}

588{ "source": "file", "path": "/usr/local/share/claude/acme-marketplace.json" }

589{ "source": "file", "path": "/opt/acme-corp/plugins/marketplace.json" }

590```

591 

592Fields: `path` (required: absolute path to marketplace.json file)

593 

5946. **Directory paths**:

595 

596```json theme={null}

597{ "source": "directory", "path": "/usr/local/share/claude/acme-plugins" }

598{ "source": "directory", "path": "/opt/acme-corp/approved-marketplaces" }

599```

600 

601Fields: `path` (required: absolute path to directory containing `.claude-plugin/marketplace.json`)

602 

6037. **Host pattern matching**:

604 

605```json theme={null}

606{ "source": "hostPattern", "hostPattern": "^github\\.example\\.com$" }

607{ "source": "hostPattern", "hostPattern": "^gitlab\\.internal\\.example\\.com$" }

608```

609 

610Fields: `hostPattern` (required: regex pattern to match against the marketplace host)

611 

612Use host pattern matching when you want to allow all marketplaces from a specific host without enumerating each repository individually. This is useful for organizations with internal GitHub Enterprise or GitLab servers where developers create their own marketplaces.

613 

614Host extraction by source type:

615 

616* `github`: always matches against `github.com`

617* `git`: extracts hostname from the URL (supports both HTTPS and SSH formats)

618* `url`: extracts hostname from the URL

619* `npm`, `file`, `directory`: not supported for host pattern matching

620 

621**Configuration examples**:

622 

623Example: allow specific marketplaces only:

624 

625```json theme={null}

626{

627 "strictKnownMarketplaces": [

628 {

629 "source": "github",

630 "repo": "acme-corp/approved-plugins"

631 },

632 {

633 "source": "github",

634 "repo": "acme-corp/security-tools",

635 "ref": "v2.0"

636 },

637 {

638 "source": "url",

639 "url": "https://plugins.example.com/marketplace.json"

640 },

641 {

642 "source": "npm",

643 "package": "@acme-corp/compliance-plugins"

644 }

645 ]

646}

647```

648 

649Example - Disable all marketplace additions:

650 

651```json theme={null}

652{

653 "strictKnownMarketplaces": []

654}

655```

656 

657Example: allow all marketplaces from an internal git server:

658 

659```json theme={null}

660{

661 "strictKnownMarketplaces": [

662 {

663 "source": "hostPattern",

664 "hostPattern": "^github\\.example\\.com$"

665 }

666 ]

667}

668```

669 

670**Exact matching requirements**:

671 

672Marketplace sources must match **exactly** for a user's addition to be allowed. For git-based sources (`github` and `git`), this includes all optional fields:

673 

674* The `repo` or `url` must match exactly

675* The `ref` field must match exactly (or both be undefined)

676* The `path` field must match exactly (or both be undefined)

677 

678Examples of sources that **do NOT match**:

679 

680```json theme={null}

681// These are DIFFERENT sources:

682{ "source": "github", "repo": "acme-corp/plugins" }

683{ "source": "github", "repo": "acme-corp/plugins", "ref": "main" }

684 

685// These are also DIFFERENT:

686{ "source": "github", "repo": "acme-corp/plugins", "path": "marketplace" }

687{ "source": "github", "repo": "acme-corp/plugins" }

688```

689 

690**Comparison with `extraKnownMarketplaces`**:

691 

692| Aspect | `strictKnownMarketplaces` | `extraKnownMarketplaces` |

693| --------------------- | ------------------------------------ | ------------------------------------ |

694| **Purpose** | Organizational policy enforcement | Team convenience |

695| **Settings file** | `managed-settings.json` only | Any settings file |

696| **Behavior** | Blocks non-allowlisted additions | Auto-installs missing marketplaces |

697| **When enforced** | Before network/filesystem operations | After user trust prompt |

698| **Can be overridden** | No (highest precedence) | Yes (by higher precedence settings) |

699| **Source format** | Direct source object | Named marketplace with nested source |

700| **Use case** | Compliance, security restrictions | Onboarding, standardization |

701 

702**Format difference**:

703 

704`strictKnownMarketplaces` uses direct source objects:

705 

706```json theme={null}

707{

708 "strictKnownMarketplaces": [

709 { "source": "github", "repo": "acme-corp/plugins" }

710 ]

711}

712```

713 

714`extraKnownMarketplaces` requires named marketplaces:

715 

716```json theme={null}

717{

718 "extraKnownMarketplaces": {

719 "acme-tools": {

720 "source": { "source": "github", "repo": "acme-corp/plugins" }

721 }

722 }

723}

724```

725 

726**Important notes**:

727 

728* Restrictions are checked BEFORE any network requests or filesystem operations

729* When blocked, users see clear error messages indicating the source is blocked by managed policy

730* The restriction applies only to adding NEW marketplaces; previously installed marketplaces remain accessible

731* Managed settings have the highest precedence and cannot be overridden

732 

733See [Managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions) for user-facing documentation.

291 734 

292### Managing plugins735### Managing plugins

293 736 


299* View plugin details (commands, agents, hooks provided)742* View plugin details (commands, agents, hooks provided)

300* Add/remove marketplaces743* Add/remove marketplaces

301 744 

302Learn more about the plugin system in the [plugins documentation](/en/docs/claude-code/plugins).745Learn more about the plugin system in the [plugins documentation](/en/plugins).

303 746 

304## Environment variables747## Environment variables

305 748 


309 All environment variables can also be configured in [`settings.json`](#available-settings). This is useful as a way to automatically set environment variables for each session, or to roll out a set of environment variables for your whole team or organization.752 All environment variables can also be configured in [`settings.json`](#available-settings). This is useful as a way to automatically set environment variables for each session, or to roll out a set of environment variables for your whole team or organization.

310</Note>753</Note>

311 754 

312| Variable | Purpose |755| Variable | Purpose | |

313| :----------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |756| :--------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- |

314| `ANTHROPIC_API_KEY` | API key sent as `X-Api-Key` header, typically for the Claude SDK (for interactive usage, run `/login`) |757| `ANTHROPIC_API_KEY` | API key sent as `X-Api-Key` header, typically for the Claude SDK (for interactive usage, run `/login`) | |

315| `ANTHROPIC_AUTH_TOKEN` | Custom value for the `Authorization` header (the value you set here will be prefixed with `Bearer `) |758| `ANTHROPIC_AUTH_TOKEN` | Custom value for the `Authorization` header (the value you set here will be prefixed with `Bearer `) | |

316| `ANTHROPIC_CUSTOM_HEADERS` | Custom headers you want to add to the request (in `Name: Value` format) |759| `ANTHROPIC_CUSTOM_HEADERS` | Custom headers to add to requests (`Name: Value` format, newline-separated for multiple headers) | |

317| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | See [Model configuration](/en/docs/claude-code/model-config#environment-variables) |760| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | See [Model configuration](/en/model-config#environment-variables) | |

318| `ANTHROPIC_DEFAULT_OPUS_MODEL` | See [Model configuration](/en/docs/claude-code/model-config#environment-variables) |761| `ANTHROPIC_DEFAULT_OPUS_MODEL` | See [Model configuration](/en/model-config#environment-variables) | |

319| `ANTHROPIC_DEFAULT_SONNET_MODEL` | See [Model configuration](/en/docs/claude-code/model-config#environment-variables) |762| `ANTHROPIC_DEFAULT_SONNET_MODEL` | See [Model configuration](/en/model-config#environment-variables) | |

320| `ANTHROPIC_MODEL` | Name of the model setting to use (see [Model Configuration](/en/docs/claude-code/model-config#environment-variables)) |763| `ANTHROPIC_FOUNDRY_API_KEY` | API key for Microsoft Foundry authentication (see [Microsoft Foundry](/en/microsoft-foundry)) | |

321| `ANTHROPIC_SMALL_FAST_MODEL` | \[DEPRECATED] Name of [Haiku-class model for background tasks](/en/docs/claude-code/costs) |764| `ANTHROPIC_FOUNDRY_BASE_URL` | Full base URL for the Foundry resource (for example, `https://my-resource.services.ai.azure.com/anthropic`). Alternative to `ANTHROPIC_FOUNDRY_RESOURCE` (see [Microsoft Foundry](/en/microsoft-foundry)) | |

322| `ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION` | Override AWS region for the Haiku-class model when using Bedrock |765| `ANTHROPIC_FOUNDRY_RESOURCE` | Foundry resource name (for example, `my-resource`). Required if `ANTHROPIC_FOUNDRY_BASE_URL` is not set (see [Microsoft Foundry](/en/microsoft-foundry)) | |

323| `AWS_BEARER_TOKEN_BEDROCK` | Bedrock API key for authentication (see [Bedrock API keys](https://aws.amazon.com/blogs/machine-learning/accelerate-ai-development-with-amazon-bedrock-api-keys/)) |766| `ANTHROPIC_MODEL` | Name of the model setting to use (see [Model Configuration](/en/model-config#environment-variables)) | |

324| `BASH_DEFAULT_TIMEOUT_MS` | Default timeout for long-running bash commands |767| `ANTHROPIC_SMALL_FAST_MODEL` | \[DEPRECATED] Name of [Haiku-class model for background tasks](/en/costs) | |

325| `BASH_MAX_OUTPUT_LENGTH` | Maximum number of characters in bash outputs before they are middle-truncated |768| `ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION` | Override AWS region for the Haiku-class model when using Bedrock | |

326| `BASH_MAX_TIMEOUT_MS` | Maximum timeout the model can set for long-running bash commands |769| `AWS_BEARER_TOKEN_BEDROCK` | Bedrock API key for authentication (see [Bedrock API keys](https://aws.amazon.com/blogs/machine-learning/accelerate-ai-development-with-amazon-bedrock-api-keys/)) | |

327| `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` | Return to the original working directory after each Bash command |770| `BASH_DEFAULT_TIMEOUT_MS` | Default timeout for long-running bash commands | |

328| `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` | Interval in milliseconds at which credentials should be refreshed (when using `apiKeyHelper`) |771| `BASH_MAX_OUTPUT_LENGTH` | Maximum number of characters in bash outputs before they are middle-truncated | |

329| `CLAUDE_CODE_CLIENT_CERT` | Path to client certificate file for mTLS authentication |772| `BASH_MAX_TIMEOUT_MS` | Maximum timeout the model can set for long-running bash commands | |

330| `CLAUDE_CODE_CLIENT_KEY_PASSPHRASE` | Passphrase for encrypted CLAUDE\_CODE\_CLIENT\_KEY (optional) |773| `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` | Set the percentage of context capacity (1-100) at which auto-compaction triggers. By default, auto-compaction triggers at approximately 95% capacity. Use lower values like `50` to compact earlier. Values above the default threshold have no effect. Applies to both main conversations and subagents. This percentage aligns with the `context_window.used_percentage` field available in [status line](/en/statusline) | |

331| `CLAUDE_CODE_CLIENT_KEY` | Path to client private key file for mTLS authentication |774| `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` | Return to the original working directory after each Bash command | |

332| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | Equivalent of setting `DISABLE_AUTOUPDATER`, `DISABLE_BUG_COMMAND`, `DISABLE_ERROR_REPORTING`, and `DISABLE_TELEMETRY` |775| `CLAUDE_CODE_ACCOUNT_UUID` | Account UUID for the authenticated user. Used by SDK callers to provide account information synchronously, avoiding a race condition where early telemetry events lack account metadata. Requires `CLAUDE_CODE_USER_EMAIL` and `CLAUDE_CODE_ORGANIZATION_UUID` to also be set | |

333| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | Set to `1` to disable automatic terminal title updates based on conversation context |776| `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD` | Set to `1` to load CLAUDE.md files from directories specified with `--add-dir`. By default, additional directories do not load memory files | `1` |

334| `CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL` | Skip auto-installation of IDE extensions |777| `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` | Interval in milliseconds at which credentials should be refreshed (when using `apiKeyHelper`) | |

335| `CLAUDE_CODE_MAX_OUTPUT_TOKENS` | Set the maximum number of output tokens for most requests |778| `CLAUDE_CODE_CLIENT_CERT` | Path to client certificate file for mTLS authentication | |

336| `CLAUDE_CODE_SKIP_BEDROCK_AUTH` | Skip AWS authentication for Bedrock (e.g. when using an LLM gateway) |779| `CLAUDE_CODE_CLIENT_KEY` | Path to client private key file for mTLS authentication | |

337| `CLAUDE_CODE_SKIP_VERTEX_AUTH` | Skip Google authentication for Vertex (e.g. when using an LLM gateway) |780| `CLAUDE_CODE_CLIENT_KEY_PASSPHRASE` | Passphrase for encrypted CLAUDE\_CODE\_CLIENT\_KEY (optional) | |

338| `CLAUDE_CODE_SUBAGENT_MODEL` | See [Model configuration](/en/docs/claude-code/model-config) |781| `CLAUDE_CODE_DISABLE_1M_CONTEXT` | Set to `1` to disable [1M context window](/en/model-config#extended-context) support. When set, 1M model variants are unavailable in the model picker. Useful for enterprise environments with compliance requirements | |

339| `CLAUDE_CODE_USE_BEDROCK` | Use [Bedrock](/en/docs/claude-code/amazon-bedrock) |782| `CLAUDE_CODE_DISABLE_AUTO_MEMORY` | Set to `1` to disable [auto memory](/en/memory#auto-memory). Set to `0` to force auto memory on during the gradual rollout. When disabled, Claude does not create or load auto memory files | |

340| `CLAUDE_CODE_USE_VERTEX` | Use [Vertex](/en/docs/claude-code/google-vertex-ai) |783| `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` | Set to `1` to disable all background task functionality, including the `run_in_background` parameter on Bash and subagent tools, auto-backgrounding, and the Ctrl+B shortcut | |

341| `DISABLE_AUTOUPDATER` | Set to `1` to disable automatic updates. This takes precedence over the `autoUpdates` configuration setting. |784| `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS` | Set to `1` to disable Anthropic API-specific `anthropic-beta` headers. Use this if experiencing issues like "Unexpected value(s) for the `anthropic-beta` header" when using an LLM gateway with third-party providers | |

342| `DISABLE_BUG_COMMAND` | Set to `1` to disable the `/bug` command |785| `CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY` | Set to `1` to disable the "How is Claude doing?" session quality surveys. Also disabled when using third-party providers or when telemetry is disabled. See [Session quality surveys](/en/data-usage#session-quality-surveys) | |

343| `DISABLE_COST_WARNINGS` | Set to `1` to disable cost warning messages |786| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | Equivalent of setting `DISABLE_AUTOUPDATER`, `DISABLE_BUG_COMMAND`, `DISABLE_ERROR_REPORTING`, and `DISABLE_TELEMETRY` | |

344| `DISABLE_ERROR_REPORTING` | Set to `1` to opt out of Sentry error reporting |787| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | Set to `1` to disable automatic terminal title updates based on conversation context | |

345| `DISABLE_NON_ESSENTIAL_MODEL_CALLS` | Set to `1` to disable model calls for non-critical paths like flavor text |788| `CLAUDE_CODE_EFFORT_LEVEL` | Set the effort level for supported models. Values: `low`, `medium`, `high` (default). Lower effort is faster and cheaper, higher effort provides deeper reasoning. Currently supported with Opus 4.6 only. See [Adjust effort level](/en/model-config#adjust-effort-level) | |

346| `DISABLE_PROMPT_CACHING` | Set to `1` to disable prompt caching for all models (takes precedence over per-model settings) |789| `CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION` | Set to `false` to disable prompt suggestions (the "Prompt suggestions" toggle in `/config`). These are the grayed-out predictions that appear in your prompt input after Claude responds. See [Prompt suggestions](/en/interactive-mode#prompt-suggestions) | |

347| `DISABLE_PROMPT_CACHING_HAIKU` | Set to `1` to disable prompt caching for Haiku models |790| `CLAUDE_CODE_ENABLE_TASKS` | Set to `false` to temporarily revert to the previous TODO list instead of the task tracking system. Default: `true`. See [Task list](/en/interactive-mode#task-list) | |

348| `DISABLE_PROMPT_CACHING_OPUS` | Set to `1` to disable prompt caching for Opus models |791| `CLAUDE_CODE_ENABLE_TELEMETRY` | Set to `1` to enable OpenTelemetry data collection for metrics and logging. Required before configuring OTel exporters. See [Monitoring](/en/monitoring-usage) | |

349| `DISABLE_PROMPT_CACHING_SONNET` | Set to `1` to disable prompt caching for Sonnet models |792| `CLAUDE_CODE_EXIT_AFTER_STOP_DELAY` | Time in milliseconds to wait after the query loop becomes idle before automatically exiting. Useful for automated workflows and scripts using SDK mode | |

350| `DISABLE_TELEMETRY` | Set to `1` to opt out of Statsig telemetry (note that Statsig events do not include user data like code, file paths, or bash commands) |793| `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | Set to `1` to enable [agent teams](/en/agent-teams). Agent teams are experimental and disabled by default | |

351| `HTTP_PROXY` | Specify HTTP proxy server for network connections |794| `CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS` | Override the default token limit for file reads. Useful when you need to read larger files in full | |

352| `HTTPS_PROXY` | Specify HTTPS proxy server for network connections |795| `CLAUDE_CODE_HIDE_ACCOUNT_INFO` | Set to `1` to hide your email address and organization name from the Claude Code UI. Useful when streaming or recording | |

353| `MAX_MCP_OUTPUT_TOKENS` | Maximum number of tokens allowed in MCP tool responses. Claude Code displays a warning when output exceeds 10,000 tokens (default: 25000) |796| `CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL` | Skip auto-installation of IDE extensions | |

354| `MAX_THINKING_TOKENS` | Enable [extended thinking](/en/docs/build-with-claude/extended-thinking) and set the token budget for the thinking process. Extended thinking improves performance on complex reasoning and coding tasks but impacts [prompt caching efficiency](/en/docs/build-with-claude/prompt-caching#caching-with-thinking-blocks). Disabled by default. |797| `CLAUDE_CODE_MAX_OUTPUT_TOKENS` | Set the maximum number of output tokens for most requests. Default: 32,000. Maximum: 64,000. Increasing this value reduces the effective context window available before [auto-compaction](/en/costs#reduce-token-usage) triggers. | |

355| `MCP_TIMEOUT` | Timeout in milliseconds for MCP server startup |798| `CLAUDE_CODE_ORGANIZATION_UUID` | Organization UUID for the authenticated user. Used by SDK callers to provide account information synchronously. Requires `CLAUDE_CODE_ACCOUNT_UUID` and `CLAUDE_CODE_USER_EMAIL` to also be set | |

356| `MCP_TOOL_TIMEOUT` | Timeout in milliseconds for MCP tool execution |799| `CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS` | Interval for refreshing dynamic OpenTelemetry headers in milliseconds (default: 1740000 / 29 minutes). See [Dynamic headers](/en/monitoring-usage#dynamic-headers) | |

357| `NO_PROXY` | List of domains and IPs to which requests will be directly issued, bypassing proxy |800| `CLAUDE_CODE_PLAN_MODE_REQUIRED` | Auto-set to `true` on [agent team](/en/agent-teams) teammates that require plan approval. Read-only: set by Claude Code when spawning teammates. See [require plan approval](/en/agent-teams#require-plan-approval-for-teammates) | |

358| `SLASH_COMMAND_TOOL_CHAR_BUDGET` | Maximum number of characters for slash command metadata shown to [SlashCommand tool](/en/docs/claude-code/slash-commands#slashcommand-tool) (default: 15000) |801| `CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS` | Timeout in milliseconds for git operations when installing or updating plugins (default: 120000). Increase this value for large repositories or slow network connections. See [Git operations time out](/en/plugin-marketplaces#git-operations-time-out) | |

359| `USE_BUILTIN_RIPGREP` | Set to `0` to use system-installed `rg` intead of `rg` included with Claude Code |802| `CLAUDE_CODE_PROXY_RESOLVES_HOSTS` | Set to `true` to allow the proxy to perform DNS resolution instead of the caller. Opt-in for environments where the proxy should handle hostname resolution | |

360| `VERTEX_REGION_CLAUDE_3_5_HAIKU` | Override region for Claude 3.5 Haiku when using Vertex AI |803| `CLAUDE_CODE_SHELL` | Override automatic shell detection. Useful when your login shell differs from your preferred working shell (for example, `bash` vs `zsh`) | |

361| `VERTEX_REGION_CLAUDE_3_7_SONNET` | Override region for Claude 3.7 Sonnet when using Vertex AI |804| `CLAUDE_CODE_SHELL_PREFIX` | Command prefix to wrap all bash commands (for example, for logging or auditing). Example: `/path/to/logger.sh` will execute `/path/to/logger.sh <command>` | |

362| `VERTEX_REGION_CLAUDE_4_0_OPUS` | Override region for Claude 4.0 Opus when using Vertex AI |805| `CLAUDE_CODE_SIMPLE` | Set to `1` to run with a minimal system prompt and only the Bash, file read, and file edit tools. Disables MCP tools, attachments, hooks, and CLAUDE.md files | |

363| `VERTEX_REGION_CLAUDE_4_0_SONNET` | Override region for Claude 4.0 Sonnet when using Vertex AI |806| `CLAUDE_CODE_SKIP_BEDROCK_AUTH` | Skip AWS authentication for Bedrock (for example, when using an LLM gateway) | |

364| `VERTEX_REGION_CLAUDE_4_1_OPUS` | Override region for Claude 4.1 Opus when using Vertex AI |807| `CLAUDE_CODE_SKIP_FOUNDRY_AUTH` | Skip Azure authentication for Microsoft Foundry (for example, when using an LLM gateway) | |

808| `CLAUDE_CODE_SKIP_VERTEX_AUTH` | Skip Google authentication for Vertex (for example, when using an LLM gateway) | |

809| `CLAUDE_CODE_SUBAGENT_MODEL` | See [Model configuration](/en/model-config) | |

810| `CLAUDE_CODE_TASK_LIST_ID` | Share a task list across sessions. Set the same ID in multiple Claude Code instances to coordinate on a shared task list. See [Task list](/en/interactive-mode#task-list) | |

811| `CLAUDE_CODE_TEAM_NAME` | Name of the agent team this teammate belongs to. Set automatically on [agent team](/en/agent-teams) members | |

812| `CLAUDE_CODE_TMPDIR` | Override the temp directory used for internal temp files. Claude Code appends `/claude/` to this path. Default: `/tmp` on Unix/macOS, `os.tmpdir()` on Windows | |

813| `CLAUDE_CODE_USER_EMAIL` | Email address for the authenticated user. Used by SDK callers to provide account information synchronously. Requires `CLAUDE_CODE_ACCOUNT_UUID` and `CLAUDE_CODE_ORGANIZATION_UUID` to also be set | |

814| `CLAUDE_CODE_USE_BEDROCK` | Use [Bedrock](/en/amazon-bedrock) | |

815| `CLAUDE_CODE_USE_FOUNDRY` | Use [Microsoft Foundry](/en/microsoft-foundry) | |

816| `CLAUDE_CODE_USE_VERTEX` | Use [Vertex](/en/google-vertex-ai) | |

817| `CLAUDE_CONFIG_DIR` | Customize where Claude Code stores its configuration and data files | |

818| `DISABLE_AUTOUPDATER` | Set to `1` to disable automatic updates. | |

819| `DISABLE_BUG_COMMAND` | Set to `1` to disable the `/bug` command | |

820| `DISABLE_COST_WARNINGS` | Set to `1` to disable cost warning messages | |

821| `DISABLE_ERROR_REPORTING` | Set to `1` to opt out of Sentry error reporting | |

822| `DISABLE_INSTALLATION_CHECKS` | Set to `1` to disable installation warnings. Use only when manually managing the installation location, as this can mask issues with standard installations | |

823| `DISABLE_NON_ESSENTIAL_MODEL_CALLS` | Set to `1` to disable model calls for non-critical paths like flavor text | |

824| `DISABLE_PROMPT_CACHING` | Set to `1` to disable prompt caching for all models (takes precedence over per-model settings) | |

825| `DISABLE_PROMPT_CACHING_HAIKU` | Set to `1` to disable prompt caching for Haiku models | |

826| `DISABLE_PROMPT_CACHING_OPUS` | Set to `1` to disable prompt caching for Opus models | |

827| `DISABLE_PROMPT_CACHING_SONNET` | Set to `1` to disable prompt caching for Sonnet models | |

828| `DISABLE_TELEMETRY` | Set to `1` to opt out of Statsig telemetry (note that Statsig events do not include user data like code, file paths, or bash commands) | |

829| `ENABLE_TOOL_SEARCH` | Controls [MCP tool search](/en/mcp#scale-with-mcp-tool-search). Values: `auto` (default, enables at 10% context), `auto:N` (custom threshold, e.g., `auto:5` for 5%), `true` (always on), `false` (disabled) | |

830| `FORCE_AUTOUPDATE_PLUGINS` | Set to `true` to force plugin auto-updates even when the main auto-updater is disabled via `DISABLE_AUTOUPDATER` | |

831| `HTTP_PROXY` | Specify HTTP proxy server for network connections | |

832| `HTTPS_PROXY` | Specify HTTPS proxy server for network connections | |

833| `IS_DEMO` | Set to `true` to enable demo mode: hides email and organization from the UI, skips onboarding, and hides internal commands. Useful for streaming or recording sessions | |

834| `MAX_MCP_OUTPUT_TOKENS` | Maximum number of tokens allowed in MCP tool responses. Claude Code displays a warning when output exceeds 10,000 tokens (default: 25000) | |

835| `MAX_THINKING_TOKENS` | Override the [extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) token budget. Thinking is enabled at max budget (31,999 tokens) by default. Use this to limit the budget (for example, `MAX_THINKING_TOKENS=10000`) or disable thinking entirely (`MAX_THINKING_TOKENS=0`). For Opus 4.6, thinking depth is controlled by [effort level](/en/model-config#adjust-effort-level) instead, and this variable is ignored unless set to `0` to disable thinking. | |

836| `MCP_CLIENT_SECRET` | OAuth client secret for MCP servers that require [pre-configured credentials](/en/mcp#use-pre-configured-oauth-credentials). Avoids the interactive prompt when adding a server with `--client-secret` | |

837| `MCP_OAUTH_CALLBACK_PORT` | Fixed port for the OAuth redirect callback, as an alternative to `--callback-port` when adding an MCP server with [pre-configured credentials](/en/mcp#use-pre-configured-oauth-credentials) | |

838| `MCP_TIMEOUT` | Timeout in milliseconds for MCP server startup | |

839| `MCP_TOOL_TIMEOUT` | Timeout in milliseconds for MCP tool execution | |

840| `NO_PROXY` | List of domains and IPs to which requests will be directly issued, bypassing proxy | |

841| `SLASH_COMMAND_TOOL_CHAR_BUDGET` | Override the character budget for skill metadata shown to the [Skill tool](/en/skills#control-who-invokes-a-skill). The budget scales dynamically at 2% of the context window, with a fallback of 16,000 characters. Legacy name kept for backwards compatibility | |

842| `USE_BUILTIN_RIPGREP` | Set to `0` to use system-installed `rg` instead of `rg` included with Claude Code | |

843| `VERTEX_REGION_CLAUDE_3_5_HAIKU` | Override region for Claude 3.5 Haiku when using Vertex AI | |

844| `VERTEX_REGION_CLAUDE_3_7_SONNET` | Override region for Claude 3.7 Sonnet when using Vertex AI | |

845| `VERTEX_REGION_CLAUDE_4_0_OPUS` | Override region for Claude 4.0 Opus when using Vertex AI | |

846| `VERTEX_REGION_CLAUDE_4_0_SONNET` | Override region for Claude 4.0 Sonnet when using Vertex AI | |

847| `VERTEX_REGION_CLAUDE_4_1_OPUS` | Override region for Claude 4.1 Opus when using Vertex AI | |

365 848 

366## Tools available to Claude849## Tools available to Claude

367 850 

368Claude Code has access to a set of powerful tools that help it understand and modify your codebase:851Claude Code has access to a set of powerful tools that help it understand and modify your codebase:

369 852 

370| Tool | Description | Permission Required |853| Tool | Description | Permission Required |

371| :--------------- | :----------------------------------------------------------------------------------- | :------------------ |854| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------ |

372| **Bash** | Executes shell commands in your environment | Yes |855| **AskUserQuestion** | Asks multiple-choice questions to gather requirements or clarify ambiguity | No |

856| **Bash** | Executes shell commands in your environment (see [Bash tool behavior](#bash-tool-behavior) below) | Yes |

857| **TaskOutput** | Retrieves output from a background task (bash shell or subagent) | No |

373| **Edit** | Makes targeted edits to specific files | Yes |858| **Edit** | Makes targeted edits to specific files | Yes |

859| **ExitPlanMode** | Prompts the user to exit plan mode and start coding | Yes |

374| **Glob** | Finds files based on pattern matching | No |860| **Glob** | Finds files based on pattern matching | No |

375| **Grep** | Searches for patterns in file contents | No |861| **Grep** | Searches for patterns in file contents | No |

862| **KillShell** | Kills a running background bash shell by its ID | No |

863| **MCPSearch** | Searches for and loads MCP tools when [tool search](/en/mcp#scale-with-mcp-tool-search) is enabled | No |

376| **NotebookEdit** | Modifies Jupyter notebook cells | Yes |864| **NotebookEdit** | Modifies Jupyter notebook cells | Yes |

377| **NotebookRead** | Reads and displays Jupyter notebook contents | No |

378| **Read** | Reads the contents of files | No |865| **Read** | Reads the contents of files | No |

379| **SlashCommand** | Runs a [custom slash command](/en/docs/claude-code/slash-commands#slashcommand-tool) | Yes |866| **Skill** | Executes a [skill](/en/skills#control-who-invokes-a-skill) within the main conversation | Yes |

380| **Task** | Runs a sub-agent to handle complex, multi-step tasks | No |867| **Task** | Runs a sub-agent to handle complex, multi-step tasks | No |

381| **TodoWrite** | Creates and manages structured task lists | No |868| **TaskCreate** | Creates a new task in the task list | No |

869| **TaskGet** | Retrieves full details for a specific task | No |

870| **TaskList** | Lists all tasks with their current status | No |

871| **TaskUpdate** | Updates task status, dependencies, details, or deletes tasks | No |

382| **WebFetch** | Fetches content from a specified URL | Yes |872| **WebFetch** | Fetches content from a specified URL | Yes |

383| **WebSearch** | Performs web searches with domain filtering | Yes |873| **WebSearch** | Performs web searches with domain filtering | Yes |

384| **Write** | Creates or overwrites files | Yes |874| **Write** | Creates or overwrites files | Yes |

875| **LSP** | Code intelligence via language servers. Reports type errors and warnings automatically after file edits. Also supports navigation operations: jump to definitions, find references, get type info, list symbols, find implementations, trace call hierarchies. Requires a [code intelligence plugin](/en/discover-plugins#code-intelligence) and its language server binary | No |

876 

877Permission rules can be configured using `/allowed-tools` or in [permission settings](/en/settings#available-settings). Also see [Tool-specific permission rules](/en/permissions#tool-specific-permission-rules).

878 

879### Bash tool behavior

880 

881The Bash tool executes shell commands with the following persistence behavior:

882 

883* **Working directory persists**: When Claude changes the working directory (for example, `cd /path/to/dir`), subsequent Bash commands will execute in that directory. You can use `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR=1` to reset to the project directory after each command.

884* **Environment variables do NOT persist**: Environment variables set in one Bash command (for example, `export MY_VAR=value`) are **not** available in subsequent Bash commands. Each Bash command runs in a fresh shell environment.

885 

886To make environment variables available in Bash commands, you have **three options**:

887 

888**Option 1: Activate environment before starting Claude Code** (simplest approach)

889 

890Activate your virtual environment in your terminal before launching Claude Code:

891 

892```bash theme={null}

893conda activate myenv

894# or: source /path/to/venv/bin/activate

895claude

896```

897 

898This works for shell environments but environment variables set within Claude's Bash commands will not persist between commands.

899 

900**Option 2: Set CLAUDE\_ENV\_FILE before starting Claude Code** (persistent environment setup)

901 

902Export the path to a shell script containing your environment setup:

903 

904```bash theme={null}

905export CLAUDE_ENV_FILE=/path/to/env-setup.sh

906claude

907```

908 

909Where `/path/to/env-setup.sh` contains:

910 

911```bash theme={null}

912conda activate myenv

913# or: source /path/to/venv/bin/activate

914# or: export MY_VAR=value

915```

916 

917Claude Code will source this file before each Bash command, making the environment persistent across all commands.

918 

919**Option 3: Use a SessionStart hook** (project-specific configuration)

920 

921Configure in `.claude/settings.json`:

922 

923```json theme={null}

924{

925 "hooks": {

926 "SessionStart": [{

927 "matcher": "startup",

928 "hooks": [{

929 "type": "command",

930 "command": "echo 'conda activate myenv' >> \"$CLAUDE_ENV_FILE\""

931 }]

932 }]

933 }

934}

935```

936 

937The hook writes to `$CLAUDE_ENV_FILE`, which is then sourced before each Bash command. This is ideal for team-shared project configurations.

385 938 

386Permission rules can be configured using `/allowed-tools` or in [permission settings](/en/docs/claude-code/settings#available-settings). Also see [Tool-specific permission rules](/en/docs/claude-code/iam#tool-specific-permission-rules).939See [SessionStart hooks](/en/hooks#persist-environment-variables) for more details on Option 3.

387 940 

388### Extending tools with hooks941### Extending tools with hooks

389 942 

390You can run custom commands before or after any tool executes using943You can run custom commands before or after any tool executes using

391[Claude Code hooks](/en/docs/claude-code/hooks-guide).944[Claude Code hooks](/en/hooks-guide).

392 945 

393For example, you could automatically run a Python formatter after Claude946For example, you could automatically run a Python formatter after Claude

394modifies Python files, or prevent modifications to production configuration947modifies Python files, or prevent modifications to production configuration


396 949 

397## See also950## See also

398 951 

399* [Identity and Access Management](/en/docs/claude-code/iam#configuring-permissions) - Learn about Claude Code's permission system952* [Permissions](/en/permissions): permission system, rule syntax, tool-specific patterns, and managed policies

400* [IAM and access control](/en/docs/claude-code/iam#enterprise-managed-policy-settings) - Enterprise policy management953* [Authentication](/en/authentication): set up user access to Claude Code

401* [Troubleshooting](/en/docs/claude-code/troubleshooting#auto-updater-issues) - Solutions for common configuration issues954* [Troubleshooting](/en/troubleshooting): solutions for common configuration issues

setup.md +299 −109

Details

1# Set up Claude Code1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Install, authenticate, and start using Claude Code on your development machine.5# Advanced setup

6 

7> System requirements, platform-specific installation, version management, and uninstallation for Claude Code.

8 

9This page covers system requirements, platform-specific installation details, updates, and uninstallation. For a guided walkthrough of your first session, see the [quickstart](/en/quickstart). If you've never used a terminal before, see the [terminal guide](/en/terminal-guide).

4 10 

5## System requirements11## System requirements

6 12 

7* **Operating Systems**: macOS 10.15+, Ubuntu 20.04+/Debian 10+, or Windows 10+ (with WSL 1, WSL 2, or Git for Windows)13Claude Code runs on the following platforms and configurations:

8* **Hardware**: 4GB+ RAM14 

9* **Software**: [Node.js 18+](https://nodejs.org/en/download) (only required for NPM installation)15* **Operating system**:

10* **Network**: Internet connection required for authentication and AI processing16 * macOS 13.0+

11* **Shell**: Works best in Bash, Zsh or Fish17 * Windows 10 1809+ or Windows Server 2019+

18 * Ubuntu 20.04+

19 * Debian 10+

20 * Alpine Linux 3.19+

21* **Hardware**: 4 GB+ RAM

22* **Network**: internet connection required. See [network configuration](/en/network-config#network-access-requirements).

23* **Shell**: Bash, Zsh, PowerShell, or CMD. On Windows, [Git for Windows](https://git-scm.com/downloads/win) is required.

12* **Location**: [Anthropic supported countries](https://www.anthropic.com/supported-countries)24* **Location**: [Anthropic supported countries](https://www.anthropic.com/supported-countries)

13 25 

14### Additional dependencies26### Additional dependencies

15 27 

16* **ripgrep**: Usually included with Claude Code. If search functionality fails, see [search troubleshooting](/en/docs/claude-code/troubleshooting#search-and-discovery-issues).28* **ripgrep**: usually included with Claude Code. If search fails, see [search troubleshooting](/en/troubleshooting#search-and-discovery-issues).

29 

30## Install Claude Code

31 

32<Tip>

33 Prefer a graphical interface? The [Desktop app](/en/desktop-quickstart) lets you use Claude Code without the terminal. Download it for [macOS](https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code\&utm_medium=docs) or [Windows](https://claude.ai/api/desktop/win32/x64/exe/latest/redirect?utm_source=claude_code\&utm_medium=docs).

17 34 

18## Standard installation35 New to the terminal? See the [terminal guide](/en/terminal-guide) for step-by-step instructions.

36</Tip>

19 37 

20To install Claude Code, use one of the following methods:38To install Claude Code, use one of the following methods:

21 39 

22<Tabs>40<Tabs>

23 <Tab title="Native Install (Recommended)">41 <Tab title="Native Install (Recommended)">

24 **Homebrew (macOS, Linux):**

25 

26 ```sh theme={null}

27 brew install --cask claude-code

28 ```

29 

30 **macOS, Linux, WSL:**42 **macOS, Linux, WSL:**

31 43 

32 ```bash theme={null}44 ```bash theme={null}


44 ```batch theme={null}56 ```batch theme={null}

45 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd57 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

46 ```58 ```

59 

60 **Windows requires [Git for Windows](https://git-scm.com/downloads/win).** Install it first if you don't have it.

61 

62 <Info>

63 Native installations automatically update in the background to keep you on the latest version.

64 </Info>

47 </Tab>65 </Tab>

48 66 

49 <Tab title="NPM">67 <Tab title="Homebrew">

50 If you have [Node.js 18 or newer installed](https://nodejs.org/en/download/):68 ```bash theme={null}

69 brew install --cask claude-code

70 ```

71 

72 <Info>

73 Homebrew installations do not auto-update. Run `brew upgrade claude-code` periodically to get the latest features and security fixes.

74 </Info>

75 </Tab>

51 76 

52 ```sh theme={null}77 <Tab title="WinGet">

53 npm install -g @anthropic-ai/claude-code78 ```powershell theme={null}

79 winget install Anthropic.ClaudeCode

54 ```80 ```

81 

82 <Info>

83 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

84 </Info>

55 </Tab>85 </Tab>

56</Tabs>86</Tabs>

57 87 

58<Note>88After installation completes, open a terminal in the project you want to work in and start Claude Code:

59 Some users may be automatically migrated to an improved installation method.

60</Note>

61 

62After the installation process completes, navigate to your project and start Claude Code:

63 89 

64```bash theme={null}90```bash theme={null}

65cd your-awesome-project

66claude91claude

67```92```

68 93 

69Claude Code offers the following authentication options:94If you encounter any issues during installation, see the [troubleshooting guide](/en/troubleshooting).

70 

711. **Claude Console**: The default option. Connect through the Claude Console and complete the OAuth process. Requires active billing at [console.anthropic.com](https://console.anthropic.com). A "Claude Code" workspace will be automatically created for usage tracking and cost management. Note that you cannot create API keys for the Claude Code workspace - it is dedicated exclusively for Claude Code usage.

722. **Claude App (with Pro or Max plan)**: Subscribe to Claude's [Pro or Max plan](https://claude.com/pricing) for a unified subscription that includes both Claude Code and the web interface. Get more value at the same price point while managing your account in one place. Log in with your Claude.ai account. During launch, choose the option that matches your subscription type.

733. **Enterprise platforms**: Configure Claude Code to use [Amazon Bedrock or Google Vertex AI](/en/docs/claude-code/third-party-integrations) for enterprise deployments with your existing cloud infrastructure.

74 95 

75<Note>96### Set up on Windows

76 Claude Code securely stores your credentials. See [Credential Management](/en/docs/claude-code/iam#credential-management) for details.

77</Note>

78 97 

79## Windows setup98Claude Code on Windows requires [Git for Windows](https://git-scm.com/downloads/win) or WSL. You can launch `claude` from PowerShell, CMD, or Git Bash. Claude Code uses Git Bash internally to run commands. You do not need to run PowerShell as Administrator.

80 99 

81**Option 1: Claude Code within WSL**100**Option 1: Native Windows with Git Bash**

82 101 

83* Both WSL 1 and WSL 2 are supported102Install [Git for Windows](https://git-scm.com/downloads/win), then run the install command from PowerShell or CMD.

84 103 

85**Option 2: Claude Code on native Windows with Git Bash**104If Claude Code can't find your Git Bash installation, set the path in your [settings.json file](/en/settings):

86 105 

87* Requires [Git for Windows](https://git-scm.com/downloads/win)106```json theme={null}

88* For portable Git installations, specify the path to your `bash.exe`:107{

89 ```powershell theme={null}108 "env": {

90 $env:CLAUDE_CODE_GIT_BASH_PATH="C:\Program Files\Git\bin\bash.exe"109 "CLAUDE_CODE_GIT_BASH_PATH": "C:\\Program Files\\Git\\bin\\bash.exe"

91 ```110 }

111}

112```

92 113 

93## Alternative installation methods114**Option 2: WSL**

94 115 

95Claude Code offers multiple installation methods to suit different environments.116Both WSL 1 and WSL 2 are supported. WSL 2 supports [sandboxing](/en/sandboxing) for enhanced security. WSL 1 does not support sandboxing.

96 117 

97If you encounter any issues during installation, consult the [troubleshooting guide](/en/docs/claude-code/troubleshooting#linux-permission-issues).118### Alpine Linux and musl-based distributions

98 119 

99<Tip>120The native installer on Alpine and other musl/uClibc-based distributions requires `libgcc`, `libstdc++`, and `ripgrep`. Install these using your distribution's package manager, then set `USE_BUILTIN_RIPGREP=0`.

100 Run `claude doctor` after installation to check your installation type and version.

101</Tip>

102 121 

103### Native installation options122This example installs the required packages on Alpine:

104 123 

105The native installation is the recommended method and offers several benefits:124```bash theme={null}

125apk add libgcc libstdc++ ripgrep

126```

106 127 

107* One self-contained executable128Then set `USE_BUILTIN_RIPGREP` to `0` in your [settings.json file](/en/settings#environment-variables):

108* No Node.js dependency

109* Improved auto-updater stability

110 129 

111If you have an existing installation of Claude Code, use `claude install` to migrate to the native binary installation.130```json theme={null}

131{

132 "env": {

133 "USE_BUILTIN_RIPGREP": "0"

134 }

135}

136```

112 137 

113For advanced installation options with the native installer:138## Verify your installation

114 139 

115**macOS, Linux, WSL:**140After installing, confirm Claude Code is working:

116 141 

117```bash theme={null}142```bash theme={null}

118# Install stable version (default)143claude --version

119curl -fsSL https://claude.ai/install.sh | bash144```

120 145 

121# Install latest version146For a more detailed check of your installation and configuration, run [`claude doctor`](/en/troubleshooting#get-more-help):

122curl -fsSL https://claude.ai/install.sh | bash -s latest

123 147 

124# Install specific version number148```bash theme={null}

125curl -fsSL https://claude.ai/install.sh | bash -s 1.0.58149claude doctor

126```150```

127 151 

128<Note>152## Authenticate

129 **Alpine Linux and other musl/uClibc-based distributions**: The native build requires you to install `libgcc`, `libstdc++`, and `ripgrep`. Install (Alpine: `apk add libgcc libstdc++ ripgrep`) and set `USE_BUILTIN_RIPGREP=0`.153 

130</Note>154Claude Code requires a Pro, Max, Teams, Enterprise, or Console account. The free Claude.ai plan does not include Claude Code access. You can also use Claude Code with a third-party API provider like [Amazon Bedrock](/en/amazon-bedrock), [Google Vertex AI](/en/google-vertex-ai), or [Microsoft Foundry](/en/microsoft-foundry).

155 

156After installing, log in by running `claude` and following the browser prompts. See [Authentication](/en/authentication) for all account types and team setup options.

157 

158## Update Claude Code

159 

160Native installations automatically update in the background. You can [configure the release channel](#configure-release-channel) to control whether you receive updates immediately or on a delayed stable schedule, or [disable auto-updates](#disable-auto-updates) entirely. Homebrew and WinGet installations require manual updates.

161 

162### Auto-updates

163 

164Claude Code checks for updates on startup and periodically while running. Updates download and install in the background, then take effect the next time you start Claude Code.

131 165 

132<Note>166<Note>

133 Claude Code installed via Homebrew will auto-update outside of the brew directory unless explicitly disabled with the `DISABLE_AUTOUPDATER` environment variable (see [Auto updates](#auto-updates) section).167 Homebrew and WinGet installations do not auto-update. Use `brew upgrade claude-code` or `winget upgrade Anthropic.ClaudeCode` to update manually.

168 

169 **Known issue:** Claude Code may notify you of updates before the new version is available in these package managers. If an upgrade fails, wait and try again later.

170 

171 Homebrew keeps old versions on disk after upgrades. Run `brew cleanup claude-code` periodically to reclaim disk space.

134</Note>172</Note>

135 173 

136**Windows PowerShell:**174### Configure release channel

137 175 

138```powershell theme={null}176Control which release channel Claude Code follows for auto-updates and `claude update` with the `autoUpdatesChannel` setting:

139# Install stable version (default)177 

140irm https://claude.ai/install.ps1 | iex178* `"latest"`, the default: receive new features as soon as they're released

179* `"stable"`: use a version that is typically about one week old, skipping releases with major regressions

141 180 

142# Install latest version181Configure this via `/config` → **Auto-update channel**, or add it to your [settings.json file](/en/settings):

143& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) latest

144 182 

145# Install specific version number183```json theme={null}

146& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 1.0.58184{

185 "autoUpdatesChannel": "stable"

186}

147```187```

148 188 

149**Windows CMD:**189For enterprise deployments, you can enforce a consistent release channel across your organization using [managed settings](/en/permissions#managed-settings).

150 190 

151```batch theme={null}191### Disable auto-updates

152REM Install stable version (default)

153curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

154 192 

155REM Install latest version193Set `DISABLE_AUTOUPDATER` to `"1"` in the `env` key of your [settings.json file](/en/settings#environment-variables):

156curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd latest && del install.cmd

157 194 

158REM Install specific version number195```json theme={null}

159curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd 1.0.58 && del install.cmd196{

197 "env": {

198 "DISABLE_AUTOUPDATER": "1"

199 }

200}

160```201```

161 202 

162<Tip>203### Update manually

163 Make sure that you remove any outdated aliases or symlinks before installing.204 

164</Tip>205To apply an update immediately without waiting for the next background check, run:

206 

207```bash theme={null}

208claude update

209```

210 

211## Advanced installation options

212 

213These options are for version pinning, migrating from npm, and verifying binary integrity.

214 

215### Install a specific version

216 

217The native installer accepts either a specific version number or a release channel (`latest` or `stable`). The channel you choose at install time becomes your default for auto-updates. See [configure release channel](#configure-release-channel) for more information.

218 

219To install the latest version (default):

220 

221<Tabs>

222 <Tab title="macOS, Linux, WSL">

223 ```bash theme={null}

224 curl -fsSL https://claude.ai/install.sh | bash

225 ```

226 </Tab>

227 

228 <Tab title="Windows PowerShell">

229 ```powershell theme={null}

230 irm https://claude.ai/install.ps1 | iex

231 ```

232 </Tab>

233 

234 <Tab title="Windows CMD">

235 ```batch theme={null}

236 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

237 ```

238 </Tab>

239</Tabs>

240 

241To install the stable version:

242 

243<Tabs>

244 <Tab title="macOS, Linux, WSL">

245 ```bash theme={null}

246 curl -fsSL https://claude.ai/install.sh | bash -s stable

247 ```

248 </Tab>

249 

250 <Tab title="Windows PowerShell">

251 ```powershell theme={null}

252 & ([scriptblock]::Create((irm https://claude.ai/install.ps1))) stable

253 ```

254 </Tab>

255 

256 <Tab title="Windows CMD">

257 ```batch theme={null}

258 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd stable && del install.cmd

259 ```

260 </Tab>

261</Tabs>

165 262 

166### NPM installation263To install a specific version number:

167 264 

168For environments where NPM is preferred or required:265<Tabs>

266 <Tab title="macOS, Linux, WSL">

267 ```bash theme={null}

268 curl -fsSL https://claude.ai/install.sh | bash -s 1.0.58

269 ```

270 </Tab>

271 

272 <Tab title="Windows PowerShell">

273 ```powershell theme={null}

274 & ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 1.0.58

275 ```

276 </Tab>

277 

278 <Tab title="Windows CMD">

279 ```batch theme={null}

280 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd 1.0.58 && del install.cmd

281 ```

282 </Tab>

283</Tabs>

284 

285### Deprecated npm installation

286 

287npm installation is deprecated. The native installer is faster, requires no dependencies, and auto-updates in the background. Use the [native installation](#install-claude-code) method when possible.

288 

289#### Migrate from npm to native

290 

291If you previously installed Claude Code with npm, switch to the native installer:

292 

293```bash theme={null}

294# Install the native binary

295curl -fsSL https://claude.ai/install.sh | bash

296 

297# Remove the old npm installation

298npm uninstall -g @anthropic-ai/claude-code

299```

169 300 

170```sh theme={null}301You can also run `claude install` from an existing npm installation to install the native binary alongside it, then remove the npm version.

302 

303#### Install with npm

304 

305If you need npm installation for compatibility reasons, you must have [Node.js 18+](https://nodejs.org/en/download) installed. Install the package globally:

306 

307```bash theme={null}

171npm install -g @anthropic-ai/claude-code308npm install -g @anthropic-ai/claude-code

172```309```

173 310 

174<Warning>311<Warning>

175 Do NOT use `sudo npm install -g` as this can lead to permission issues and security risks.312 Do NOT use `sudo npm install -g` as this can lead to permission issues and security risks. If you encounter permission errors, see [troubleshooting permission errors](/en/troubleshooting#permission-errors-during-installation).

176 If you encounter permission errors, see [configure Claude Code](/en/docs/claude-code/troubleshooting#linux-permission-issues) for recommended solutions.

177</Warning>313</Warning>

178 314 

179### Local installation315### Binary integrity and code signing

180 316 

181* After global install via npm, use `claude migrate-installer` to move to local317You can verify the integrity of Claude Code binaries using SHA256 checksums and code signatures.

182* Avoids autoupdater npm permission issues

183* Some users may be automatically migrated to this method

184 318 

185## Running on AWS or GCP319* SHA256 checksums for all platforms are published in the release manifests at `https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/{VERSION}/manifest.json`. Replace `{VERSION}` with a version number such as `2.0.30`.

320* Signed binaries are distributed for the following platforms:

321 * **macOS**: signed by "Anthropic PBC" and notarized by Apple

322 * **Windows**: signed by "Anthropic, PBC"

186 323 

187By default, Claude Code uses the Claude API.324## Uninstall Claude Code

188 325 

189For details on running Claude Code on AWS or GCP, see [third-party integrations](/en/docs/claude-code/third-party-integrations).326To remove Claude Code, follow the instructions for your installation method.

190 327 

191## Update Claude Code328### Native installation

192 329 

193### Auto updates330Remove the Claude Code binary and version files:

194 331 

195Claude Code automatically keeps itself up to date to ensure you have the latest features and security fixes.332<Tabs>

333 <Tab title="macOS, Linux, WSL">

334 ```bash theme={null}

335 rm -f ~/.local/bin/claude

336 rm -rf ~/.local/share/claude

337 ```

338 </Tab>

196 339 

197* **Update checks**: Performed on startup and periodically while running340 <Tab title="Windows PowerShell">

198* **Update process**: Downloads and installs automatically in the background341 ```powershell theme={null}

199* **Notifications**: You'll see a notification when updates are installed342 Remove-Item -Path "$env:USERPROFILE\.local\bin\claude.exe" -Force

200* **Applying updates**: Updates take effect the next time you start Claude Code343 Remove-Item -Path "$env:USERPROFILE\.local\share\claude" -Recurse -Force

344 ```

345 </Tab>

346</Tabs>

201 347 

202**Disable auto-updates:**348### Homebrew installation

203 349 

204Set the `DISABLE_AUTOUPDATER` environment variable in your shell or [settings.json file](/en/docs/claude-code/settings):350Remove the Homebrew cask:

205 351 

206```bash theme={null}352```bash theme={null}

207export DISABLE_AUTOUPDATER=1353brew uninstall --cask claude-code

208```354```

209 355 

210### Update manually356### WinGet installation

357 

358Remove the WinGet package:

359 

360```powershell theme={null}

361winget uninstall Anthropic.ClaudeCode

362```

363 

364### npm

365 

366Remove the global npm package:

211 367 

212```bash theme={null}368```bash theme={null}

213claude update369npm uninstall -g @anthropic-ai/claude-code

214```370```

371 

372### Remove configuration files

373 

374<Warning>

375 Removing configuration files will delete all your settings, allowed tools, MCP server configurations, and session history.

376</Warning>

377 

378To remove Claude Code settings and cached data:

379 

380<Tabs>

381 <Tab title="macOS, Linux, WSL">

382 ```bash theme={null}

383 # Remove user settings and state

384 rm -rf ~/.claude

385 rm ~/.claude.json

386 

387 # Remove project-specific settings (run from your project directory)

388 rm -rf .claude

389 rm -f .mcp.json

390 ```

391 </Tab>

392 

393 <Tab title="Windows PowerShell">

394 ```powershell theme={null}

395 # Remove user settings and state

396 Remove-Item -Path "$env:USERPROFILE\.claude" -Recurse -Force

397 Remove-Item -Path "$env:USERPROFILE\.claude.json" -Force

398 

399 # Remove project-specific settings (run from your project directory)

400 Remove-Item -Path ".claude" -Recurse -Force

401 Remove-Item -Path ".mcp.json" -Force

402 ```

403 </Tab>

404</Tabs>

skills.md +492 −413

Details

1# Agent Skills1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Create, manage, and share Skills to extend Claude's capabilities in Claude Code.5# Extend Claude with skills

4 6 

5This guide shows you how to create, use, and manage Agent Skills in Claude Code. Skills are modular capabilities that extend Claude's functionality through organized folders containing instructions, scripts, and resources.7> Create, manage, and share skills to extend Claude's capabilities in Claude Code. Includes custom slash commands.

6 8 

7## Prerequisites9Skills extend what Claude can do. Create a `SKILL.md` file with instructions, and Claude adds it to its toolkit. Claude uses skills when relevant, or you can invoke one directly with `/skill-name`.

8 

9* Claude Code version 1.0 or later

10* Basic familiarity with [Claude Code](/en/docs/claude-code/quickstart)

11 

12## What are Agent Skills?

13 

14Agent Skills package expertise into discoverable capabilities. Each Skill consists of a `SKILL.md` file with instructions that Claude reads when relevant, plus optional supporting files like scripts and templates.

15 

16**How Skills are invoked**: Skills are **model-invoked**—Claude autonomously decides when to use them based on your request and the Skill's description. This is different from slash commands, which are **user-invoked** (you explicitly type `/command` to trigger them).

17 

18**Benefits**:

19 

20* Extend Claude's capabilities for your specific workflows

21* Share expertise across your team via git

22* Reduce repetitive prompting

23* Compose multiple Skills for complex tasks

24 

25Learn more in the [Agent Skills overview](/en/docs/agents-and-tools/agent-skills/overview).

26 10 

27<Note>11<Note>

28 For a deep dive into the architecture and real-world applications of Agent Skills, read our engineering blog: [Equipping agents for the real world with Agent Skills](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills).12 For built-in commands like `/help` and `/compact`, see [interactive mode](/en/interactive-mode#built-in-commands).

13 

14 **Custom slash commands have been merged into skills.** A file at `.claude/commands/review.md` and a skill at `.claude/skills/review/SKILL.md` both create `/review` and work the same way. Your existing `.claude/commands/` files keep working. Skills add optional features: a directory for supporting files, frontmatter to [control whether you or Claude invokes them](#control-who-invokes-a-skill), and the ability for Claude to load them automatically when relevant.

29</Note>15</Note>

30 16 

31## Create a Skill17Claude Code skills follow the [Agent Skills](https://agentskills.io) open standard, which works across multiple AI tools. Claude Code extends the standard with additional features like [invocation control](#control-who-invokes-a-skill), [subagent execution](#run-skills-in-a-subagent), and [dynamic context injection](#inject-dynamic-context).

32 18 

33Skills are stored as directories containing a `SKILL.md` file.19## Getting started

34 20 

35### Personal Skills21### Create your first skill

36 22 

37Personal Skills are available across all your projects. Store them in `~/.claude/skills/`:23This example creates a skill that teaches Claude to explain code using visual diagrams and analogies. Since it uses default frontmatter, Claude can load it automatically when you ask how something works, or you can invoke it directly with `/explain-code`.

38 24 

39```bash theme={null}25<Steps>

40mkdir -p ~/.claude/skills/my-skill-name26 <Step title="Create the skill directory">

41```27 Create a directory for the skill in your personal skills folder. Personal skills are available across all your projects.

42 28 

43**Use personal Skills for**:29 ```bash theme={null}

30 mkdir -p ~/.claude/skills/explain-code

31 ```

32 </Step>

44 33 

45* Your individual workflows and preferences34 <Step title="Write SKILL.md">

46* Experimental Skills you're developing35 Every skill needs a `SKILL.md` file with two parts: YAML frontmatter (between `---` markers) that tells Claude when to use the skill, and markdown content with instructions Claude follows when the skill is invoked. The `name` field becomes the `/slash-command`, and the `description` helps Claude decide when to load it automatically.

47* Personal productivity tools

48 36 

49### Project Skills37 Create `~/.claude/skills/explain-code/SKILL.md`:

50 38 

51Project Skills are shared with your team. Store them in `.claude/skills/` within your project:39 ```yaml theme={null}

40 ---

41 name: explain-code

42 description: Explains code with visual diagrams and analogies. Use when explaining how code works, teaching about a codebase, or when the user asks "how does this work?"

43 ---

52 44 

53```bash theme={null}45 When explaining code, always include:

54mkdir -p .claude/skills/my-skill-name

55```

56 

57**Use project Skills for**:

58 

59* Team workflows and conventions

60* Project-specific expertise

61* Shared utilities and scripts

62 46 

63Project Skills are checked into git and automatically available to team members.47 1. **Start with an analogy**: Compare the code to something from everyday life

48 2. **Draw a diagram**: Use ASCII art to show the flow, structure, or relationships

49 3. **Walk through the code**: Explain step-by-step what happens

50 4. **Highlight a gotcha**: What's a common mistake or misconception?

64 51 

65### Plugin Skills52 Keep explanations conversational. For complex concepts, use multiple analogies.

53 ```

54 </Step>

66 55 

67Skills can also come from [Claude Code plugins](/en/docs/claude-code/plugins). Plugins may bundle Skills that are automatically available when the plugin is installed. These Skills work the same way as personal and project Skills.56 <Step title="Test the skill">

57 You can test it two ways:

68 58 

69## Write SKILL.md59 **Let Claude invoke it automatically** by asking something that matches the description:

70 60 

71Create a `SKILL.md` file with YAML frontmatter and Markdown content:61 ```

62 How does this code work?

63 ```

72 64 

73```yaml theme={null}65 **Or invoke it directly** with the skill name:

74name: your-skill-name

75description: Brief description of what this Skill does and when to use it

76 66 

77# Your Skill Name67 ```

68 /explain-code src/auth/login.ts

69 ```

78 70 

79## Instructions71 Either way, Claude should include an analogy and ASCII diagram in its explanation.

80Provide clear, step-by-step guidance for Claude.72 </Step>

73</Steps>

81 74 

82## Examples75### Where skills live

83Show concrete examples of using this Skill.

84```

85 76 

86**Field requirements**:77Where you store a skill determines who can use it:

87 78 

88* `name`: Must use lowercase letters, numbers, and hyphens only (max 64 characters)79| Location | Path | Applies to |

89* `description`: Brief description of what the Skill does and when to use it (max 1024 characters)80| :--------- | :-------------------------------------------------- | :----------------------------- |

81| Enterprise | See [managed settings](/en/settings#settings-files) | All users in your organization |

82| Personal | `~/.claude/skills/<skill-name>/SKILL.md` | All your projects |

83| Project | `.claude/skills/<skill-name>/SKILL.md` | This project only |

84| Plugin | `<plugin>/skills/<skill-name>/SKILL.md` | Where plugin is enabled |

90 85 

91The `description` field is critical for Claude to discover when to use your Skill. It should include both what the Skill does and when Claude should use it.86When skills share the same name across levels, higher-priority locations win: enterprise > personal > project. Plugin skills use a `plugin-name:skill-name` namespace, so they cannot conflict with other levels. If you have files in `.claude/commands/`, those work the same way, but if a skill and a command share the same name, the skill takes precedence.

92 87 

93See the [best practices guide](/en/docs/agents-and-tools/agent-skills/best-practices) for complete authoring guidance including validation rules.88#### Automatic discovery from nested directories

94 89 

95## Add supporting files90When you work with files in subdirectories, Claude Code automatically discovers skills from nested `.claude/skills/` directories. For example, if you're editing a file in `packages/frontend/`, Claude Code also looks for skills in `packages/frontend/.claude/skills/`. This supports monorepo setups where packages have their own skills.

96 91 

97Create additional files alongside SKILL.md:92Each skill is a directory with `SKILL.md` as the entrypoint:

98 93 

99```94```

100my-skill/95my-skill/

101├── SKILL.md (required)96├── SKILL.md # Main instructions (required)

102├── reference.md (optional documentation)97├── template.md # Template for Claude to fill in

103├── examples.md (optional examples)98├── examples/

104── scripts/99│ └── sample.md # Example output showing expected format

105└── helper.py (optional utility)100└── scripts/

106└── templates/101 └── validate.sh # Script Claude can execute

107 └── template.txt (optional template)

108```

109 

110Reference these files from SKILL.md:

111 

112````markdown theme={null}

113For advanced usage, see [reference.md](reference.md).

114 

115Run the helper script:

116```bash

117python scripts/helper.py input.txt

118```

119````

120 

121Claude reads these files only when needed, using progressive disclosure to manage context efficiently.

122 

123## Restrict tool access with allowed-tools

124 

125Use the `allowed-tools` frontmatter field to limit which tools Claude can use when a Skill is active:

126 

127```yaml theme={null}

128name: safe-file-reader

129description: Read files without making changes. Use when you need read-only file access.

130allowed-tools: Read, Grep, Glob

131 

132# Safe File Reader

133 

134This Skill provides read-only file access.

135 

136## Instructions

1371. Use Read to view file contents

1382. Use Grep to search within files

1393. Use Glob to find files by pattern

140```102```

141 103 

142When this Skill is active, Claude can only use the specified tools (Read, Grep, Glob) without needing to ask for permission. This is useful for:104The `SKILL.md` contains the main instructions and is required. Other files are optional and let you build more powerful skills: templates for Claude to fill in, example outputs showing the expected format, scripts Claude can execute, or detailed reference documentation. Reference these files from your `SKILL.md` so Claude knows what they contain and when to load them. See [Add supporting files](#add-supporting-files) for more details.

143 

144* Read-only Skills that shouldn't modify files

145* Skills with limited scope (e.g., only data analysis, no file writing)

146* Security-sensitive workflows where you want to restrict capabilities

147 

148If `allowed-tools` is not specified, Claude will ask for permission to use tools as normal, following the standard permission model.

149 105 

150<Note>106<Note>

151 `allowed-tools` is only supported for Skills in Claude Code.107 Files in `.claude/commands/` still work and support the same [frontmatter](#frontmatter-reference). Skills are recommended since they support additional features like supporting files.

152</Note>108</Note>

153 109 

154## View available Skills110#### Skills from additional directories

155 

156Skills are automatically discovered by Claude from three sources:

157 111 

158* Personal Skills: `~/.claude/skills/`112Skills defined in `.claude/skills/` within directories added via `--add-dir` are loaded automatically and picked up by live change detection, so you can edit them during a session without restarting.

159* Project Skills: `.claude/skills/`

160* Plugin Skills: bundled with installed plugins

161 113 

162**To view all available Skills**, ask Claude directly:114<Note>

163 115 CLAUDE.md files from `--add-dir` directories are not loaded by default. To load them, set `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1`. See [Load memory from additional directories](/en/memory#load-memory-from-additional-directories).

164```116</Note>

165What Skills are available?

166```

167 117 

168or118## Configure skills

169 119 

170```120Skills are configured through YAML frontmatter at the top of `SKILL.md` and the markdown content that follows.

171List all available Skills

172```

173 121 

174This will show all Skills from all sources, including plugin Skills.122### Types of skill content

175 123 

176**To inspect a specific Skill**, you can also check the filesystem:124Skill files can contain any instructions, but thinking about how you want to invoke them helps guide what to include:

177 125 

178```bash theme={null}126**Reference content** adds knowledge Claude applies to your current work. Conventions, patterns, style guides, domain knowledge. This content runs inline so Claude can use it alongside your conversation context.

179# List personal Skills

180ls ~/.claude/skills/

181 127 

182# List project Skills (if in a project directory)128```yaml theme={null}

183ls .claude/skills/129---

130name: api-conventions

131description: API design patterns for this codebase

132---

184 133 

185# View a specific Skill's content134When writing API endpoints:

186cat ~/.claude/skills/my-skill/SKILL.md135- Use RESTful naming conventions

136- Return consistent error formats

137- Include request validation

187```138```

188 139 

189## Test a Skill140**Task content** gives Claude step-by-step instructions for a specific action, like deployments, commits, or code generation. These are often actions you want to invoke directly with `/skill-name` rather than letting Claude decide when to run them. Add `disable-model-invocation: true` to prevent Claude from triggering it automatically.

190 141 

191After creating a Skill, test it by asking questions that match your description.142```yaml theme={null}

192 143---

193**Example**: If your description mentions "PDF files":144name: deploy

145description: Deploy the application to production

146context: fork

147disable-model-invocation: true

148---

194 149 

150Deploy the application:

1511. Run the test suite

1522. Build the application

1533. Push to the deployment target

195```154```

196Can you help me extract text from this PDF?

197```

198 

199Claude autonomously decides to use your Skill if it matches the request—you don't need to explicitly invoke it. The Skill activates automatically based on the context of your question.

200 

201## Debug a Skill

202 155 

203If Claude doesn't use your Skill, check these common issues:156Your `SKILL.md` can contain anything, but thinking through how you want the skill invoked (by you, by Claude, or both) and where you want it to run (inline or in a subagent) helps guide what to include. For complex skills, you can also [add supporting files](#add-supporting-files) to keep the main skill focused.

204 157 

205### Make description specific158### Frontmatter reference

206 159 

207**Too vague**:160Beyond the markdown content, you can configure skill behavior using YAML frontmatter fields between `---` markers at the top of your `SKILL.md` file:

208 161 

209```yaml theme={null}162```yaml theme={null}

210description: Helps with documents163---

211```164name: my-skill

212 165description: What this skill does

213**Specific**:166disable-model-invocation: true

167allowed-tools: Read, Grep

168---

214 169 

215```yaml theme={null}170Your skill instructions here...

216description: Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction.

217```171```

218 172 

219Include both what the Skill does and when to use it in the description.173All fields are optional. Only `description` is recommended so Claude knows when to use the skill.

220 174 

221### Verify file path175| Field | Required | Description |

176| :------------------------- | :---------- | :---------------------------------------------------------------------------------------------------------------------------------------------------- |

177| `name` | No | Display name for the skill. If omitted, uses the directory name. Lowercase letters, numbers, and hyphens only (max 64 characters). |

178| `description` | Recommended | What the skill does and when to use it. Claude uses this to decide when to apply the skill. If omitted, uses the first paragraph of markdown content. |

179| `argument-hint` | No | Hint shown during autocomplete to indicate expected arguments. Example: `[issue-number]` or `[filename] [format]`. |

180| `disable-model-invocation` | No | Set to `true` to prevent Claude from automatically loading this skill. Use for workflows you want to trigger manually with `/name`. Default: `false`. |

181| `user-invocable` | No | Set to `false` to hide from the `/` menu. Use for background knowledge users shouldn't invoke directly. Default: `true`. |

182| `allowed-tools` | No | Tools Claude can use without asking permission when this skill is active. |

183| `model` | No | Model to use when this skill is active. |

184| `context` | No | Set to `fork` to run in a forked subagent context. |

185| `agent` | No | Which subagent type to use when `context: fork` is set. |

186| `hooks` | No | Hooks scoped to this skill's lifecycle. See [Hooks in skills and agents](/en/hooks#hooks-in-skills-and-agents) for configuration format. |

222 187 

223**Personal Skills**: `~/.claude/skills/skill-name/SKILL.md`188#### Available string substitutions

224**Project Skills**: `.claude/skills/skill-name/SKILL.md`

225 189 

226Check the file exists:190Skills support string substitution for dynamic values in the skill content:

227 191 

228```bash theme={null}192| Variable | Description |

229# Personal193| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- |

230ls ~/.claude/skills/my-skill/SKILL.md194| `$ARGUMENTS` | All arguments passed when invoking the skill. If `$ARGUMENTS` is not present in the content, arguments are appended as `ARGUMENTS: <value>`. |

231 195| `$ARGUMENTS[N]` | Access a specific argument by 0-based index, such as `$ARGUMENTS[0]` for the first argument. |

232# Project196| `$N` | Shorthand for `$ARGUMENTS[N]`, such as `$0` for the first argument or `$1` for the second. |

233ls .claude/skills/my-skill/SKILL.md197| `${CLAUDE_SESSION_ID}` | The current session ID. Useful for logging, creating session-specific files, or correlating skill output with sessions. |

234```

235 198 

236### Check YAML syntax199**Example using substitutions:**

237 200 

238Invalid YAML prevents the Skill from loading. Verify the frontmatter:201```yaml theme={null}

239 202---

240```bash theme={null}203name: session-logger

241cat SKILL.md | head -n 10204description: Log activity for this session

242```205---

243 

244Ensure:

245 

246* Opening `---` on line 1

247* Closing `---` before Markdown content

248* Valid YAML syntax (no tabs, correct indentation)

249 

250### View errors

251 206 

252Run Claude Code with debug mode to see Skill loading errors:207Log the following to logs/${CLAUDE_SESSION_ID}.log:

253 208 

254```bash theme={null}209$ARGUMENTS

255claude --debug

256```210```

257 211 

258## Share Skills with your team212### Add supporting files

259 

260**Recommended approach**: Distribute Skills through [plugins](/en/docs/claude-code/plugins).

261 

262To share Skills via plugin:

263 

2641. Create a plugin with Skills in the `skills/` directory

2652. Add the plugin to a marketplace

2663. Team members install the plugin

267 213 

268For complete instructions, see [Add Skills to your plugin](/en/docs/claude-code/plugins#add-skills-to-your-plugin).214Skills can include multiple files in their directory. This keeps `SKILL.md` focused on the essentials while letting Claude access detailed reference material only when needed. Large reference docs, API specifications, or example collections don't need to load into context every time the skill runs.

269 215 

270You can also share Skills directly through project repositories:

271 

272### Step 1: Add Skill to your project

273 

274Create a project Skill:

275 

276```bash theme={null}

277mkdir -p .claude/skills/team-skill

278# Create SKILL.md

279```216```

280 217my-skill/

281### Step 2: Commit to git218├── SKILL.md (required - overview and navigation)

282 219├── reference.md (detailed API docs - loaded when needed)

283```bash theme={null}220├── examples.md (usage examples - loaded when needed)

284git add .claude/skills/221└── scripts/

285git commit -m "Add team Skill for PDF processing"222 └── helper.py (utility script - executed, not loaded)

286git push

287```223```

288 224 

289### Step 3: Team members get Skills automatically225Reference supporting files from `SKILL.md` so Claude knows what each file contains and when to load it:

290 226 

291When team members pull the latest changes, Skills are immediately available:227```markdown theme={null}

228## Additional resources

292 229 

293```bash theme={null}230- For complete API details, see [reference.md](reference.md)

294git pull231- For usage examples, see [examples.md](examples.md)

295claude # Skills are now available

296```232```

297 233 

298## Update a Skill234<Tip>Keep `SKILL.md` under 500 lines. Move detailed reference material to separate files.</Tip>

299 235 

300Edit SKILL.md directly:236### Control who invokes a skill

301 237 

302```bash theme={null}238By default, both you and Claude can invoke any skill. You can type `/skill-name` to invoke it directly, and Claude can load it automatically when relevant to your conversation. Two frontmatter fields let you restrict this:

303# Personal Skill

304code ~/.claude/skills/my-skill/SKILL.md

305 239 

306# Project Skill240* **`disable-model-invocation: true`**: Only you can invoke the skill. Use this for workflows with side effects or that you want to control timing, like `/commit`, `/deploy`, or `/send-slack-message`. You don't want Claude deciding to deploy because your code looks ready.

307code .claude/skills/my-skill/SKILL.md

308```

309 241 

310Changes take effect the next time you start Claude Code. If Claude Code is already running, restart it to load the updates.242* **`user-invocable: false`**: Only Claude can invoke the skill. Use this for background knowledge that isn't actionable as a command. A `legacy-system-context` skill explains how an old system works. Claude should know this when relevant, but `/legacy-system-context` isn't a meaningful action for users to take.

311 243 

312## Remove a Skill244This example creates a deploy skill that only you can trigger. The `disable-model-invocation: true` field prevents Claude from running it automatically:

313 245 

314Delete the Skill directory:246```yaml theme={null}

247---

248name: deploy

249description: Deploy the application to production

250disable-model-invocation: true

251---

315 252 

316```bash theme={null}253Deploy $ARGUMENTS to production:

317# Personal

318rm -rf ~/.claude/skills/my-skill

319 254 

320# Project2551. Run the test suite

321rm -rf .claude/skills/my-skill2562. Build the application

322git commit -m "Remove unused Skill"2573. Push to the deployment target

2584. Verify the deployment succeeded

323```259```

324 260 

325## Best practices261Here's how the two fields affect invocation and context loading:

326 

327### Keep Skills focused

328 262 

329One Skill should address one capability:263| Frontmatter | You can invoke | Claude can invoke | When loaded into context |

264| :------------------------------- | :------------- | :---------------- | :----------------------------------------------------------- |

265| (default) | Yes | Yes | Description always in context, full skill loads when invoked |

266| `disable-model-invocation: true` | Yes | No | Description not in context, full skill loads when you invoke |

267| `user-invocable: false` | No | Yes | Description always in context, full skill loads when invoked |

330 268 

331**Focused**:269<Note>

270 In a regular session, skill descriptions are loaded into context so Claude knows what's available, but full skill content only loads when invoked. [Subagents with preloaded skills](/en/sub-agents#preload-skills-into-subagents) work differently: the full skill content is injected at startup.

271</Note>

332 272 

333* "PDF form filling"273### Restrict tool access

334* "Excel data analysis"

335* "Git commit messages"

336 274 

337**Too broad**:275Use the `allowed-tools` field to limit which tools Claude can use when a skill is active. This skill creates a read-only mode where Claude can explore files but not modify them:

338 276 

339* "Document processing" (split into separate Skills)277```yaml theme={null}

340* "Data tools" (split by data type or operation)278---

279name: safe-reader

280description: Read files without making changes

281allowed-tools: Read, Grep, Glob

282---

283```

341 284 

342### Write clear descriptions285### Pass arguments to skills

343 286 

344Help Claude discover when to use Skills by including specific triggers in your description:287Both you and Claude can pass arguments when invoking a skill. Arguments are available via the `$ARGUMENTS` placeholder.

345 288 

346**Clear**:289This skill fixes a GitHub issue by number. The `$ARGUMENTS` placeholder gets replaced with whatever follows the skill name:

347 290 

348```yaml theme={null}291```yaml theme={null}

349description: Analyze Excel spreadsheets, create pivot tables, and generate charts. Use when working with Excel files, spreadsheets, or analyzing tabular data in .xlsx format.292---

350```293name: fix-issue

294description: Fix a GitHub issue

295disable-model-invocation: true

296---

351 297 

352**Vague**:298Fix GitHub issue $ARGUMENTS following our coding standards.

353 299 

354```yaml theme={null}3001. Read the issue description

355description: For files3012. Understand the requirements

3023. Implement the fix

3034. Write tests

3045. Create a commit

356```305```

357 306 

358### Test with your team307When you run `/fix-issue 123`, Claude receives "Fix GitHub issue 123 following our coding standards..."

359 308 

360Have teammates use Skills and provide feedback:309If you invoke a skill with arguments but the skill doesn't include `$ARGUMENTS`, Claude Code appends `ARGUMENTS: <your input>` to the end of the skill content so Claude still sees what you typed.

361 310 

362* Does the Skill activate when expected?311To access individual arguments by position, use `$ARGUMENTS[N]` or the shorter `$N`:

363* Are the instructions clear?

364* Are there missing examples or edge cases?

365 312 

366### Document Skill versions313```yaml theme={null}

367 314---

368You can document Skill versions in your SKILL.md content to track changes over time. Add a version history section:315name: migrate-component

369 316description: Migrate a component from one framework to another

370```markdown theme={null}317---

371# My Skill

372 318 

373## Version History319Migrate the $ARGUMENTS[0] component from $ARGUMENTS[1] to $ARGUMENTS[2].

374- v2.0.0 (2025-10-01): Breaking changes to API320Preserve all existing behavior and tests.

375- v1.1.0 (2025-09-15): Added new features

376- v1.0.0 (2025-09-01): Initial release

377```321```

378 322 

379This helps team members understand what changed between versions.323Running `/migrate-component SearchBar React Vue` replaces `$ARGUMENTS[0]` with `SearchBar`, `$ARGUMENTS[1]` with `React`, and `$ARGUMENTS[2]` with `Vue`. The same skill using the `$N` shorthand:

380 324 

381## Troubleshooting325```yaml theme={null}

326---

327name: migrate-component

328description: Migrate a component from one framework to another

329---

382 330 

383### Claude doesn't use my Skill331Migrate the $0 component from $1 to $2.

332Preserve all existing behavior and tests.

333```

384 334 

385**Symptom**: You ask a relevant question but Claude doesn't use your Skill.335## Advanced patterns

386 336 

387**Check**: Is the description specific enough?337### Inject dynamic context

388 338 

389Vague descriptions make discovery difficult. Include both what the Skill does and when to use it, with key terms users would mention.339The `!`command\`\` syntax runs shell commands before the skill content is sent to Claude. The command output replaces the placeholder, so Claude receives actual data, not the command itself.

390 340 

391**Too generic**:341This skill summarizes a pull request by fetching live PR data with the GitHub CLI. The `!`gh pr diff\`\` and other commands run first, and their output gets inserted into the prompt:

392 342 

393```yaml theme={null}343```yaml theme={null}

394description: Helps with data344---

395```345name: pr-summary

346description: Summarize changes in a pull request

347context: fork

348agent: Explore

349allowed-tools: Bash(gh *)

350---

396 351 

397**Specific**:352## Pull request context

353- PR diff: !`gh pr diff`

354- PR comments: !`gh pr view --comments`

355- Changed files: !`gh pr diff --name-only`

398 356 

399```yaml theme={null}357## Your task

400description: Analyze Excel spreadsheets, generate pivot tables, create charts. Use when working with Excel files, spreadsheets, or .xlsx files.358Summarize this pull request...

401```359```

402 360 

403**Check**: Is the YAML valid?361When this skill runs:

404 362 

405Run validation to check for syntax errors:3631. Each `!`command\`\` executes immediately (before Claude sees anything)

3642. The output replaces the placeholder in the skill content

3653. Claude receives the fully-rendered prompt with actual PR data

406 366 

407```bash theme={null}367This is preprocessing, not something Claude executes. Claude only sees the final result.

408# View frontmatter

409cat .claude/skills/my-skill/SKILL.md | head -n 15

410 368 

411# Check for common issues369<Tip>

412# - Missing opening or closing ---370 To enable [extended thinking](/en/common-workflows#use-extended-thinking-thinking-mode) in a skill, include the word "ultrathink" anywhere in your skill content.

413# - Tabs instead of spaces371</Tip>

414# - Unquoted strings with special characters

415```

416 372 

417**Check**: Is the Skill in the correct location?373### Run skills in a subagent

418 374 

419```bash theme={null}375Add `context: fork` to your frontmatter when you want a skill to run in isolation. The skill content becomes the prompt that drives the subagent. It won't have access to your conversation history.

420# Personal Skills

421ls ~/.claude/skills/*/SKILL.md

422 376 

423# Project Skills377<Warning>

424ls .claude/skills/*/SKILL.md378 `context: fork` only makes sense for skills with explicit instructions. If your skill contains guidelines like "use these API conventions" without a task, the subagent receives the guidelines but no actionable prompt, and returns without meaningful output.

425```379</Warning>

426 380 

427### Skill has errors381Skills and [subagents](/en/sub-agents) work together in two directions:

428 382 

429**Symptom**: The Skill loads but doesn't work correctly.383| Approach | System prompt | Task | Also loads |

384| :--------------------------- | :---------------------------------------- | :-------------------------- | :--------------------------- |

385| Skill with `context: fork` | From agent type (`Explore`, `Plan`, etc.) | SKILL.md content | CLAUDE.md |

386| Subagent with `skills` field | Subagent's markdown body | Claude's delegation message | Preloaded skills + CLAUDE.md |

430 387 

431**Check**: Are dependencies available?388With `context: fork`, you write the task in your skill and pick an agent type to execute it. For the inverse (defining a custom subagent that uses skills as reference material), see [Subagents](/en/sub-agents#preload-skills-into-subagents).

432 389 

433Claude will automatically install required dependencies (or ask for permission to install them) when it needs them.390#### Example: Research skill using Explore agent

434 391 

435**Check**: Do scripts have execute permissions?392This skill runs research in a forked Explore agent. The skill content becomes the task, and the agent provides read-only tools optimized for codebase exploration:

436 393 

437```bash theme={null}394```yaml theme={null}

438chmod +x .claude/skills/my-skill/scripts/*.py395---

439```396name: deep-research

397description: Research a topic thoroughly

398context: fork

399agent: Explore

400---

440 401 

441**Check**: Are file paths correct?402Research $ARGUMENTS thoroughly:

442 403 

443Use forward slashes (Unix style) in all paths:4041. Find relevant files using Glob and Grep

4052. Read and analyze the code

4063. Summarize findings with specific file references

407```

444 408 

445**Correct**: `scripts/helper.py`409When this skill runs:

446**Wrong**: `scripts\helper.py` (Windows style)

447 410 

448### Multiple Skills conflict4111. A new isolated context is created

4122. The subagent receives the skill content as its prompt ("Research \$ARGUMENTS thoroughly...")

4133. The `agent` field determines the execution environment (model, tools, and permissions)

4144. Results are summarized and returned to your main conversation

449 415 

450**Symptom**: Claude uses the wrong Skill or seems confused between similar Skills.416The `agent` field specifies which subagent configuration to use. Options include built-in agents (`Explore`, `Plan`, `general-purpose`) or any custom subagent from `.claude/agents/`. If omitted, uses `general-purpose`.

451 417 

452**Be specific in descriptions**: Help Claude choose the right Skill by using distinct trigger terms in your descriptions.418### Restrict Claude's skill access

453 419 

454Instead of:420By default, Claude can invoke any skill that doesn't have `disable-model-invocation: true` set. Skills that define `allowed-tools` grant Claude access to those tools without per-use approval when the skill is active. Your [permission settings](/en/permissions) still govern baseline approval behavior for all other tools. Built-in commands like `/compact` and `/init` are not available through the Skill tool.

455 421 

456```yaml theme={null}422Three ways to control which skills Claude can invoke:

457# Skill 1423 

458description: For data analysis424**Disable all skills** by denying the Skill tool in `/permissions`:

459 425 

460# Skill 2426```

461description: For analyzing data427# Add to deny rules:

428Skill

462```429```

463 430 

464Use:431**Allow or deny specific skills** using [permission rules](/en/permissions):

465 432 

466```yaml theme={null}433```

467# Skill 1434# Allow only specific skills

468description: Analyze sales data in Excel files and CRM exports. Use for sales reports, pipeline analysis, and revenue tracking.435Skill(commit)

436Skill(review-pr *)

469 437 

470# Skill 2438# Deny specific skills

471description: Analyze log files and system metrics data. Use for performance monitoring, debugging, and system diagnostics.439Skill(deploy *)

472```440```

473 441 

474## Examples442Permission syntax: `Skill(name)` for exact match, `Skill(name *)` for prefix match with any arguments.

475 443 

476### Simple Skill (single file)444**Hide individual skills** by adding `disable-model-invocation: true` to their frontmatter. This removes the skill from Claude's context entirely.

477 445 

478```446<Note>

479commit-helper/447 The `user-invocable` field only controls menu visibility, not Skill tool access. Use `disable-model-invocation: true` to block programmatic invocation.

480└── SKILL.md448</Note>

481```

482 449 

483```yaml theme={null}450## Share skills

484name: generating-commit-messages

485description: Generates clear commit messages from git diffs. Use when writing commit messages or reviewing staged changes.

486 451 

487# Generating Commit Messages452Skills can be distributed at different scopes depending on your audience:

488 453 

489## Instructions454* **Project skills**: Commit `.claude/skills/` to version control

455* **Plugins**: Create a `skills/` directory in your [plugin](/en/plugins)

456* **Managed**: Deploy organization-wide through [managed settings](/en/settings#settings-files)

490 457 

4911. Run `git diff --staged` to see changes458### Generate visual output

4922. I'll suggest a commit message with:

493 - Summary under 50 characters

494 - Detailed description

495 - Affected components

496 459 

497## Best practices460Skills can bundle and run scripts in any language, giving Claude capabilities beyond what's possible in a single prompt. One powerful pattern is generating visual output: interactive HTML files that open in your browser for exploring data, debugging, or creating reports.

498 461 

499- Use present tense462This example creates a codebase explorer: an interactive tree view where you can expand and collapse directories, see file sizes at a glance, and identify file types by color.

500- Explain what and why, not how

501```

502 463 

503### Skill with tool permissions464Create the Skill directory:

504 465 

505```466```bash theme={null}

506code-reviewer/467mkdir -p ~/.claude/skills/codebase-visualizer/scripts

507└── SKILL.md

508```468```

509 469 

510```yaml theme={null}470Create `~/.claude/skills/codebase-visualizer/SKILL.md`. The description tells Claude when to activate this Skill, and the instructions tell Claude to run the bundled script:

471 

472````yaml theme={null}

511---473---

512name: code-reviewer474name: codebase-visualizer

513description: Review code for best practices and potential issues. Use when reviewing code, checking PRs, or analyzing code quality.475description: Generate an interactive collapsible tree visualization of your codebase. Use when exploring a new repo, understanding project structure, or identifying large files.

514allowed-tools: Read, Grep, Glob476allowed-tools: Bash(python *)

515---477---

516 478 

517# Code Reviewer479# Codebase Visualizer

518 480 

519## Review checklist481Generate an interactive HTML tree view that shows your project's file structure with collapsible directories.

520 482 

5211. Code organization and structure483## Usage

5222. Error handling

5233. Performance considerations

5244. Security concerns

5255. Test coverage

526 484 

527## Instructions485Run the visualization script from your project root:

528 486 

5291. Read the target files using Read tool487```bash

5302. Search for patterns using Grep488python ~/.claude/skills/codebase-visualizer/scripts/visualize.py .

5313. Find related files using Glob

5324. Provide detailed feedback on code quality

533```489```

534 490 

535### Multi-file Skill491This creates `codebase-map.html` in the current directory and opens it in your default browser.

536 492 

537```493## What the visualization shows

538pdf-processing/

539├── SKILL.md

540├── FORMS.md

541├── REFERENCE.md

542└── scripts/

543 ├── fill_form.py

544 └── validate.py

545```

546 494 

547**SKILL.md**:495- **Collapsible directories**: Click folders to expand/collapse

548 496- **File sizes**: Displayed next to each file

549````yaml theme={null}497- **Colors**: Different colors for different file types

550name: pdf-processing498- **Directory totals**: Shows aggregate size of each folder

551description: Extract text, fill forms, merge PDFs. Use when working with PDF files, forms, or document extraction. Requires pypdf and pdfplumber packages.499````

552 500 

553# PDF Processing501Create `~/.claude/skills/codebase-visualizer/scripts/visualize.py`. This script scans a directory tree and generates a self-contained HTML file with:

502 

503* A **summary sidebar** showing file count, directory count, total size, and number of file types

504* A **bar chart** breaking down the codebase by file type (top 8 by size)

505* A **collapsible tree** where you can expand and collapse directories, with color-coded file type indicators

506 

507The script requires Python but uses only built-in libraries, so there are no packages to install:

508 

509```python expandable theme={null}

510#!/usr/bin/env python3

511"""Generate an interactive collapsible tree visualization of a codebase."""

512 

513import json

514import sys

515import webbrowser

516from pathlib import Path

517from collections import Counter

518 

519IGNORE = {'.git', 'node_modules', '__pycache__', '.venv', 'venv', 'dist', 'build'}

520 

521def scan(path: Path, stats: dict) -> dict:

522 result = {"name": path.name, "children": [], "size": 0}

523 try:

524 for item in sorted(path.iterdir()):

525 if item.name in IGNORE or item.name.startswith('.'):

526 continue

527 if item.is_file():

528 size = item.stat().st_size

529 ext = item.suffix.lower() or '(no ext)'

530 result["children"].append({"name": item.name, "size": size, "ext": ext})

531 result["size"] += size

532 stats["files"] += 1

533 stats["extensions"][ext] += 1

534 stats["ext_sizes"][ext] += size

535 elif item.is_dir():

536 stats["dirs"] += 1

537 child = scan(item, stats)

538 if child["children"]:

539 result["children"].append(child)

540 result["size"] += child["size"]

541 except PermissionError:

542 pass

543 return result

544 

545def generate_html(data: dict, stats: dict, output: Path) -> None:

546 ext_sizes = stats["ext_sizes"]

547 total_size = sum(ext_sizes.values()) or 1

548 sorted_exts = sorted(ext_sizes.items(), key=lambda x: -x[1])[:8]

549 colors = {

550 '.js': '#f7df1e', '.ts': '#3178c6', '.py': '#3776ab', '.go': '#00add8',

551 '.rs': '#dea584', '.rb': '#cc342d', '.css': '#264de4', '.html': '#e34c26',

552 '.json': '#6b7280', '.md': '#083fa1', '.yaml': '#cb171e', '.yml': '#cb171e',

553 '.mdx': '#083fa1', '.tsx': '#3178c6', '.jsx': '#61dafb', '.sh': '#4eaa25',

554 }

555 lang_bars = "".join(

556 f'<div class="bar-row"><span class="bar-label">{ext}</span>'

557 f'<div class="bar" style="width:{(size/total_size)*100}%;background:{colors.get(ext,"#6b7280")}"></div>'

558 f'<span class="bar-pct">{(size/total_size)*100:.1f}%</span></div>'

559 for ext, size in sorted_exts

560 )

561 def fmt(b):

562 if b < 1024: return f"{b} B"

563 if b < 1048576: return f"{b/1024:.1f} KB"

564 return f"{b/1048576:.1f} MB"

565 

566 html = f'''<!DOCTYPE html>

567<html><head>

568 <meta charset="utf-8"><title>Codebase Explorer</title>

569 <style>

570 body {{ font: 14px/1.5 system-ui, sans-serif; margin: 0; background: #1a1a2e; color: #eee; }}

571 .container {{ display: flex; height: 100vh; }}

572 .sidebar {{ width: 280px; background: #252542; padding: 20px; border-right: 1px solid #3d3d5c; overflow-y: auto; flex-shrink: 0; }}

573 .main {{ flex: 1; padding: 20px; overflow-y: auto; }}

574 h1 {{ margin: 0 0 10px 0; font-size: 18px; }}

575 h2 {{ margin: 20px 0 10px 0; font-size: 14px; color: #888; text-transform: uppercase; }}

576 .stat {{ display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #3d3d5c; }}

577 .stat-value {{ font-weight: bold; }}

578 .bar-row {{ display: flex; align-items: center; margin: 6px 0; }}

579 .bar-label {{ width: 55px; font-size: 12px; color: #aaa; }}

580 .bar {{ height: 18px; border-radius: 3px; }}

581 .bar-pct {{ margin-left: 8px; font-size: 12px; color: #666; }}

582 .tree {{ list-style: none; padding-left: 20px; }}

583 details {{ cursor: pointer; }}

584 summary {{ padding: 4px 8px; border-radius: 4px; }}

585 summary:hover {{ background: #2d2d44; }}

586 .folder {{ color: #ffd700; }}

587 .file {{ display: flex; align-items: center; padding: 4px 8px; border-radius: 4px; }}

588 .file:hover {{ background: #2d2d44; }}

589 .size {{ color: #888; margin-left: auto; font-size: 12px; }}

590 .dot {{ width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; }}

591 </style>

592</head><body>

593 <div class="container">

594 <div class="sidebar">

595 <h1>📊 Summary</h1>

596 <div class="stat"><span>Files</span><span class="stat-value">{stats["files"]:,}</span></div>

597 <div class="stat"><span>Directories</span><span class="stat-value">{stats["dirs"]:,}</span></div>

598 <div class="stat"><span>Total size</span><span class="stat-value">{fmt(data["size"])}</span></div>

599 <div class="stat"><span>File types</span><span class="stat-value">{len(stats["extensions"])}</span></div>

600 <h2>By file type</h2>

601 {lang_bars}

602 </div>

603 <div class="main">

604 <h1>📁 {data["name"]}</h1>

605 <ul class="tree" id="root"></ul>

606 </div>

607 </div>

608 <script>

609 const data = {json.dumps(data)};

610 const colors = {json.dumps(colors)};

611 function fmt(b) {{ if (b < 1024) return b + ' B'; if (b < 1048576) return (b/1024).toFixed(1) + ' KB'; return (b/1048576).toFixed(1) + ' MB'; }}

612 function render(node, parent) {{

613 if (node.children) {{

614 const det = document.createElement('details');

615 det.open = parent === document.getElementById('root');

616 det.innerHTML = `<summary><span class="folder">📁 ${{node.name}}</span><span class="size">${{fmt(node.size)}}</span></summary>`;

617 const ul = document.createElement('ul'); ul.className = 'tree';

618 node.children.sort((a,b) => (b.children?1:0)-(a.children?1:0) || a.name.localeCompare(b.name));

619 node.children.forEach(c => render(c, ul));

620 det.appendChild(ul);

621 const li = document.createElement('li'); li.appendChild(det); parent.appendChild(li);

622 }} else {{

623 const li = document.createElement('li'); li.className = 'file';

624 li.innerHTML = `<span class="dot" style="background:${{colors[node.ext]||'#6b7280'}}"></span>${{node.name}}<span class="size">${{fmt(node.size)}}</span>`;

625 parent.appendChild(li);

626 }}

627 }}

628 data.children.forEach(c => render(c, document.getElementById('root')));

629 </script>

630</body></html>'''

631 output.write_text(html)

632 

633if __name__ == '__main__':

634 target = Path(sys.argv[1] if len(sys.argv) > 1 else '.').resolve()

635 stats = {"files": 0, "dirs": 0, "extensions": Counter(), "ext_sizes": Counter()}

636 data = scan(target, stats)

637 out = Path('codebase-map.html')

638 generate_html(data, stats, out)

639 print(f'Generated {out.absolute()}')

640 webbrowser.open(f'file://{out.absolute()}')

641```

642 

643To test, open Claude Code in any project and ask "Visualize this codebase." Claude runs the script, generates `codebase-map.html`, and opens it in your browser.

644 

645This pattern works for any visual output: dependency graphs, test coverage reports, API documentation, or database schema visualizations. The bundled script does the heavy lifting while Claude handles orchestration.

554 646 

555## Quick start647## Troubleshooting

556 648 

557Extract text:649### Skill not triggering

558```python

559import pdfplumber

560with pdfplumber.open("doc.pdf") as pdf:

561 text = pdf.pages[0].extract_text()

562```

563 650 

564For form filling, see [FORMS.md](FORMS.md).651If Claude doesn't use your skill when expected:

565For detailed API reference, see [REFERENCE.md](REFERENCE.md).

566 652 

567## Requirements6531. Check the description includes keywords users would naturally say

6542. Verify the skill appears in `What skills are available?`

6553. Try rephrasing your request to match the description more closely

6564. Invoke it directly with `/skill-name` if the skill is user-invocable

568 657 

569Packages must be installed in your environment:658### Skill triggers too often

570```bash

571pip install pypdf pdfplumber

572```

573````

574 659 

575<Note>660If Claude uses your skill when you don't want it:

576 List required packages in the description. Packages must be installed in your environment before Claude can use them.

577</Note>

578 661 

579Claude loads additional files only when needed.6621. Make the description more specific

6632. Add `disable-model-invocation: true` if you only want manual invocation

580 664 

581## Next steps665### Claude doesn't see all my skills

582 666 

583<CardGroup cols={2}>667Skill descriptions are loaded into context so Claude knows what's available. If you have many skills, they may exceed the character budget. The budget scales dynamically at 2% of the context window, with a fallback of 16,000 characters. Run `/context` to check for a warning about excluded skills.

584 <Card title="Authoring best practices" icon="lightbulb" href="/en/docs/agents-and-tools/agent-skills/best-practices">

585 Write Skills that Claude can use effectively

586 </Card>

587 668 

588 <Card title="Agent Skills overview" icon="book" href="/en/docs/agents-and-tools/agent-skills/overview">669To override the limit, set the `SLASH_COMMAND_TOOL_CHAR_BUDGET` environment variable.

589 Learn how Skills work across Claude products

590 </Card>

591 670 

592 <Card title="Use Skills in the Agent SDK" icon="cube" href="/en/api/agent-sdk/skills">671## Related resources

593 Use Skills programmatically with TypeScript and Python

594 </Card>

595 672 

596 <Card title="Get started with Agent Skills" icon="rocket" href="/en/docs/agents-and-tools/agent-skills/quickstart">673* **[Subagents](/en/sub-agents)**: delegate tasks to specialized agents

597 Create your first Skill674* **[Plugins](/en/plugins)**: package and distribute skills with other extensions

598 </Card>675* **[Hooks](/en/hooks)**: automate workflows around tool events

599</CardGroup>676* **[Memory](/en/memory)**: manage CLAUDE.md files for persistent context

677* **[Interactive mode](/en/interactive-mode#built-in-commands)**: built-in commands and shortcuts

678* **[Permissions](/en/permissions)**: control tool and skill access

slack.md +235 −0 added

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Claude Code in Slack

6 

7> Delegate coding tasks directly from your Slack workspace

8 

9Claude Code in Slack brings the power of Claude Code directly into your Slack workspace. When you mention `@Claude` with a coding task, Claude automatically detects the intent and creates a Claude Code session on the web, allowing you to delegate development work without leaving your team conversations.

10 

11This integration is built on the existing Claude for Slack app but adds intelligent routing to Claude Code on the web for coding-related requests.

12 

13## Use cases

14 

15* **Bug investigation and fixes**: Ask Claude to investigate and fix bugs as soon as they're reported in Slack channels.

16* **Quick code reviews and modifications**: Have Claude implement small features or refactor code based on team feedback.

17* **Collaborative debugging**: When team discussions provide crucial context (e.g., error reproductions or user reports), Claude can use that information to inform its debugging approach.

18* **Parallel task execution**: Kick off coding tasks in Slack while you continue other work, receiving notifications when complete.

19 

20## Prerequisites

21 

22Before using Claude Code in Slack, ensure you have the following:

23 

24| Requirement | Details |

25| :--------------------- | :----------------------------------------------------------------------------- |

26| Claude Plan | Pro, Max, Teams, or Enterprise with Claude Code access (premium seats) |

27| Claude Code on the web | Access to [Claude Code on the web](/en/claude-code-on-the-web) must be enabled |

28| GitHub Account | Connected to Claude Code on the web with at least one repository authenticated |

29| Slack Authentication | Your Slack account linked to your Claude account via the Claude app |

30 

31## Setting up Claude Code in Slack

32 

33<Steps>

34 <Step title="Install the Claude App in Slack">

35 A workspace administrator must install the Claude app from the Slack App Marketplace. Visit the [Slack App Marketplace](https://slack.com/marketplace/A08SF47R6P4) and click "Add to Slack" to begin the installation process.

36 </Step>

37 

38 <Step title="Connect your Claude account">

39 After the app is installed, authenticate your individual Claude account:

40 

41 1. Open the Claude app in Slack by clicking on "Claude" in your Apps section

42 2. Navigate to the App Home tab

43 3. Click "Connect" to link your Slack account with your Claude account

44 4. Complete the authentication flow in your browser

45 </Step>

46 

47 <Step title="Configure Claude Code on the web">

48 Ensure your Claude Code on the web is properly configured:

49 

50 * Visit [claude.ai/code](https://claude.ai/code) and sign in with the same account you connected to Slack

51 * Connect your GitHub account if not already connected

52 * Authenticate at least one repository that you want Claude to work with

53 </Step>

54 

55 <Step title="Choose your routing mode">

56 After connecting your accounts, configure how Claude handles your messages in Slack. Navigate to the Claude App Home in Slack to find the **Routing Mode** setting.

57 

58 | Mode | Behavior |

59 | :-------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

60 | **Code only** | Claude routes all @mentions to Claude Code sessions. Best for teams using Claude in Slack exclusively for development tasks. |

61 | **Code + Chat** | Claude analyzes each message and intelligently routes between Claude Code (for coding tasks) and Claude Chat (for writing, analysis, and general questions). Best for teams who want a single @Claude entry point for all types of work. |

62 

63 <Note>

64 In Code + Chat mode, if Claude routes a message to Chat but you wanted a coding session, you can click "Retry as Code" to create a Claude Code session instead. Similarly, if it's routed to Code but you wanted a Chat session, you can choose that option in that thread.

65 </Note>

66 </Step>

67 

68 <Step title="Add Claude to channels">

69 Claude is not automatically added to any channels after installation. To use Claude in a channel, invite it by typing `/invite @Claude` in that channel. Claude can only respond to @mentions in channels where it has been added.

70 </Step>

71</Steps>

72 

73## How it works

74 

75### Automatic detection

76 

77When you mention @Claude in a Slack channel or thread, Claude automatically analyzes your message to determine if it's a coding task. If Claude detects coding intent, it will route your request to Claude Code on the web instead of responding as a regular chat assistant.

78 

79You can also explicitly tell Claude to handle a request as a coding task, even if it doesn't automatically detect it.

80 

81<Note>

82 Claude Code in Slack only works in channels (public or private). It does not work in direct messages (DMs).

83</Note>

84 

85### Context gathering

86 

87**From threads**: When you @mention Claude in a thread, it gathers context from all messages in that thread to understand the full conversation.

88 

89**From channels**: When mentioned directly in a channel, Claude looks at recent channel messages for relevant context.

90 

91This context helps Claude understand the problem, select the appropriate repository, and inform its approach to the task.

92 

93<Warning>

94 When @Claude is invoked in Slack, Claude is given access to the conversation context to better understand your request. Claude may follow directions from other messages in the context, so users should make sure to only use Claude in trusted Slack conversations.

95</Warning>

96 

97### Session flow

98 

991. **Initiation**: You @mention Claude with a coding request

1002. **Detection**: Claude analyzes your message and detects coding intent

1013. **Session creation**: A new Claude Code session is created on claude.ai/code

1024. **Progress updates**: Claude posts status updates to your Slack thread as work progresses

1035. **Completion**: When finished, Claude @mentions you with a summary and action buttons

1046. **Review**: Click "View Session" to see the full transcript, or "Create PR" to open a pull request

105 

106## User interface elements

107 

108### App Home

109 

110The App Home tab shows your connection status and allows you to connect or disconnect your Claude account from Slack.

111 

112### Message actions

113 

114* **View Session**: Opens the full Claude Code session in your browser where you can see all work performed, continue the session, or make additional requests.

115* **Create PR**: Creates a pull request directly from the session's changes.

116* **Retry as Code**: If Claude initially responds as a chat assistant but you wanted a coding session, click this button to retry the request as a Claude Code task.

117* **Change Repo**: Allows you to select a different repository if Claude chose incorrectly.

118 

119### Repository selection

120 

121Claude automatically selects a repository based on context from your Slack conversation. If multiple repositories could apply, Claude may display a dropdown allowing you to choose the correct one.

122 

123## Access and permissions

124 

125### User-level access

126 

127| Access Type | Requirement |

128| :------------------- | :-------------------------------------------------------------- |

129| Claude Code Sessions | Each user runs sessions under their own Claude account |

130| Usage & Rate Limits | Sessions count against the individual user's plan limits |

131| Repository Access | Users can only access repositories they've personally connected |

132| Session History | Sessions appear in your Claude Code history on claude.ai/code |

133 

134### Workspace-level access

135 

136Slack workspace administrators control whether the Claude app is available in their workspace:

137 

138| Control | Description |

139| :--------------------------- | :---------------------------------------------------------------------------------------------------------------- |

140| App installation | Workspace admins decide whether to install the Claude app from the Slack App Marketplace |

141| Enterprise Grid distribution | For Enterprise Grid organizations, organization admins can control which workspaces have access to the Claude app |

142| App removal | Removing the app from a workspace immediately revokes access for all users in that workspace |

143 

144### Channel-based access control

145 

146Claude is not automatically added to any channels after installation. Users must explicitly invite Claude to channels where they want to use it:

147 

148* **Invite required**: Type `/invite @Claude` in any channel to add Claude to that channel

149* **Channel membership controls access**: Claude can only respond to @mentions in channels where it has been added

150* **Access gating through channels**: Admins can control who uses Claude Code by managing which channels Claude is invited to and who has access to those channels

151* **Private channel support**: Claude works in both public and private channels, giving teams flexibility in controlling visibility

152 

153This channel-based model allows teams to restrict Claude Code usage to specific channels, providing an additional layer of access control beyond workspace-level permissions.

154 

155## What's accessible where

156 

157**In Slack**: You'll see status updates, completion summaries, and action buttons. The full transcript is preserved and always accessible.

158 

159**On the web**: The complete Claude Code session with full conversation history, all code changes, file operations, and the ability to continue the session or create pull requests.

160 

161For Enterprise and Teams accounts, sessions created from Claude in Slack are

162automatically visible to the organization. See [Claude Code on the Web sharing](/en/claude-code-on-the-web#sharing-sessions)

163for more details.

164 

165## Best practices

166 

167### Writing effective requests

168 

169* **Be specific**: Include file names, function names, or error messages when relevant.

170* **Provide context**: Mention the repository or project if it's not clear from the conversation.

171* **Define success**: Explain what "done" looks like—should Claude write tests? Update documentation? Create a PR?

172* **Use threads**: Reply in threads when discussing bugs or features so Claude can gather the full context.

173 

174### When to use Slack vs. web

175 

176**Use Slack when**: Context already exists in a Slack discussion, you want to kick off a task asynchronously, or you're collaborating with teammates who need visibility.

177 

178**Use the web directly when**: You need to upload files, want real-time interaction during development, or are working on longer, more complex tasks.

179 

180## Troubleshooting

181 

182### Sessions not starting

183 

1841. Verify your Claude account is connected in the Claude App Home

1852. Check that you have Claude Code on the web access enabled

1863. Ensure you have at least one GitHub repository connected to Claude Code

187 

188### Repository not showing

189 

1901. Connect the repository in Claude Code on the web at [claude.ai/code](https://claude.ai/code)

1912. Verify your GitHub permissions for that repository

1923. Try disconnecting and reconnecting your GitHub account

193 

194### Wrong repository selected

195 

1961. Click the "Change Repo" button to select a different repository

1972. Include the repository name in your request for more accurate selection

198 

199### Authentication errors

200 

2011. Disconnect and reconnect your Claude account in the App Home

2022. Ensure you're signed into the correct Claude account in your browser

2033. Check that your Claude plan includes Claude Code access

204 

205### Session expiration

206 

2071. Sessions remain accessible in your Claude Code history on the web

2082. You can continue or reference past sessions from [claude.ai/code](https://claude.ai/code)

209 

210## Current limitations

211 

212* **GitHub only**: Currently supports repositories on GitHub.

213* **One PR at a time**: Each session can create one pull request.

214* **Rate limits apply**: Sessions use your individual Claude plan's rate limits.

215* **Web access required**: Users must have Claude Code on the web access; those without it will only get standard Claude chat responses.

216 

217## Related resources

218 

219<CardGroup>

220 <Card title="Claude Code on the web" icon="globe" href="/en/claude-code-on-the-web">

221 Learn more about Claude Code on the web

222 </Card>

223 

224 <Card title="Claude for Slack" icon="slack" href="https://claude.com/claude-and-slack">

225 General Claude for Slack documentation

226 </Card>

227 

228 <Card title="Slack App Marketplace" icon="store" href="https://slack.com/marketplace/A08SF47R6P4">

229 Install the Claude app from the Slack Marketplace

230 </Card>

231 

232 <Card title="Claude Help Center" icon="circle-question" href="https://support.claude.com">

233 Get additional support

234 </Card>

235</CardGroup>

slash-commands.md +0 −482 deleted

File DeletedView Diff

1# Slash commands

2 

3> Control Claude's behavior during an interactive session with slash commands.

4 

5## Built-in slash commands

6 

7| Command | Purpose |

8| :------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------- |

9| `/add-dir` | Add additional working directories |

10| `/agents` | Manage custom AI subagents for specialized tasks |

11| `/bug` | Report bugs (sends conversation to Anthropic) |

12| `/clear` | Clear conversation history |

13| `/compact [instructions]` | Compact conversation with optional focus instructions |

14| `/config` | Open the Settings interface (Config tab) |

15| `/cost` | Show token usage statistics (see [cost tracking guide](/en/docs/claude-code/costs#using-the-cost-command) for subscription-specific details) |

16| `/doctor` | Checks the health of your Claude Code installation |

17| `/help` | Get usage help |

18| `/init` | Initialize project with CLAUDE.md guide |

19| `/login` | Switch Anthropic accounts |

20| `/logout` | Sign out from your Anthropic account |

21| `/mcp` | Manage MCP server connections and OAuth authentication |

22| `/memory` | Edit CLAUDE.md memory files |

23| `/model` | Select or change the AI model |

24| `/permissions` | View or update [permissions](/en/docs/claude-code/iam#configuring-permissions) |

25| `/pr_comments` | View pull request comments |

26| `/review` | Request code review |

27| `/sandbox` | Enable sandboxed bash tool with filesystem and network isolation for safer, more autonomous execution |

28| `/rewind` | Rewind the conversation and/or code |

29| `/status` | Open the Settings interface (Status tab) showing version, model, account, and connectivity |

30| `/terminal-setup` | Install Shift+Enter key binding for newlines (iTerm2 and VSCode only) |

31| `/usage` | Show plan usage limits and rate limit status (subscription plans only) |

32| `/vim` | Enter vim mode for alternating insert and command modes |

33 

34## Custom slash commands

35 

36Custom slash commands allow you to define frequently-used prompts as Markdown files that Claude Code can execute. Commands are organized by scope (project-specific or personal) and support namespacing through directory structures.

37 

38### Syntax

39 

40```

41/<command-name> [arguments]

42```

43 

44#### Parameters

45 

46| Parameter | Description |

47| :--------------- | :---------------------------------------------------------------- |

48| `<command-name>` | Name derived from the Markdown filename (without `.md` extension) |

49| `[arguments]` | Optional arguments passed to the command |

50 

51### Command types

52 

53#### Project commands

54 

55Commands stored in your repository and shared with your team. When listed in `/help`, these commands show "(project)" after their description.

56 

57**Location**: `.claude/commands/`

58 

59In the following example, we create the `/optimize` command:

60 

61```bash theme={null}

62# Create a project command

63mkdir -p .claude/commands

64echo "Analyze this code for performance issues and suggest optimizations:" > .claude/commands/optimize.md

65```

66 

67#### Personal commands

68 

69Commands available across all your projects. When listed in `/help`, these commands show "(user)" after their description.

70 

71**Location**: `~/.claude/commands/`

72 

73In the following example, we create the `/security-review` command:

74 

75```bash theme={null}

76# Create a personal command

77mkdir -p ~/.claude/commands

78echo "Review this code for security vulnerabilities:" > ~/.claude/commands/security-review.md

79```

80 

81### Features

82 

83#### Namespacing

84 

85Organize commands in subdirectories. The subdirectories are used for organization and appear in the command description, but they do not affect the command name itself. The description will show whether the command comes from the project directory (`.claude/commands`) or the user-level directory (`~/.claude/commands`), along with the subdirectory name.

86 

87Conflicts between user and project level commands are not supported. Otherwise, multiple commands with the same base file name can coexist.

88 

89For example, a file at `.claude/commands/frontend/component.md` creates the command `/component` with description showing "(project:frontend)".

90Meanwhile, a file at `~/.claude/commands/component.md` creates the command `/component` with description showing "(user)".

91 

92#### Arguments

93 

94Pass dynamic values to commands using argument placeholders:

95 

96##### All arguments with `$ARGUMENTS`

97 

98The `$ARGUMENTS` placeholder captures all arguments passed to the command:

99 

100```bash theme={null}

101# Command definition

102echo 'Fix issue #$ARGUMENTS following our coding standards' > .claude/commands/fix-issue.md

103 

104# Usage

105> /fix-issue 123 high-priority

106# $ARGUMENTS becomes: "123 high-priority"

107```

108 

109##### Individual arguments with `$1`, `$2`, etc.

110 

111Access specific arguments individually using positional parameters (similar to shell scripts):

112 

113```bash theme={null}

114# Command definition

115echo 'Review PR #$1 with priority $2 and assign to $3' > .claude/commands/review-pr.md

116 

117# Usage

118> /review-pr 456 high alice

119# $1 becomes "456", $2 becomes "high", $3 becomes "alice"

120```

121 

122Use positional arguments when you need to:

123 

124* Access arguments individually in different parts of your command

125* Provide defaults for missing arguments

126* Build more structured commands with specific parameter roles

127 

128#### Bash command execution

129 

130Execute bash commands before the slash command runs using the `!` prefix. The output is included in the command context. You *must* include `allowed-tools` with the `Bash` tool, but you can choose the specific bash commands to allow.

131 

132For example:

133 

134```markdown theme={null}

135allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)

136description: Create a git commit

137 

138## Context

139 

140- Current git status: !`git status`

141- Current git diff (staged and unstaged changes): !`git diff HEAD`

142- Current branch: !`git branch --show-current`

143- Recent commits: !`git log --oneline -10`

144 

145## Your task

146 

147Based on the above changes, create a single git commit.

148```

149 

150#### File references

151 

152Include file contents in commands using the `@` prefix to [reference files](/en/docs/claude-code/common-workflows#reference-files-and-directories).

153 

154For example:

155 

156```markdown theme={null}

157# Reference a specific file

158 

159Review the implementation in @src/utils/helpers.js

160 

161# Reference multiple files

162 

163Compare @src/old-version.js with @src/new-version.js

164```

165 

166#### Thinking mode

167 

168Slash commands can trigger extended thinking by including [extended thinking keywords](/en/docs/claude-code/common-workflows#use-extended-thinking).

169 

170### Frontmatter

171 

172Command files support frontmatter, useful for specifying metadata about the command:

173 

174| Frontmatter | Purpose | Default |

175| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------- |

176| `allowed-tools` | List of tools the command can use | Inherits from the conversation |

177| `argument-hint` | The arguments expected for the slash command. Example: `argument-hint: add [tagId] \| remove [tagId] \| list`. This hint is shown to the user when auto-completing the slash command. | None |

178| `description` | Brief description of the command | Uses the first line from the prompt |

179| `model` | Specific model string (see [Models overview](/en/docs/about-claude/models/overview)) | Inherits from the conversation |

180| `disable-model-invocation` | Whether to prevent `SlashCommand` tool from calling this command | false |

181 

182For example:

183 

184```markdown theme={null}

185allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)

186argument-hint: [message]

187description: Create a git commit

188model: claude-3-5-haiku-20241022

189 

190Create a git commit with message: $ARGUMENTS

191```

192 

193Example using positional arguments:

194 

195```markdown theme={null}

196argument-hint: [pr-number] [priority] [assignee]

197description: Review pull request

198 

199Review PR #$1 with priority $2 and assign to $3.

200Focus on security, performance, and code style.

201```

202 

203## Plugin commands

204 

205[Plugins](/en/docs/claude-code/plugins) can provide custom slash commands that integrate seamlessly with Claude Code. Plugin commands work exactly like user-defined commands but are distributed through [plugin marketplaces](/en/docs/claude-code/plugin-marketplaces).

206 

207### How plugin commands work

208 

209Plugin commands are:

210 

211* **Namespaced**: Commands can use the format `/plugin-name:command-name` to avoid conflicts (plugin prefix is optional unless there are name collisions)

212* **Automatically available**: Once a plugin is installed and enabled, its commands appear in `/help`

213* **Fully integrated**: Support all command features (arguments, frontmatter, bash execution, file references)

214 

215### Plugin command structure

216 

217**Location**: `commands/` directory in plugin root

218 

219**File format**: Markdown files with frontmatter

220 

221**Basic command structure**:

222 

223```markdown theme={null}

224description: Brief description of what the command does

225 

226# Command Name

227 

228Detailed instructions for Claude on how to execute this command.

229Include specific guidance on parameters, expected outcomes, and any special considerations.

230```

231 

232**Advanced command features**:

233 

234* **Arguments**: Use placeholders like `{arg1}` in command descriptions

235* **Subdirectories**: Organize commands in subdirectories for namespacing

236* **Bash integration**: Commands can execute shell scripts and programs

237* **File references**: Commands can reference and modify project files

238 

239### Invocation patterns

240 

241```shell Direct command (when no conflicts) theme={null}

242/command-name

243```

244 

245```shell Plugin-prefixed (when needed for disambiguation) theme={null}

246/plugin-name:command-name

247```

248 

249```shell With arguments (if command supports them) theme={null}

250/command-name arg1 arg2

251```

252 

253## MCP slash commands

254 

255MCP servers can expose prompts as slash commands that become available in Claude Code. These commands are dynamically discovered from connected MCP servers.

256 

257### Command format

258 

259MCP commands follow the pattern:

260 

261```

262/mcp__<server-name>__<prompt-name> [arguments]

263```

264 

265### Features

266 

267#### Dynamic discovery

268 

269MCP commands are automatically available when:

270 

271* An MCP server is connected and active

272* The server exposes prompts through the MCP protocol

273* The prompts are successfully retrieved during connection

274 

275#### Arguments

276 

277MCP prompts can accept arguments defined by the server:

278 

279```

280# Without arguments

281> /mcp__github__list_prs

282 

283# With arguments

284> /mcp__github__pr_review 456

285> /mcp__jira__create_issue "Bug title" high

286```

287 

288#### Naming conventions

289 

290* Server and prompt names are normalized

291* Spaces and special characters become underscores

292* Names are lowercased for consistency

293 

294### Managing MCP connections

295 

296Use the `/mcp` command to:

297 

298* View all configured MCP servers

299* Check connection status

300* Authenticate with OAuth-enabled servers

301* Clear authentication tokens

302* View available tools and prompts from each server

303 

304### MCP permissions and wildcards

305 

306When configuring [permissions for MCP tools](/en/docs/claude-code/iam#tool-specific-permission-rules), note that **wildcards are not supported**:

307 

308* ✅ **Correct**: `mcp__github` (approves ALL tools from the github server)

309* ✅ **Correct**: `mcp__github__get_issue` (approves specific tool)

310* ❌ **Incorrect**: `mcp__github__*` (wildcards not supported)

311 

312To approve all tools from an MCP server, use just the server name: `mcp__servername`. To approve specific tools only, list each tool individually.

313 

314## `SlashCommand` tool

315 

316The `SlashCommand` tool allows Claude to execute [custom slash commands](/en/docs/claude-code/slash-commands#custom-slash-commands) programmatically

317during a conversation. This gives Claude the ability to invoke custom commands

318on your behalf when appropriate.

319 

320To encourage Claude to trigger `SlashCommand` tool, your instructions (prompts,

321CLAUDE.md, etc.) generally need to reference the command by name with its slash.

322 

323Example:

324 

325```

326> Run /write-unit-test when you are about to start writing tests.

327```

328 

329This tool puts each available custom slash command's metadata into context up to the

330character budget limit. You can use `/context` to monitor token usage and follow

331the operations below to manage context.

332 

333### `SlashCommand` tool supported commands

334 

335`SlashCommand` tool only supports custom slash commands that:

336 

337* Are user-defined. Built-in commands like `/compact` and `/init` are *not* supported.

338* Have the `description` frontmatter field populated. We use the `description` in the context.

339 

340For Claude Code versions >= 1.0.124, you can see which custom slash commands

341`SlashCommand` tool can invoke by running `claude --debug` and triggering a query.

342 

343### Disable `SlashCommand` tool

344 

345To prevent Claude from executing any slash commands via the tool:

346 

347```bash theme={null}

348/permissions

349# Add to deny rules: SlashCommand

350```

351 

352This will also remove SlashCommand tool (and the slash command descriptions) from context.

353 

354### Disable specific commands only

355 

356To prevent a specific slash command from becoming available, add

357`disable-model-invocation: true` to the slash command's frontmatter.

358 

359This will also remove the command's metadata from context.

360 

361### `SlashCommand` permission rules

362 

363The permission rules support:

364 

365* **Exact match**: `SlashCommand:/commit` (allows only `/commit` with no arguments)

366* **Prefix match**: `SlashCommand:/review-pr:*` (allows `/review-pr` with any arguments)

367 

368### Character budget limit

369 

370The `SlashCommand` tool includes a character budget to limit the size of command

371descriptions shown to Claude. This prevents token overflow when many commands

372are available.

373 

374The budget includes each custom slash command's name, args, and description.

375 

376* **Default limit**: 15,000 characters

377* **Custom limit**: Set via `SLASH_COMMAND_TOOL_CHAR_BUDGET` environment variable

378 

379When the character budget is exceeded, Claude will see only a subset of the

380available commands. In `/context`, a warning will show with "M of N commands".

381 

382## Skills vs slash commands

383 

384**Slash commands** and **Agent Skills** serve different purposes in Claude Code:

385 

386### Use slash commands for

387 

388**Quick, frequently-used prompts**:

389 

390* Simple prompt snippets you use often

391* Quick reminders or templates

392* Frequently-used instructions that fit in one file

393 

394**Examples**:

395 

396* `/review` → "Review this code for bugs and suggest improvements"

397* `/explain` → "Explain this code in simple terms"

398* `/optimize` → "Analyze this code for performance issues"

399 

400### Use Skills for

401 

402**Comprehensive capabilities with structure**:

403 

404* Complex workflows with multiple steps

405* Capabilities requiring scripts or utilities

406* Knowledge organized across multiple files

407* Team workflows you want to standardize

408 

409**Examples**:

410 

411* PDF processing Skill with form-filling scripts and validation

412* Data analysis Skill with reference docs for different data types

413* Documentation Skill with style guides and templates

414 

415### Key differences

416 

417| Aspect | Slash Commands | Agent Skills |

418| -------------- | -------------------------------- | ----------------------------------- |

419| **Complexity** | Simple prompts | Complex capabilities |

420| **Structure** | Single .md file | Directory with SKILL.md + resources |

421| **Discovery** | Explicit invocation (`/command`) | Automatic (based on context) |

422| **Files** | One file only | Multiple files, scripts, templates |

423| **Scope** | Project or personal | Project or personal |

424| **Sharing** | Via git | Via git |

425 

426### Example comparison

427 

428**As a slash command**:

429 

430```markdown theme={null}

431# .claude/commands/review.md

432Review this code for:

433- Security vulnerabilities

434- Performance issues

435- Code style violations

436```

437 

438Usage: `/review` (manual invocation)

439 

440**As a Skill**:

441 

442```

443.claude/skills/code-review/

444├── SKILL.md (overview and workflows)

445├── SECURITY.md (security checklist)

446├── PERFORMANCE.md (performance patterns)

447├── STYLE.md (style guide reference)

448└── scripts/

449 └── run-linters.sh

450```

451 

452Usage: "Can you review this code?" (automatic discovery)

453 

454The Skill provides richer context, validation scripts, and organized reference material.

455 

456### When to use each

457 

458**Use slash commands**:

459 

460* You invoke the same prompt repeatedly

461* The prompt fits in a single file

462* You want explicit control over when it runs

463 

464**Use Skills**:

465 

466* Claude should discover the capability automatically

467* Multiple files or scripts are needed

468* Complex workflows with validation steps

469* Team needs standardized, detailed guidance

470 

471Both slash commands and Skills can coexist. Use the approach that fits your needs.

472 

473Learn more about [Agent Skills](/en/docs/claude-code/skills).

474 

475## See also

476 

477* [Plugins](/en/docs/claude-code/plugins) - Extend Claude Code with custom commands through plugins

478* [Identity and Access Management](/en/docs/claude-code/iam) - Complete guide to permissions, including MCP tool permissions

479* [Interactive mode](/en/docs/claude-code/interactive-mode) - Shortcuts, input modes, and interactive features

480* [CLI reference](/en/docs/claude-code/cli-reference) - Command-line flags and options

481* [Settings](/en/docs/claude-code/settings) - Configuration options

482* [Memory management](/en/docs/claude-code/memory) - Managing Claude's memory across sessions

statusline.md +772 −124

Details

1# Status line configuration1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Create a custom status line for Claude Code to display contextual information5# Customize your status line

4 6 

5Make Claude Code your own with a custom status line that displays at the bottom of the Claude Code interface, similar to how terminal prompts (PS1) work in shells like Oh-my-zsh.7> Configure a custom status bar to monitor context window usage, costs, and git status in Claude Code

6 8 

7## Create a custom status line9The status line is a customizable bar at the bottom of Claude Code that runs any shell script you configure. It receives JSON session data on stdin and displays whatever your script prints, giving you a persistent, at-a-glance view of context usage, costs, git status, or anything else you want to track.

8 10 

9You can either:11Status lines are useful when you:

10 12 

11* Run `/statusline` to ask Claude Code to help you set up a custom status line. By default, it will try to reproduce your terminal's prompt, but you can provide additional instructions about the behavior you want to Claude Code, such as `/statusline show the model name in orange`13* Want to monitor context window usage as you work

14* Need to track session costs

15* Work across multiple sessions and need to distinguish them

16* Want git branch and status always visible

12 17 

13* Directly add a `statusLine` command to your `.claude/settings.json`:18Here's an example of a [multi-line status line](#display-multiple-lines) that displays git info on the first line and a color-coded context bar on the second.

19 

20<Frame>

21 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=60f11387658acc9ff75158ae85f2ac87" alt="A multi-line status line showing model name, directory, git branch on the first line, and a context usage progress bar with cost and duration on the second line" data-og-width="776" width="776" data-og-height="212" height="212" data-path="images/statusline-multiline.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=280&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=2e448b44c332620e6c9c2be4ded992e5 280w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=560&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=f796af2db9c68ab2ddbc5136840b9551 560w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=840&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=d29c13d6164773198a0b2c47b31f6c09 840w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=1100&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=d7720e5f51310185c0c02152f6c10d8b 1100w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=1650&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=b4e008cde27990a8d5783e41e5b93246 1650w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=2500&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=40ab24813303dc2e4c09f2675f3faf6e 2500w" />

22</Frame>

23 

24This page walks through [setting up a basic status line](#set-up-a-status-line), explains [how the data flows](#how-status-lines-work) from Claude Code to your script, lists [all the fields you can display](#available-data), and provides [ready-to-use examples](#examples) for common patterns like git status, cost tracking, and progress bars.

25 

26## Set up a status line

27 

28Use the [`/statusline` command](#use-the-statusline-command) to have Claude Code generate a script for you, or [manually create a script](#manually-configure-a-status-line) and add it to your settings.

29 

30### Use the /statusline command

31 

32The `/statusline` command accepts natural language instructions describing what you want displayed. Claude Code generates a script file in `~/.claude/` and updates your settings automatically:

33 

34```

35/statusline show model name and context percentage with a progress bar

36```

37 

38### Manually configure a status line

39 

40Add a `statusLine` field to your user settings (`~/.claude/settings.json`, where `~` is your home directory) or [project settings](/en/settings#settings-files). Set `type` to `"command"` and point `command` to a script path or an inline shell command. For a full walkthrough of creating a script, see [Build a status line step by step](#build-a-status-line-step-by-step).

14 41 

15```json theme={null}42```json theme={null}

16{43{

17 "statusLine": {44 "statusLine": {

18 "type": "command",45 "type": "command",

19 "command": "~/.claude/statusline.sh",46 "command": "~/.claude/statusline.sh",

20 "padding": 0 // Optional: set to 0 to let status line go to edge47 "padding": 2

21 }48 }

22}49}

23```50```

24 51 

25## How it Works52The `command` field runs in a shell, so you can also use inline commands instead of a script file. This example uses `jq` to parse the JSON input and display the model name and context percentage:

26 53 

27* The status line is updated when the conversation messages update54```json theme={null}

28* Updates run at most every 300ms55{

29* The first line of stdout from your command becomes the status line text56 "statusLine": {

30* ANSI color codes are supported for styling your status line57 "type": "command",

31* Claude Code passes contextual information about the current session (model, directories, etc.) as JSON to your script via stdin58 "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"

59 }

60}

61```

32 62 

33## JSON Input Structure63The optional `padding` field adds extra horizontal spacing (in characters) to the status line content. Defaults to `0`. This padding is in addition to the interface's built-in spacing, so it controls relative indentation rather than absolute distance from the terminal edge.

34 64 

35Your status line command receives structured data via stdin in JSON format:65### Disable the status line

36 66 

37```json theme={null}67Run `/statusline` and ask it to remove or clear your status line (e.g., `/statusline delete`, `/statusline clear`, `/statusline remove it`). You can also manually delete the `statusLine` field from your settings.json.

38{68 

39 "hook_event_name": "Status",69## Build a status line step by step

40 "session_id": "abc123...",70 

41 "transcript_path": "/path/to/transcript.json",71This walkthrough shows what's happening under the hood by manually creating a status line that displays the current model, working directory, and context window usage percentage.

72 

73<Note>Running [`/statusline`](#use-the-statusline-command) with a description of what you want configures all of this for you automatically.</Note>

74 

75These examples use Bash scripts, which work on macOS and Linux. On Windows, you can run Bash scripts through [WSL (Windows Subsystem for Linux)](https://learn.microsoft.com/en-us/windows/wsl/install) or rewrite them in PowerShell.

76 

77<Frame>

78 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-quickstart.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=696445e59ca0059213250651ad23db6b" alt="A status line showing model name, directory, and context percentage" data-og-width="726" width="726" data-og-height="164" height="164" data-path="images/statusline-quickstart.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-quickstart.png?w=280&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=728c4bd06c8559cb46ddffffad983373 280w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-quickstart.png?w=560&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=f9d28e0f8f48f695167dd1d632a6cf4f 560w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-quickstart.png?w=840&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=57a2803a18cafe8cf1aa05619444f20c 840w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-quickstart.png?w=1100&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=52cdd52865842f0cda24489dd5310d3b 1100w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-quickstart.png?w=1650&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=f8876ea1f72bf40bd0aeec483ee20164 1650w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-quickstart.png?w=2500&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=6b1524305c7c71122cde65d0c3822374 2500w" />

79</Frame>

80 

81<Steps>

82 <Step title="Create a script that reads JSON and prints output">

83 Claude Code sends JSON data to your script via stdin. This script uses [`jq`](https://jqlang.github.io/jq/), a command-line JSON parser you may need to install, to extract the model name, directory, and context percentage, then prints a formatted line.

84 

85 Save this to `~/.claude/statusline.sh` (where `~` is your home directory, such as `/Users/username` on macOS or `/home/username` on Linux):

86 

87 ```bash theme={null}

88 #!/bin/bash

89 # Read JSON data that Claude Code sends to stdin

90 input=$(cat)

91 

92 # Extract fields using jq

93 MODEL=$(echo "$input" | jq -r '.model.display_name')

94 DIR=$(echo "$input" | jq -r '.workspace.current_dir')

95 # The "// 0" provides a fallback if the field is null

96 PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

97 

98 # Output the status line - ${DIR##*/} extracts just the folder name

99 echo "[$MODEL] 📁 ${DIR##*/} | ${PCT}% context"

100 ```

101 </Step>

102 

103 <Step title="Make it executable">

104 Mark the script as executable so your shell can run it:

105 

106 ```bash theme={null}

107 chmod +x ~/.claude/statusline.sh

108 ```

109 </Step>

110 

111 <Step title="Add to settings">

112 Tell Claude Code to run your script as the status line. Add this configuration to `~/.claude/settings.json`, which sets `type` to `"command"` (meaning "run this shell command") and points `command` to your script:

113 

114 ```json theme={null}

115 {

116 "statusLine": {

117 "type": "command",

118 "command": "~/.claude/statusline.sh"

119 }

120 }

121 ```

122 

123 Your status line appears at the bottom of the interface. Settings reload automatically, but changes won't appear until your next interaction with Claude Code.

124 </Step>

125</Steps>

126 

127## How status lines work

128 

129Claude Code runs your script and pipes [JSON session data](#available-data) to it via stdin. Your script reads the JSON, extracts what it needs, and prints text to stdout. Claude Code displays whatever your script prints.

130 

131**When it updates**

132 

133Your script runs after each new assistant message, when the permission mode changes, or when vim mode toggles. Updates are debounced at 300ms, meaning rapid changes batch together and your script runs once things settle. If a new update triggers while your script is still running, the in-flight execution is cancelled. If you edit your script, the changes won't appear until your next interaction with Claude Code triggers an update.

134 

135**What your script can output**

136 

137* **Multiple lines**: each `echo` or `print` statement displays as a separate row. See the [multi-line example](#display-multiple-lines).

138* **Colors**: use [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) like `\033[32m` for green (terminal must support them). See the [git status example](#git-status-with-colors).

139* **Links**: use [OSC 8 escape sequences](https://en.wikipedia.org/wiki/ANSI_escape_code#OSC) to make text clickable (Cmd+click on macOS, Ctrl+click on Windows/Linux). Requires a terminal that supports hyperlinks like iTerm2, Kitty, or WezTerm. See the [clickable links example](#clickable-links).

140 

141<Note>The status line runs locally and does not consume API tokens. It temporarily hides during certain UI interactions, including autocomplete suggestions, the help menu, and permission prompts.</Note>

142 

143## Available data

144 

145Claude Code sends the following JSON fields to your script via stdin:

146 

147| Field | Description |

148| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

149| `model.id`, `model.display_name` | Current model identifier and display name |

150| `cwd`, `workspace.current_dir` | Current working directory. Both fields contain the same value; `workspace.current_dir` is preferred for consistency with `workspace.project_dir`. |

151| `workspace.project_dir` | Directory where Claude Code was launched, which may differ from `cwd` if the working directory changes during a session |

152| `cost.total_cost_usd` | Total session cost in USD |

153| `cost.total_duration_ms` | Total wall-clock time since the session started, in milliseconds |

154| `cost.total_api_duration_ms` | Total time spent waiting for API responses in milliseconds |

155| `cost.total_lines_added`, `cost.total_lines_removed` | Lines of code changed |

156| `context_window.total_input_tokens`, `context_window.total_output_tokens` | Cumulative token counts across the session |

157| `context_window.context_window_size` | Maximum context window size in tokens. 200000 by default, or 1000000 for models with extended context. |

158| `context_window.used_percentage` | Pre-calculated percentage of context window used |

159| `context_window.remaining_percentage` | Pre-calculated percentage of context window remaining |

160| `context_window.current_usage` | Token counts from the last API call, described in [context window fields](#context-window-fields) |

161| `exceeds_200k_tokens` | Whether the total token count (input, cache, and output tokens combined) from the most recent API response exceeds 200k. This is a fixed threshold regardless of actual context window size. |

162| `session_id` | Unique session identifier |

163| `transcript_path` | Path to conversation transcript file |

164| `version` | Claude Code version |

165| `output_style.name` | Name of the current output style |

166| `vim.mode` | Current vim mode (`NORMAL` or `INSERT`) when [vim mode](/en/interactive-mode#vim-editor-mode) is enabled |

167| `agent.name` | Agent name when running with the `--agent` flag or agent settings configured |

168 

169<Accordion title="Full JSON schema">

170 Your status line command receives this JSON structure via stdin:

171 

172 ```json theme={null}

173 {

42 "cwd": "/current/working/directory",174 "cwd": "/current/working/directory",

175 "session_id": "abc123...",

176 "transcript_path": "/path/to/transcript.jsonl",

43 "model": {177 "model": {

44 "id": "claude-opus-4-1",178 "id": "claude-opus-4-6",

45 "display_name": "Opus"179 "display_name": "Opus"

46 },180 },

47 "workspace": {181 "workspace": {


58 "total_api_duration_ms": 2300,192 "total_api_duration_ms": 2300,

59 "total_lines_added": 156,193 "total_lines_added": 156,

60 "total_lines_removed": 23194 "total_lines_removed": 23

195 },

196 "context_window": {

197 "total_input_tokens": 15234,

198 "total_output_tokens": 4521,

199 "context_window_size": 200000,

200 "used_percentage": 8,

201 "remaining_percentage": 92,

202 "current_usage": {

203 "input_tokens": 8500,

204 "output_tokens": 1200,

205 "cache_creation_input_tokens": 5000,

206 "cache_read_input_tokens": 2000

61 }207 }

62}208 },

63```209 "exceeds_200k_tokens": false,

210 "vim": {

211 "mode": "NORMAL"

212 },

213 "agent": {

214 "name": "security-reviewer"

215 }

216 }

217 ```

64 218 

65## Example Scripts219 **Fields that may be absent** (not present in JSON):

66 220 

67### Simple Status Line221 * `vim`: appears only when vim mode is enabled

222 * `agent`: appears only when running with the `--agent` flag or agent settings configured

68 223 

69```bash theme={null}224 **Fields that may be `null`**:

70#!/bin/bash

71# Read JSON input from stdin

72input=$(cat)

73 225 

74# Extract values using jq226 * `context_window.current_usage`: `null` before the first API call in a session

75MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')227 * `context_window.used_percentage`, `context_window.remaining_percentage`: may be `null` early in the session

76CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

77 228 

78echo "[$MODEL_DISPLAY] 📁 ${CURRENT_DIR##*/}"229 Handle missing fields with conditional access and null values with fallback defaults in your scripts.

79```230</Accordion>

231 

232### Context window fields

233 

234The `context_window` object provides two ways to track context usage:

235 

236* **Cumulative totals** (`total_input_tokens`, `total_output_tokens`): sum of all tokens across the entire session, useful for tracking total consumption

237* **Current usage** (`current_usage`): token counts from the most recent API call, use this for accurate context percentage since it reflects the actual context state

238 

239The `current_usage` object contains:

240 

241* `input_tokens`: input tokens in current context

242* `output_tokens`: output tokens generated

243* `cache_creation_input_tokens`: tokens written to cache

244* `cache_read_input_tokens`: tokens read from cache

245 

246The `used_percentage` field is calculated from input tokens only: `input_tokens + cache_creation_input_tokens + cache_read_input_tokens`. It does not include `output_tokens`.

247 

248If you calculate context percentage manually from `current_usage`, use the same input-only formula to match `used_percentage`.

249 

250The `current_usage` object is `null` before the first API call in a session.

251 

252## Examples

253 

254These examples show common status line patterns. To use any example:

255 

2561. Save the script to a file like `~/.claude/statusline.sh` (or `.py`/`.js`)

2572. Make it executable: `chmod +x ~/.claude/statusline.sh`

2583. Add the path to your [settings](#manually-configure-a-status-line)

259 

260The Bash examples use [`jq`](https://jqlang.github.io/jq/) to parse JSON. Python and Node.js have built-in JSON parsing.

261 

262### Context window usage

263 

264Display the current model and context window usage with a visual progress bar. Each script reads JSON from stdin, extracts the `used_percentage` field, and builds a 10-character bar where filled blocks (▓) represent usage:

265 

266<Frame>

267 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-context-window-usage.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=15b58ab3602f036939145dde3165c6f7" alt="A status line showing model name and a progress bar with percentage" data-og-width="448" width="448" data-og-height="152" height="152" data-path="images/statusline-context-window-usage.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-context-window-usage.png?w=280&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=a18fecd31f06b16e984b1ab3310acbc0 280w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-context-window-usage.png?w=560&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=2f4b3caff156efede2ded995dbaf167f 560w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-context-window-usage.png?w=840&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=8f6b8c7e7d3a999c570e96ad2ea13d5a 840w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-context-window-usage.png?w=1100&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=d9334e6a08e6f11a253733c8592774a9 1100w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-context-window-usage.png?w=1650&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=e79490da8f62952e4d92837c408e63dc 1650w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-context-window-usage.png?w=2500&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=6f7c9ef8e629a794969c54b24163f92d 2500w" />

268</Frame>

269 

270<CodeGroup>

271 ```bash Bash theme={null}

272 #!/bin/bash

273 # Read all of stdin into a variable

274 input=$(cat)

275 

276 # Extract fields with jq, "// 0" provides fallback for null

277 MODEL=$(echo "$input" | jq -r '.model.display_name')

278 PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

279 

280 # Build progress bar: printf creates spaces, tr replaces with blocks

281 BAR_WIDTH=10

282 FILLED=$((PCT * BAR_WIDTH / 100))

283 EMPTY=$((BAR_WIDTH - FILLED))

284 BAR=""

285 [ "$FILLED" -gt 0 ] && BAR=$(printf "%${FILLED}s" | tr ' ' '▓')

286 [ "$EMPTY" -gt 0 ] && BAR="${BAR}$(printf "%${EMPTY}s" | tr ' ' '░')"

287 

288 echo "[$MODEL] $BAR $PCT%"

289 ```

290 

291 ```python Python theme={null}

292 #!/usr/bin/env python3

293 import json, sys

80 294 

81### Git-Aware Status Line295 # json.load reads and parses stdin in one step

296 data = json.load(sys.stdin)

297 model = data['model']['display_name']

298 # "or 0" handles null values

299 pct = int(data.get('context_window', {}).get('used_percentage', 0) or 0)

82 300 

83```bash theme={null}301 # String multiplication builds the bar

84#!/bin/bash302 filled = pct * 10 // 100

85# Read JSON input from stdin303 bar = '▓' * filled + '░' * (10 - filled)

86input=$(cat)

87 304 

88# Extract values using jq305 print(f"[{model}] {bar} {pct}%")

89MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')306 ```

90CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

91 307 

92# Show git branch if in a git repo308 ```javascript Node.js theme={null}

93GIT_BRANCH=""309 #!/usr/bin/env node

94if git rev-parse --git-dir > /dev/null 2>&1; then310 // Node.js reads stdin asynchronously with events

311 let input = '';

312 process.stdin.on('data', chunk => input += chunk);

313 process.stdin.on('end', () => {

314 const data = JSON.parse(input);

315 const model = data.model.display_name;

316 // Optional chaining (?.) safely handles null fields

317 const pct = Math.floor(data.context_window?.used_percentage || 0);

318 

319 // String.repeat() builds the bar

320 const filled = Math.floor(pct * 10 / 100);

321 const bar = '▓'.repeat(filled) + '░'.repeat(10 - filled);

322 

323 console.log(`[${model}] ${bar} ${pct}%`);

324 });

325 ```

326</CodeGroup>

327 

328### Git status with colors

329 

330Show git branch with color-coded indicators for staged and modified files. This script uses [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) for terminal colors: `\033[32m` is green, `\033[33m` is yellow, and `\033[0m` resets to default.

331 

332<Frame>

333 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-git-context.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=e656f34f90d1d9a1d0e220988914345f" alt="A status line showing model, directory, git branch, and colored indicators for staged and modified files" data-og-width="742" width="742" data-og-height="178" height="178" data-path="images/statusline-git-context.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-git-context.png?w=280&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=c1bced5f46afdc9aae549702591f8457 280w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-git-context.png?w=560&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=debe46a7a888234ec692751243bba492 560w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-git-context.png?w=840&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=3a069d5c8b0395908e42f0e295fd4854 840w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-git-context.png?w=1100&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=26aff0978865756d5ea299a22e5e9afd 1100w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-git-context.png?w=1650&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=d5ac1d59881e6f2032af053557dc4590 1650w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-git-context.png?w=2500&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=46febbf34b0ee646502d095433132709 2500w" />

334</Frame>

335 

336Each script checks if the current directory is a git repository, counts staged and modified files, and displays color-coded indicators:

337 

338<CodeGroup>

339 ```bash Bash theme={null}

340 #!/bin/bash

341 input=$(cat)

342 

343 MODEL=$(echo "$input" | jq -r '.model.display_name')

344 DIR=$(echo "$input" | jq -r '.workspace.current_dir')

345 

346 GREEN='\033[32m'

347 YELLOW='\033[33m'

348 RESET='\033[0m'

349 

350 if git rev-parse --git-dir > /dev/null 2>&1; then

95 BRANCH=$(git branch --show-current 2>/dev/null)351 BRANCH=$(git branch --show-current 2>/dev/null)

96 if [ -n "$BRANCH" ]; then352 STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')

97 GIT_BRANCH=" | 🌿 $BRANCH"353 MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

354 

355 GIT_STATUS=""

356 [ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"

357 [ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"

358 

359 echo -e "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH $GIT_STATUS"

360 else

361 echo "[$MODEL] 📁 ${DIR##*/}"

98 fi362 fi

99fi363 ```

100 364 

101echo "[$MODEL_DISPLAY] 📁 ${CURRENT_DIR##*/}$GIT_BRANCH"365 ```python Python theme={null}

102```366 #!/usr/bin/env python3

367 import json, sys, subprocess, os

368 

369 data = json.load(sys.stdin)

370 model = data['model']['display_name']

371 directory = os.path.basename(data['workspace']['current_dir'])

372 

373 GREEN, YELLOW, RESET = '\033[32m', '\033[33m', '\033[0m'

374 

375 try:

376 subprocess.check_output(['git', 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL)

377 branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True).strip()

378 staged_output = subprocess.check_output(['git', 'diff', '--cached', '--numstat'], text=True).strip()

379 modified_output = subprocess.check_output(['git', 'diff', '--numstat'], text=True).strip()

380 staged = len(staged_output.split('\n')) if staged_output else 0

381 modified = len(modified_output.split('\n')) if modified_output else 0

382 

383 git_status = f"{GREEN}+{staged}{RESET}" if staged else ""

384 git_status += f"{YELLOW}~{modified}{RESET}" if modified else ""

385 

386 print(f"[{model}] 📁 {directory} | 🌿 {branch} {git_status}")

387 except:

388 print(f"[{model}] 📁 {directory}")

389 ```

390 

391 ```javascript Node.js theme={null}

392 #!/usr/bin/env node

393 const { execSync } = require('child_process');

394 const path = require('path');

395 

396 let input = '';

397 process.stdin.on('data', chunk => input += chunk);

398 process.stdin.on('end', () => {

399 const data = JSON.parse(input);

400 const model = data.model.display_name;

401 const dir = path.basename(data.workspace.current_dir);

402 

403 const GREEN = '\x1b[32m', YELLOW = '\x1b[33m', RESET = '\x1b[0m';

404 

405 try {

406 execSync('git rev-parse --git-dir', { stdio: 'ignore' });

407 const branch = execSync('git branch --show-current', { encoding: 'utf8' }).trim();

408 const staged = execSync('git diff --cached --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

409 const modified = execSync('git diff --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

410 

411 let gitStatus = staged ? `${GREEN}+${staged}${RESET}` : '';

412 gitStatus += modified ? `${YELLOW}~${modified}${RESET}` : '';

413 

414 console.log(`[${model}] 📁 ${dir} | 🌿 ${branch} ${gitStatus}`);

415 } catch {

416 console.log(`[${model}] 📁 ${dir}`);

417 }

418 });

419 ```

420</CodeGroup>

421 

422### Cost and duration tracking

423 

424Track your session's API costs and elapsed time. The `cost.total_cost_usd` field accumulates the cost of all API calls in the current session. The `cost.total_duration_ms` field measures total elapsed time since the session started, while `cost.total_api_duration_ms` tracks only the time spent waiting for API responses.

425 

426Each script formats cost as currency and converts milliseconds to minutes and seconds:

427 

428<Frame>

429 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-cost-tracking.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=e3444a51fe6f3440c134bd5f1f08ad29" alt="A status line showing model name, session cost, and duration" data-og-width="588" width="588" data-og-height="180" height="180" data-path="images/statusline-cost-tracking.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-cost-tracking.png?w=280&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=b1d35fa8acd792f559b6b1662ed10204 280w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-cost-tracking.png?w=560&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=a3ed4330c3645fc28b87a6cab55be0b7 560w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-cost-tracking.png?w=840&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=386ee2ed68a7d520eba20eac54f7fe52 840w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-cost-tracking.png?w=1100&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=479c2515e53f46d5d1da3b87a6dd993a 1100w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-cost-tracking.png?w=1650&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=1340c7589a4cb89ec071234aba3571d1 1650w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-cost-tracking.png?w=2500&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=69056cf4fe3271770cac4dc1704bcd0a 2500w" />

430</Frame>

431 

432<CodeGroup>

433 ```bash Bash theme={null}

434 #!/bin/bash

435 input=$(cat)

436 

437 MODEL=$(echo "$input" | jq -r '.model.display_name')

438 COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')

439 DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

440 

441 COST_FMT=$(printf '$%.2f' "$COST")

442 DURATION_SEC=$((DURATION_MS / 1000))

443 MINS=$((DURATION_SEC / 60))

444 SECS=$((DURATION_SEC % 60))

445 

446 echo "[$MODEL] 💰 $COST_FMT | ⏱️ ${MINS}m ${SECS}s"

447 ```

448 

449 ```python Python theme={null}

450 #!/usr/bin/env python3

451 import json, sys

452 

453 data = json.load(sys.stdin)

454 model = data['model']['display_name']

455 cost = data.get('cost', {}).get('total_cost_usd', 0) or 0

456 duration_ms = data.get('cost', {}).get('total_duration_ms', 0) or 0

457 

458 duration_sec = duration_ms // 1000

459 mins, secs = duration_sec // 60, duration_sec % 60

460 

461 print(f"[{model}] 💰 ${cost:.2f} | ⏱️ {mins}m {secs}s")

462 ```

463 

464 ```javascript Node.js theme={null}

465 #!/usr/bin/env node

466 let input = '';

467 process.stdin.on('data', chunk => input += chunk);

468 process.stdin.on('end', () => {

469 const data = JSON.parse(input);

470 const model = data.model.display_name;

471 const cost = data.cost?.total_cost_usd || 0;

472 const durationMs = data.cost?.total_duration_ms || 0;

473 

474 const durationSec = Math.floor(durationMs / 1000);

475 const mins = Math.floor(durationSec / 60);

476 const secs = durationSec % 60;

477 

478 console.log(`[${model}] 💰 $${cost.toFixed(2)} | ⏱️ ${mins}m ${secs}s`);

479 });

480 ```

481</CodeGroup>

482 

483### Display multiple lines

484 

485Your script can output multiple lines to create a richer display. Each `echo` statement produces a separate row in the status area.

486 

487<Frame>

488 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=60f11387658acc9ff75158ae85f2ac87" alt="A multi-line status line showing model name, directory, git branch on the first line, and a context usage progress bar with cost and duration on the second line" data-og-width="776" width="776" data-og-height="212" height="212" data-path="images/statusline-multiline.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=280&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=2e448b44c332620e6c9c2be4ded992e5 280w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=560&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=f796af2db9c68ab2ddbc5136840b9551 560w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=840&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=d29c13d6164773198a0b2c47b31f6c09 840w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=1100&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=d7720e5f51310185c0c02152f6c10d8b 1100w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=1650&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=b4e008cde27990a8d5783e41e5b93246 1650w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-multiline.png?w=2500&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=40ab24813303dc2e4c09f2675f3faf6e 2500w" />

489</Frame>

103 490 

104### Python Example491This example combines several techniques: threshold-based colors (green under 70%, yellow 70-89%, red 90%+), a progress bar, and git branch info. Each `print` or `echo` statement creates a separate row:

105 492 

106```python theme={null}493<CodeGroup>

107#!/usr/bin/env python3494 ```bash Bash theme={null}

108import json495 #!/bin/bash

109import sys496 input=$(cat)

110import os

111 497 

112# Read JSON from stdin498 MODEL=$(echo "$input" | jq -r '.model.display_name')

113data = json.load(sys.stdin)499 DIR=$(echo "$input" | jq -r '.workspace.current_dir')

500 COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')

501 PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

502 DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

114 503 

115# Extract values504 CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

116model = data['model']['display_name']505 

117current_dir = os.path.basename(data['workspace']['current_dir'])506 # Pick bar color based on context usage

507 if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"

508 elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"

509 else BAR_COLOR="$GREEN"; fi

510 

511 FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))

512 BAR=$(printf "%${FILLED}s" | tr ' ' '█')$(printf "%${EMPTY}s" | tr ' ' '░')

513 

514 MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

515 

516 BRANCH=""

517 git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"

518 

519 echo -e "${CYAN}[$MODEL]${RESET} 📁 ${DIR##*/}$BRANCH"

520 COST_FMT=$(printf '$%.2f' "$COST")

521 echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ⏱️ ${MINS}m ${SECS}s"

522 ```

523 

524 ```python Python theme={null}

525 #!/usr/bin/env python3

526 import json, sys, subprocess, os

527 

528 data = json.load(sys.stdin)

529 model = data['model']['display_name']

530 directory = os.path.basename(data['workspace']['current_dir'])

531 cost = data.get('cost', {}).get('total_cost_usd', 0) or 0

532 pct = int(data.get('context_window', {}).get('used_percentage', 0) or 0)

533 duration_ms = data.get('cost', {}).get('total_duration_ms', 0) or 0

534 

535 CYAN, GREEN, YELLOW, RED, RESET = '\033[36m', '\033[32m', '\033[33m', '\033[31m', '\033[0m'

536 

537 bar_color = RED if pct >= 90 else YELLOW if pct >= 70 else GREEN

538 filled = pct // 10

539 bar = '█' * filled + '░' * (10 - filled)

540 

541 mins, secs = duration_ms // 60000, (duration_ms % 60000) // 1000

118 542 

119# Check for git branch

120git_branch = ""

121if os.path.exists('.git'):

122 try:543 try:

123 with open('.git/HEAD', 'r') as f:544 branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True, stderr=subprocess.DEVNULL).strip()

124 ref = f.read().strip()545 branch = f" | 🌿 {branch}" if branch else ""

125 if ref.startswith('ref: refs/heads/'):

126 git_branch = f" | 🌿 {ref.replace('ref: refs/heads/', '')}"

127 except:546 except:

128 pass547 branch = ""

129 548 

130print(f"[{model}] 📁 {current_dir}{git_branch}")549 print(f"{CYAN}[{model}]{RESET} 📁 {directory}{branch}")

131```550 print(f"{bar_color}{bar}{RESET} {pct}% | {YELLOW}${cost:.2f}{RESET} | ⏱️ {mins}m {secs}s")

551 ```

132 552 

133### Node.js Example553 ```javascript Node.js theme={null}

554 #!/usr/bin/env node

555 const { execSync } = require('child_process');

556 const path = require('path');

557 

558 let input = '';

559 process.stdin.on('data', chunk => input += chunk);

560 process.stdin.on('end', () => {

561 const data = JSON.parse(input);

562 const model = data.model.display_name;

563 const dir = path.basename(data.workspace.current_dir);

564 const cost = data.cost?.total_cost_usd || 0;

565 const pct = Math.floor(data.context_window?.used_percentage || 0);

566 const durationMs = data.cost?.total_duration_ms || 0;

134 567 

135```javascript theme={null}568 const CYAN = '\x1b[36m', GREEN = '\x1b[32m', YELLOW = '\x1b[33m', RED = '\x1b[31m', RESET = '\x1b[0m';

136#!/usr/bin/env node

137 569 

138const fs = require('fs');570 const barColor = pct >= 90 ? RED : pct >= 70 ? YELLOW : GREEN;

139const path = require('path');571 const filled = Math.floor(pct / 10);

572 const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);

573 

574 const mins = Math.floor(durationMs / 60000);

575 const secs = Math.floor((durationMs % 60000) / 1000);

576 

577 let branch = '';

578 try {

579 branch = execSync('git branch --show-current', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();

580 branch = branch ? ` | 🌿 ${branch}` : '';

581 } catch {}

582 

583 console.log(`${CYAN}[${model}]${RESET} 📁 ${dir}${branch}`);

584 console.log(`${barColor}${bar}${RESET} ${pct}% | ${YELLOW}$${cost.toFixed(2)}${RESET} | ⏱️ ${mins}m ${secs}s`);

585 });

586 ```

587</CodeGroup>

588 

589### Clickable links

590 

591This example creates a clickable link to your GitHub repository. It reads the git remote URL, converts SSH format to HTTPS with `sed`, and wraps the repo name in OSC 8 escape codes. Hold Cmd (macOS) or Ctrl (Windows/Linux) and click to open the link in your browser.

592 

593<Frame>

594 <img src="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-links.png?fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=4bcc6e7deb7cf52f41ab85a219b52661" alt="A status line showing a clickable link to a GitHub repository" data-og-width="726" width="726" data-og-height="198" height="198" data-path="images/statusline-links.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-links.png?w=280&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=9386f78056f7be99599bcefe9e838180 280w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-links.png?w=560&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=d748012a0866c37dddc6babd4b7a88c4 560w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-links.png?w=840&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=bade8fbfcde957c1033c376c58b89131 840w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-links.png?w=1100&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=9f7e0c729ea093c3b39682619fd3f201 1100w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-links.png?w=1650&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=ccec17e90a89d82381888a4a9a8fa40e 1650w, https://mintcdn.com/claude-code/nibzesLaJVh4ydOq/images/statusline-links.png?w=2500&fit=max&auto=format&n=nibzesLaJVh4ydOq&q=85&s=4d2e34a4d2f24e174cae1256c84f9a52 2500w" />

595</Frame>

596 

597Each script gets the git remote URL, converts SSH format to HTTPS, and wraps the repo name in OSC 8 escape codes. The Bash version uses `printf '%b'` which interprets backslash escapes more reliably than `echo -e` across different shells:

598 

599<CodeGroup>

600 ```bash Bash theme={null}

601 #!/bin/bash

602 input=$(cat)

603 

604 MODEL=$(echo "$input" | jq -r '.model.display_name')

605 

606 # Convert git SSH URL to HTTPS

607 REMOTE=$(git remote get-url origin 2>/dev/null | sed 's/git@github.com:/https:\/\/github.com\//' | sed 's/\.git$//')

608 

609 if [ -n "$REMOTE" ]; then

610 REPO_NAME=$(basename "$REMOTE")

611 # OSC 8 format: \e]8;;URL\a then TEXT then \e]8;;\a

612 # printf %b interprets escape sequences reliably across shells

613 printf '%b' "[$MODEL] 🔗 \e]8;;${REMOTE}\a${REPO_NAME}\e]8;;\a\n"

614 else

615 echo "[$MODEL]"

616 fi

617 ```

140 618 

141// Read JSON from stdin619 ```python Python theme={null}

142let input = '';620 #!/usr/bin/env python3

143process.stdin.on('data', chunk => input += chunk);621 import json, sys, subprocess, re, os

144process.stdin.on('end', () => {622 

623 data = json.load(sys.stdin)

624 model = data['model']['display_name']

625 

626 # Get git remote URL

627 try:

628 remote = subprocess.check_output(

629 ['git', 'remote', 'get-url', 'origin'],

630 stderr=subprocess.DEVNULL, text=True

631 ).strip()

632 # Convert SSH to HTTPS format

633 remote = re.sub(r'^git@github\.com:', 'https://github.com/', remote)

634 remote = re.sub(r'\.git$', '', remote)

635 repo_name = os.path.basename(remote)

636 # OSC 8 escape sequences

637 link = f"\033]8;;{remote}\a{repo_name}\033]8;;\a"

638 print(f"[{model}] 🔗 {link}")

639 except:

640 print(f"[{model}]")

641 ```

642 

643 ```javascript Node.js theme={null}

644 #!/usr/bin/env node

645 const { execSync } = require('child_process');

646 const path = require('path');

647 

648 let input = '';

649 process.stdin.on('data', chunk => input += chunk);

650 process.stdin.on('end', () => {

145 const data = JSON.parse(input);651 const data = JSON.parse(input);

652 const model = data.model.display_name;

653 

654 try {

655 let remote = execSync('git remote get-url origin', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();

656 // Convert SSH to HTTPS format

657 remote = remote.replace(/^git@github\.com:/, 'https://github.com/').replace(/\.git$/, '');

658 const repoName = path.basename(remote);

659 // OSC 8 escape sequences

660 const link = `\x1b]8;;${remote}\x07${repoName}\x1b]8;;\x07`;

661 console.log(`[${model}] 🔗 ${link}`);

662 } catch {

663 console.log(`[${model}]`);

664 }

665 });

666 ```

667</CodeGroup>

668 

669### Cache expensive operations

670 

671Your status line script runs frequently during active sessions. Commands like `git status` or `git diff` can be slow, especially in large repositories. This example caches git information to a temp file and only refreshes it every 5 seconds.

672 

673Use a stable, fixed filename for the cache file like `/tmp/statusline-git-cache`. Each status line invocation runs as a new process, so process-based identifiers like `$$`, `os.getpid()`, or `process.pid` produce a different value every time and the cache is never reused.

674 

675Each script checks if the cache file is missing or older than 5 seconds before running git commands:

676 

677<CodeGroup>

678 ```bash Bash theme={null}

679 #!/bin/bash

680 input=$(cat)

681 

682 MODEL=$(echo "$input" | jq -r '.model.display_name')

683 DIR=$(echo "$input" | jq -r '.workspace.current_dir')

684 

685 CACHE_FILE="/tmp/statusline-git-cache"

686 CACHE_MAX_AGE=5 # seconds

687 

688 cache_is_stale() {

689 [ ! -f "$CACHE_FILE" ] || \

690 # stat -f %m is macOS, stat -c %Y is Linux

691 [ $(($(date +%s) - $(stat -f %m "$CACHE_FILE" 2>/dev/null || stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0))) -gt $CACHE_MAX_AGE ]

692 }

693 

694 if cache_is_stale; then

695 if git rev-parse --git-dir > /dev/null 2>&1; then

696 BRANCH=$(git branch --show-current 2>/dev/null)

697 STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')

698 MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

699 echo "$BRANCH|$STAGED|$MODIFIED" > "$CACHE_FILE"

700 else

701 echo "||" > "$CACHE_FILE"

702 fi

703 fi

704 

705 IFS='|' read -r BRANCH STAGED MODIFIED < "$CACHE_FILE"

706 

707 if [ -n "$BRANCH" ]; then

708 echo "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH +$STAGED ~$MODIFIED"

709 else

710 echo "[$MODEL] 📁 ${DIR##*/}"

711 fi

712 ```

146 713 

147 // Extract values714 ```python Python theme={null}

715 #!/usr/bin/env python3

716 import json, sys, subprocess, os, time

717 

718 data = json.load(sys.stdin)

719 model = data['model']['display_name']

720 directory = os.path.basename(data['workspace']['current_dir'])

721 

722 CACHE_FILE = "/tmp/statusline-git-cache"

723 CACHE_MAX_AGE = 5 # seconds

724 

725 def cache_is_stale():

726 if not os.path.exists(CACHE_FILE):

727 return True

728 return time.time() - os.path.getmtime(CACHE_FILE) > CACHE_MAX_AGE

729 

730 if cache_is_stale():

731 try:

732 subprocess.check_output(['git', 'rev-parse', '--git-dir'], stderr=subprocess.DEVNULL)

733 branch = subprocess.check_output(['git', 'branch', '--show-current'], text=True).strip()

734 staged = subprocess.check_output(['git', 'diff', '--cached', '--numstat'], text=True).strip()

735 modified = subprocess.check_output(['git', 'diff', '--numstat'], text=True).strip()

736 staged_count = len(staged.split('\n')) if staged else 0

737 modified_count = len(modified.split('\n')) if modified else 0

738 with open(CACHE_FILE, 'w') as f:

739 f.write(f"{branch}|{staged_count}|{modified_count}")

740 except:

741 with open(CACHE_FILE, 'w') as f:

742 f.write("||")

743 

744 with open(CACHE_FILE) as f:

745 branch, staged, modified = f.read().strip().split('|')

746 

747 if branch:

748 print(f"[{model}] 📁 {directory} | 🌿 {branch} +{staged} ~{modified}")

749 else:

750 print(f"[{model}] 📁 {directory}")

751 ```

752 

753 ```javascript Node.js theme={null}

754 #!/usr/bin/env node

755 const { execSync } = require('child_process');

756 const fs = require('fs');

757 const path = require('path');

758 

759 let input = '';

760 process.stdin.on('data', chunk => input += chunk);

761 process.stdin.on('end', () => {

762 const data = JSON.parse(input);

148 const model = data.model.display_name;763 const model = data.model.display_name;

149 const currentDir = path.basename(data.workspace.current_dir);764 const dir = path.basename(data.workspace.current_dir);

150 765 

151 // Check for git branch766 const CACHE_FILE = '/tmp/statusline-git-cache';

152 let gitBranch = '';767 const CACHE_MAX_AGE = 5; // seconds

768 

769 const cacheIsStale = () => {

770 if (!fs.existsSync(CACHE_FILE)) return true;

771 return (Date.now() / 1000) - fs.statSync(CACHE_FILE).mtimeMs / 1000 > CACHE_MAX_AGE;

772 };

773 

774 if (cacheIsStale()) {

153 try {775 try {

154 const headContent = fs.readFileSync('.git/HEAD', 'utf8').trim();776 execSync('git rev-parse --git-dir', { stdio: 'ignore' });

155 if (headContent.startsWith('ref: refs/heads/')) {777 const branch = execSync('git branch --show-current', { encoding: 'utf8' }).trim();

156 gitBranch = ` | 🌿 ${headContent.replace('ref: refs/heads/', '')}`;778 const staged = execSync('git diff --cached --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

779 const modified = execSync('git diff --numstat', { encoding: 'utf8' }).trim().split('\n').filter(Boolean).length;

780 fs.writeFileSync(CACHE_FILE, `${branch}|${staged}|${modified}`);

781 } catch {

782 fs.writeFileSync(CACHE_FILE, '||');

157 }783 }

158 } catch (e) {

159 // Not a git repo or can't read HEAD

160 }784 }

161 785 

162 console.log(`[${model}] 📁 ${currentDir}${gitBranch}`);786 const [branch, staged, modified] = fs.readFileSync(CACHE_FILE, 'utf8').trim().split('|');

163});

164```

165 787 

166### Helper Function Approach788 if (branch) {

167 789 console.log(`[${model}] 📁 ${dir} | 🌿 ${branch} +${staged} ~${modified}`);

168For more complex bash scripts, you can create helper functions:790 } else {

169 791 console.log(`[${model}] 📁 ${dir}`);

170```bash theme={null}792 }

171#!/bin/bash793 });

172# Read JSON input once794 ```

173input=$(cat)795</CodeGroup>

174 

175# Helper functions for common extractions

176get_model_name() { echo "$input" | jq -r '.model.display_name'; }

177get_current_dir() { echo "$input" | jq -r '.workspace.current_dir'; }

178get_project_dir() { echo "$input" | jq -r '.workspace.project_dir'; }

179get_version() { echo "$input" | jq -r '.version'; }

180get_cost() { echo "$input" | jq -r '.cost.total_cost_usd'; }

181get_duration() { echo "$input" | jq -r '.cost.total_duration_ms'; }

182get_lines_added() { echo "$input" | jq -r '.cost.total_lines_added'; }

183get_lines_removed() { echo "$input" | jq -r '.cost.total_lines_removed'; }

184 

185# Use the helpers

186MODEL=$(get_model_name)

187DIR=$(get_current_dir)

188echo "[$MODEL] 📁 ${DIR##*/}"

189```

190 796 

191## Tips797## Tips

192 798 

193* Keep your status line concise - it should fit on one line799* **Test with mock input**: `echo '{"model":{"display_name":"Opus"},"context_window":{"used_percentage":25}}' | ./statusline.sh`

194* Use emojis (if your terminal supports them) and colors to make information scannable800* **Keep output short**: the status bar has limited width, so long output may get truncated or wrap awkwardly

195* Use `jq` for JSON parsing in Bash (see examples above)801* **Cache slow operations**: your script runs frequently during active sessions, so commands like `git status` can cause lag. See the [caching example](#cache-expensive-operations) for how to handle this.

196* Test your script by running it manually with mock JSON input: `echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"}}' | ./statusline.sh`802 

197* Consider caching expensive operations (like git status) if needed803Community projects like [ccstatusline](https://github.com/sirmalloc/ccstatusline) and [starship-claude](https://github.com/martinemde/starship-claude) provide pre-built configurations with themes and additional features.

198 804 

199## Troubleshooting805## Troubleshooting

200 806 

201* If your status line doesn't appear, check that your script is executable (`chmod +x`)807**Status line not appearing**

202* Ensure your script outputs to stdout (not stderr)808 

809* Verify your script is executable: `chmod +x ~/.claude/statusline.sh`

810* Check that your script outputs to stdout, not stderr

811* Run your script manually to verify it produces output

812* If `disableAllHooks` is set to `true` in your settings, the status line is also disabled. Remove this setting or set it to `false` to re-enable.

813 

814**Status line shows `--` or empty values**

815 

816* Fields may be `null` before the first API response completes

817* Handle null values in your script with fallbacks such as `// 0` in jq

818* Restart Claude Code if values remain empty after multiple messages

819 

820**Context percentage shows unexpected values**

821 

822* Use `used_percentage` for accurate context state rather than cumulative totals

823* The `total_input_tokens` and `total_output_tokens` are cumulative across the session and may exceed the context window size

824* Context percentage may differ from `/context` output due to when each is calculated

825 

826**OSC 8 links not clickable**

827 

828* Verify your terminal supports OSC 8 hyperlinks (iTerm2, Kitty, WezTerm)

829* Terminal.app does not support clickable links

830* SSH and tmux sessions may strip OSC sequences depending on configuration

831* If escape sequences appear as literal text like `\e]8;;`, use `printf '%b'` instead of `echo -e` for more reliable escape handling

832 

833**Display glitches with escape sequences**

834 

835* Complex escape sequences (ANSI colors, OSC 8 links) can occasionally cause garbled output if they overlap with other UI updates

836* If you see corrupted text, try simplifying your script to plain text output

837* Multi-line status lines with escape codes are more prone to rendering issues than single-line plain text

838 

839**Script errors or hangs**

840 

841* Scripts that exit with non-zero codes or produce no output cause the status line to go blank

842* Slow scripts block the status line from updating until they complete. Keep scripts fast to avoid stale output.

843* If a new update triggers while a slow script is running, the in-flight script is cancelled

844* Test your script independently with mock input before configuring it

845 

846**Notifications share the status line row**

847 

848* System notifications like MCP server errors, auto-updates, and token warnings display on the right side of the same row as your status line

849* Enabling verbose mode adds a token counter to this area

850* On narrow terminals, these notifications may truncate your status line output

sub-agents.md +583 −156

Details

1# Subagents1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

5# Create custom subagents

2 6 

3> Create and use specialized AI subagents in Claude Code for task-specific workflows and improved context management.7> Create and use specialized AI subagents in Claude Code for task-specific workflows and improved context management.

4 8 

5Custom subagents in Claude Code are specialized AI assistants that can be invoked to handle specific types of tasks. They enable more efficient problem-solving by providing task-specific configurations with customized system prompts, tools and a separate context window.9Subagents are specialized AI assistants that handle specific types of tasks. Each subagent runs in its own context window with a custom system prompt, specific tool access, and independent permissions. When Claude encounters a task that matches a subagent's description, it delegates to that subagent, which works independently and returns results.

10 

11<Note>

12 If you need multiple agents working in parallel and communicating with each other, see [agent teams](/en/agent-teams) instead. Subagents work within a single session; agent teams coordinate across separate sessions.

13</Note>

14 

15Subagents help you:

16 

17* **Preserve context** by keeping exploration and implementation out of your main conversation

18* **Enforce constraints** by limiting which tools a subagent can use

19* **Reuse configurations** across projects with user-level subagents

20* **Specialize behavior** with focused system prompts for specific domains

21* **Control costs** by routing tasks to faster, cheaper models like Haiku

22 

23Claude uses each subagent's description to decide when to delegate tasks. When you create a subagent, write a clear description so Claude knows when to use it.

24 

25Claude Code includes several built-in subagents like **Explore**, **Plan**, and **general-purpose**. You can also create custom subagents to handle specific tasks. This page covers the [built-in subagents](#built-in-subagents), [how to create your own](#quickstart-create-your-first-subagent), [full configuration options](#configure-subagents), [patterns for working with subagents](#work-with-subagents), and [example subagents](#example-subagents).

26 

27## Built-in subagents

28 

29Claude Code includes built-in subagents that Claude automatically uses when appropriate. Each inherits the parent conversation's permissions with additional tool restrictions.

30 

31<Tabs>

32 <Tab title="Explore">

33 A fast, read-only agent optimized for searching and analyzing codebases.

34 

35 * **Model**: Haiku (fast, low-latency)

36 * **Tools**: Read-only tools (denied access to Write and Edit tools)

37 * **Purpose**: File discovery, code search, codebase exploration

6 38 

7## What are subagents?39 Claude delegates to Explore when it needs to search or understand a codebase without making changes. This keeps exploration results out of your main conversation context.

8 40 

9Subagents are pre-configured AI personalities that Claude Code can delegate tasks to. Each subagent:41 When invoking Explore, Claude specifies a thoroughness level: **quick** for targeted lookups, **medium** for balanced exploration, or **very thorough** for comprehensive analysis.

42 </Tab>

10 43 

11* Has a specific purpose and expertise area44 <Tab title="Plan">

12* Uses its own context window separate from the main conversation45 A research agent used during [plan mode](/en/common-workflows#use-plan-mode-for-safe-code-analysis) to gather context before presenting a plan.

13* Can be configured with specific tools it's allowed to use

14* Includes a custom system prompt that guides its behavior

15 46 

16When Claude Code encounters a task that matches a subagent's expertise, it can delegate that task to the specialized subagent, which works independently and returns results.47 * **Model**: Inherits from main conversation

48 * **Tools**: Read-only tools (denied access to Write and Edit tools)

49 * **Purpose**: Codebase research for planning

17 50 

18## Key benefits51 When you're in plan mode and Claude needs to understand your codebase, it delegates research to the Plan subagent. This prevents infinite nesting (subagents cannot spawn other subagents) while still gathering necessary context.

52 </Tab>

19 53 

20<CardGroup cols={2}>54 <Tab title="General-purpose">

21 <Card title="Context preservation" icon="layer-group">55 A capable agent for complex, multi-step tasks that require both exploration and action.

22 Each subagent operates in its own context, preventing pollution of the main conversation and keeping it focused on high-level objectives.

23 </Card>

24 56 

25 <Card title="Specialized expertise" icon="brain">57 * **Model**: Inherits from main conversation

26 Subagents can be fine-tuned with detailed instructions for specific domains, leading to higher success rates on designated tasks.58 * **Tools**: All tools

27 </Card>59 * **Purpose**: Complex research, multi-step operations, code modifications

28 60 

29 <Card title="Reusability" icon="rotate">61 Claude delegates to general-purpose when the task requires both exploration and modification, complex reasoning to interpret results, or multiple dependent steps.

30 Once created, subagents can be used across different projects and shared with your team for consistent workflows.62 </Tab>

31 </Card>

32 63 

33 <Card title="Flexible permissions" icon="shield-check">64 <Tab title="Other">

34 Each subagent can have different tool access levels, allowing you to limit powerful tools to specific subagent types.65 Claude Code includes additional helper agents for specific tasks. These are typically invoked automatically, so you don't need to use them directly.

35 </Card>

36</CardGroup>

37 66 

38## Quick start67 | Agent | Model | When Claude uses it |

68 | :---------------- | :------- | :------------------------------------------------------- |

69 | Bash | Inherits | Running terminal commands in a separate context |

70 | statusline-setup | Sonnet | When you run `/statusline` to configure your status line |

71 | Claude Code Guide | Haiku | When you ask questions about Claude Code features |

72 </Tab>

73</Tabs>

39 74 

40To create your first subagent:75Beyond these built-in subagents, you can create your own with custom prompts, tool restrictions, permission modes, hooks, and skills. The following sections show how to get started and customize subagents.

76 

77## Quickstart: create your first subagent

78 

79Subagents are defined in Markdown files with YAML frontmatter. You can [create them manually](#write-subagent-files) or use the `/agents` command.

80 

81This walkthrough guides you through creating a user-level subagent with the `/agent` command. The subagent reviews code and suggests improvements for the codebase.

41 82 

42<Steps>83<Steps>

43 <Step title="Open the subagents interface">84 <Step title="Open the subagents interface">

44 Run the following command:85 In Claude Code, run:

45 86 

46 ```87 ```

47 /agents88 /agents

48 ```89 ```

49 </Step>90 </Step>

50 91 

51 <Step title="Select 'Create New Agent'">92 <Step title="Create a new user-level agent">

52 Choose whether to create a project-level or user-level subagent93 Select **Create new agent**, then choose **User-level**. This saves the subagent to `~/.claude/agents/` so it's available in all your projects.

94 </Step>

95 

96 <Step title="Generate with Claude">

97 Select **Generate with Claude**. When prompted, describe the subagent:

98 

99 ```

100 A code improvement agent that scans files and suggests improvements

101 for readability, performance, and best practices. It should explain

102 each issue, show the current code, and provide an improved version.

103 ```

104 

105 Claude generates the system prompt and configuration. Press `e` to open it in your editor if you want to customize it.

106 </Step>

107 

108 <Step title="Select tools">

109 For a read-only reviewer, deselect everything except **Read-only tools**. If you keep all tools selected, the subagent inherits all tools available to the main conversation.

110 </Step>

111 

112 <Step title="Select model">

113 Choose which model the subagent uses. For this example agent, select **Sonnet**, which balances capability and speed for analyzing code patterns.

53 </Step>114 </Step>

54 115 

55 <Step title="Define the subagent">116 <Step title="Choose a color">

56 * **Recommended**: Generate with Claude first, then customize to make it yours117 Pick a background color for the subagent. This helps you identify which subagent is running in the UI.

57 * Describe your subagent in detail and when it should be used

58 * Select the tools you want to grant access to (or leave blank to inherit all tools)

59 * The interface shows all available tools, making selection easy

60 * If you're generating with Claude, you can also edit the system prompt in your own editor by pressing `e`

61 </Step>118 </Step>

62 119 

63 <Step title="Save and use">120 <Step title="Save and try it out">

64 Your subagent is now available! Claude will use it automatically when appropriate, or you can invoke it explicitly:121 Save the subagent. It's available immediately (no restart needed). Try it:

65 122 

66 ```123 ```

67 > Use the code-reviewer subagent to check my recent changes124 Use the code-improver agent to suggest improvements in this project

68 ```125 ```

126 

127 Claude delegates to your new subagent, which scans the codebase and returns improvement suggestions.

69 </Step>128 </Step>

70</Steps>129</Steps>

71 130 

72## Subagent configuration131You now have a subagent you can use in any project on your machine to analyze codebases and suggest improvements.

132 

133You can also create subagents manually as Markdown files, define them via CLI flags, or distribute them through plugins. The following sections cover all configuration options.

73 134 

74### File locations135## Configure subagents

75 136 

76Subagents are stored as Markdown files with YAML frontmatter in two possible locations:137### Use the /agents command

77 138 

78| Type | Location | Scope | Priority |139The `/agents` command provides an interactive interface for managing subagents. Run `/agents` to:

79| :-------------------- | :------------------ | :---------------------------- | :------- |

80| **Project subagents** | `.claude/agents/` | Available in current project | Highest |

81| **User subagents** | `~/.claude/agents/` | Available across all projects | Lower |

82 140 

83When subagent names conflict, project-level subagents take precedence over user-level subagents.141* View all available subagents (built-in, user, project, and plugin)

142* Create new subagents with guided setup or Claude generation

143* Edit existing subagent configuration and tool access

144* Delete custom subagents

145* See which subagents are active when duplicates exist

84 146 

85### Plugin agents147This is the recommended way to create and manage subagents. For manual creation or automation, you can also add subagent files directly.

86 148 

87[Plugins](/en/docs/claude-code/plugins) can provide custom subagents that integrate seamlessly with Claude Code. Plugin agents work identically to user-defined agents and appear in the `/agents` interface.149To list all configured subagents from the command line without starting an interactive session, run `claude agents`. This shows agents grouped by source and indicates which are overridden by higher-priority definitions.

88 150 

89**Plugin agent locations**: Plugins include agents in their `agents/` directory (or custom paths specified in the plugin manifest).151### Choose the subagent scope

90 152 

91**Using plugin agents**:153Subagents are Markdown files with YAML frontmatter. Store them in different locations depending on scope. When multiple subagents share the same name, the higher-priority location wins.

92 154 

93* Plugin agents appear in `/agents` alongside your custom agents155| Location | Scope | Priority | How to create |

94* Can be invoked explicitly: "Use the code-reviewer agent from the security-plugin"156| :--------------------------- | :---------------------- | :---------- | :------------------------------------ |

95* Can be invoked automatically by Claude when appropriate157| `--agents` CLI flag | Current session | 1 (highest) | Pass JSON when launching Claude Code |

96* Can be managed (viewed, inspected) through `/agents` interface158| `.claude/agents/` | Current project | 2 | Interactive or manual |

159| `~/.claude/agents/` | All your projects | 3 | Interactive or manual |

160| Plugin's `agents/` directory | Where plugin is enabled | 4 (lowest) | Installed with [plugins](/en/plugins) |

97 161 

98See the [plugin components reference](/en/docs/claude-code/plugins-reference#agents) for details on creating plugin agents.162**Project subagents** (`.claude/agents/`) are ideal for subagents specific to a codebase. Check them into version control so your team can use and improve them collaboratively.

99 163 

100### CLI-based configuration164**User subagents** (`~/.claude/agents/`) are personal subagents available in all your projects.

101 165 

102You can also define subagents dynamically using the `--agents` CLI flag, which accepts a JSON object:166**CLI-defined subagents** are passed as JSON when launching Claude Code. They exist only for that session and aren't saved to disk, making them useful for quick testing or automation scripts:

103 167 

104```bash theme={null}168```bash theme={null}

105claude --agents '{169claude --agents '{


112}'176}'

113```177```

114 178 

115**Priority**: CLI-defined subagents have lower priority than project-level subagents but higher priority than user-level subagents.179The `--agents` flag accepts JSON with the same [frontmatter](#supported-frontmatter-fields) fields as file-based subagents: `description`, `prompt`, `tools`, `disallowedTools`, `model`, `permissionMode`, `mcpServers`, `hooks`, `maxTurns`, `skills`, and `memory`. Use `prompt` for the system prompt, equivalent to the markdown body in file-based subagents. See the [CLI reference](/en/cli-reference#agents-flag-format) for the full JSON format.

116 

117**Use case**: This approach is useful for:

118 180 

119* Quick testing of subagent configurations181**Plugin subagents** come from [plugins](/en/plugins) you've installed. They appear in `/agents` alongside your custom subagents. See the [plugin components reference](/en/plugins-reference#agents) for details on creating plugin subagents.

120* Session-specific subagents that don't need to be saved

121* Automation scripts that need custom subagents

122* Sharing subagent definitions in documentation or scripts

123 182 

124For detailed information about the JSON format and all available options, see the [CLI reference documentation](/en/docs/claude-code/cli-reference#agents-flag-format).183### Write subagent files

125 184 

126### File format185Subagent files use YAML frontmatter for configuration, followed by the system prompt in Markdown:

127 186 

128Each subagent is defined in a Markdown file with this structure:187<Note>

188 Subagents are loaded at session start. If you create a subagent by manually adding a file, restart your session or use `/agents` to load it immediately.

189</Note>

129 190 

130```markdown theme={null}191```markdown theme={null}

131---192---

132name: your-sub-agent-name193name: code-reviewer

133description: Description of when this subagent should be invoked194description: Reviews code for quality and best practices

134tools: tool1, tool2, tool3 # Optional - inherits all tools if omitted195tools: Read, Glob, Grep

135model: sonnet # Optional - specify model alias or 'inherit'196model: sonnet

136---197---

137 198 

138Your subagent's system prompt goes here. This can be multiple paragraphs199You are a code reviewer. When invoked, analyze the code and provide

139and should clearly define the subagent's role, capabilities, and approach200specific, actionable feedback on quality, security, and best practices.

140to solving problems.

141 

142Include specific instructions, best practices, and any constraints

143the subagent should follow.

144```201```

145 202 

146#### Configuration fields203The frontmatter defines the subagent's metadata and configuration. The body becomes the system prompt that guides the subagent's behavior. Subagents receive only this system prompt (plus basic environment details like working directory), not the full Claude Code system prompt.

204 

205#### Supported frontmatter fields

206 

207The following fields can be used in the YAML frontmatter. Only `name` and `description` are required.

147 208 

148| Field | Required | Description |209| Field | Required | Description |

149| :------------ | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |210| :---------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

150| `name` | Yes | Unique identifier using lowercase letters and hyphens |211| `name` | Yes | Unique identifier using lowercase letters and hyphens |

151| `description` | Yes | Natural language description of the subagent's purpose |212| `description` | Yes | When Claude should delegate to this subagent |

152| `tools` | No | Comma-separated list of specific tools. If omitted, inherits all tools from the main thread |213| `tools` | No | [Tools](#available-tools) the subagent can use. Inherits all tools if omitted |

153| `model` | No | Model to use for this subagent. Can be a model alias (`sonnet`, `opus`, `haiku`) or `'inherit'` to use the main conversation's model. If omitted, defaults to the [configured subagent model](/en/docs/claude-code/model-config) |214| `disallowedTools` | No | Tools to deny, removed from inherited or specified list |

215| `model` | No | [Model](#choose-a-model) to use: `sonnet`, `opus`, `haiku`, or `inherit`. Defaults to `inherit` |

216| `permissionMode` | No | [Permission mode](#permission-modes): `default`, `acceptEdits`, `dontAsk`, `bypassPermissions`, or `plan` |

217| `maxTurns` | No | Maximum number of agentic turns before the subagent stops |

218| `skills` | No | [Skills](/en/skills) to load into the subagent's context at startup. The full skill content is injected, not just made available for invocation. Subagents don't inherit skills from the parent conversation |

219| `mcpServers` | No | [MCP servers](/en/mcp) available to this subagent. Each entry is either a server name referencing an already-configured server (e.g., `"slack"`) or an inline definition with the server name as key and a full [MCP server config](/en/mcp#configure-mcp-servers) as value |

220| `hooks` | No | [Lifecycle hooks](#define-hooks-for-subagents) scoped to this subagent |

221| `memory` | No | [Persistent memory scope](#enable-persistent-memory): `user`, `project`, or `local`. Enables cross-session learning |

222| `background` | No | Set to `true` to always run this subagent as a [background task](#run-subagents-in-foreground-or-background). Default: `false` |

223| `isolation` | No | Set to `worktree` to run the subagent in a temporary [git worktree](/en/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees), giving it an isolated copy of the repository. The worktree is automatically cleaned up if the subagent makes no changes |

224 

225### Choose a model

226 

227The `model` field controls which [AI model](/en/model-config) the subagent uses:

154 228 

155### Model selection229* **Model alias**: Use one of the available aliases: `sonnet`, `opus`, or `haiku`

230* **inherit**: Use the same model as the main conversation

231* **Omitted**: If not specified, defaults to `inherit` (uses the same model as the main conversation)

156 232 

157The `model` field allows you to control which [AI model](/en/docs/claude-code/model-config) the subagent uses:233### Control subagent capabilities

158 234 

159* **Model alias**: Use one of the available aliases: `sonnet`, `opus`, or `haiku`235You can control what subagents can do through tool access, permission modes, and conditional rules.

160* **`'inherit'`**: Use the same model as the main conversation (useful for consistency)236 

161* **Omitted**: If not specified, uses the default model configured for subagents (`sonnet`)237#### Available tools

238 

239Subagents can use any of Claude Code's [internal tools](/en/settings#tools-available-to-claude). By default, subagents inherit all tools from the main conversation, including MCP tools.

240 

241To restrict tools, use the `tools` field (allowlist) or `disallowedTools` field (denylist):

242 

243```yaml theme={null}

244---

245name: safe-researcher

246description: Research agent with restricted capabilities

247tools: Read, Grep, Glob, Bash

248disallowedTools: Write, Edit

249---

250```

251 

252#### Restrict which subagents can be spawned

253 

254When an agent runs as the main thread with `claude --agent`, it can spawn subagents using the Task tool. To restrict which subagent types it can spawn, use `Task(agent_type)` syntax in the `tools` field:

255 

256```yaml theme={null}

257---

258name: coordinator

259description: Coordinates work across specialized agents

260tools: Task(worker, researcher), Read, Bash

261---

262```

263 

264This is an allowlist: only the `worker` and `researcher` subagents can be spawned. If the agent tries to spawn any other type, the request fails and the agent sees only the allowed types in its prompt. To block specific agents while allowing all others, use [`permissions.deny`](#disable-specific-subagents) instead.

265 

266To allow spawning any subagent without restrictions, use `Task` without parentheses:

267 

268```yaml theme={null}

269tools: Task, Read, Bash

270```

271 

272If `Task` is omitted from the `tools` list entirely, the agent cannot spawn any subagents. This restriction only applies to agents running as the main thread with `claude --agent`. Subagents cannot spawn other subagents, so `Task(agent_type)` has no effect in subagent definitions.

273 

274#### Permission modes

275 

276The `permissionMode` field controls how the subagent handles permission prompts. Subagents inherit the permission context from the main conversation but can override the mode.

277 

278| Mode | Behavior |

279| :------------------ | :----------------------------------------------------------------- |

280| `default` | Standard permission checking with prompts |

281| `acceptEdits` | Auto-accept file edits |

282| `dontAsk` | Auto-deny permission prompts (explicitly allowed tools still work) |

283| `bypassPermissions` | Skip all permission checks |

284| `plan` | Plan mode (read-only exploration) |

285 

286<Warning>

287 Use `bypassPermissions` with caution. It skips all permission checks, allowing the subagent to execute any operation without approval.

288</Warning>

289 

290If the parent uses `bypassPermissions`, this takes precedence and cannot be overridden.

291 

292#### Preload skills into subagents

293 

294Use the `skills` field to inject skill content into a subagent's context at startup. This gives the subagent domain knowledge without requiring it to discover and load skills during execution.

295 

296```yaml theme={null}

297---

298name: api-developer

299description: Implement API endpoints following team conventions

300skills:

301 - api-conventions

302 - error-handling-patterns

303---

304 

305Implement API endpoints. Follow the conventions and patterns from the preloaded skills.

306```

307 

308The full content of each skill is injected into the subagent's context, not just made available for invocation. Subagents don't inherit skills from the parent conversation; you must list them explicitly.

162 309 

163<Note>310<Note>

164 Using `'inherit'` is particularly useful when you want your subagents to adapt to the model choice of the main conversation, ensuring consistent capabilities and response style throughout your session.311 This is the inverse of [running a skill in a subagent](/en/skills#run-skills-in-a-subagent). With `skills` in a subagent, the subagent controls the system prompt and loads skill content. With `context: fork` in a skill, the skill content is injected into the agent you specify. Both use the same underlying system.

165</Note>312</Note>

166 313 

167### Available tools314#### Enable persistent memory

168 315 

169Subagents can be granted access to any of Claude Code's internal tools. See the [tools documentation](/en/docs/claude-code/settings#tools-available-to-claude) for a complete list of available tools.316The `memory` field gives the subagent a persistent directory that survives across conversations. The subagent uses this directory to build up knowledge over time, such as codebase patterns, debugging insights, and architectural decisions.

170 317 

171<Tip>318```yaml theme={null}

172 **Recommended:** Use the `/agents` command to modify tool access - it provides an interactive interface that lists all available tools, including any connected MCP server tools, making it easier to select the ones you need.319---

173</Tip>320name: code-reviewer

321description: Reviews code for quality and best practices

322memory: user

323---

324 

325You are a code reviewer. As you review code, update your agent memory with

326patterns, conventions, and recurring issues you discover.

327```

174 328 

175You have two options for configuring tools:329Choose a scope based on how broadly the memory should apply:

176 330 

177* **Omit the `tools` field** to inherit all tools from the main thread (default), including MCP tools331| Scope | Location | Use when |

178* **Specify individual tools** as a comma-separated list for more granular control (can be edited manually or via `/agents`)332| :-------- | :-------------------------------------------- | :------------------------------------------------------------------------------------------ |

333| `user` | `~/.claude/agent-memory/<name-of-agent>/` | the subagent should remember learnings across all projects |

334| `project` | `.claude/agent-memory/<name-of-agent>/` | the subagent's knowledge is project-specific and shareable via version control |

335| `local` | `.claude/agent-memory-local/<name-of-agent>/` | the subagent's knowledge is project-specific but should not be checked into version control |

179 336 

180**MCP Tools**: Subagents can access MCP tools from configured MCP servers. When the `tools` field is omitted, subagents inherit all MCP tools available to the main thread.337When memory is enabled:

181 338 

182## Managing subagents339* The subagent's system prompt includes instructions for reading and writing to the memory directory.

340* The subagent's system prompt also includes the first 200 lines of `MEMORY.md` in the memory directory, with instructions to curate `MEMORY.md` if it exceeds 200 lines.

341* Read, Write, and Edit tools are automatically enabled so the subagent can manage its memory files.

183 342 

184### Using the /agents command (Recommended)343##### Persistent memory tips

185 344 

186The `/agents` command provides a comprehensive interface for subagent management:345* `user` is the recommended default scope. Use `project` or `local` when the subagent's knowledge is only relevant to a specific codebase.

346* Ask the subagent to consult its memory before starting work: "Review this PR, and check your memory for patterns you've seen before."

347* Ask the subagent to update its memory after completing a task: "Now that you're done, save what you learned to your memory." Over time, this builds a knowledge base that makes the subagent more effective.

348* Include memory instructions directly in the subagent's markdown file so it proactively maintains its own knowledge base:

187 349 

350 ```markdown theme={null}

351 Update your agent memory as you discover codepaths, patterns, library

352 locations, and key architectural decisions. This builds up institutional

353 knowledge across conversations. Write concise notes about what you found

354 and where.

355 ```

356 

357#### Conditional rules with hooks

358 

359For more dynamic control over tool usage, use `PreToolUse` hooks to validate operations before they execute. This is useful when you need to allow some operations of a tool while blocking others.

360 

361This example creates a subagent that only allows read-only database queries. The `PreToolUse` hook runs the script specified in `command` before each Bash command executes:

362 

363```yaml theme={null}

364---

365name: db-reader

366description: Execute read-only database queries

367tools: Bash

368hooks:

369 PreToolUse:

370 - matcher: "Bash"

371 hooks:

372 - type: command

373 command: "./scripts/validate-readonly-query.sh"

374---

188```375```

189/agents376 

377Claude Code [passes hook input as JSON](/en/hooks#pretooluse-input) via stdin to hook commands. The validation script reads this JSON, extracts the Bash command, and [exits with code 2](/en/hooks#exit-code-2-behavior-per-event) to block write operations:

378 

379```bash theme={null}

380#!/bin/bash

381# ./scripts/validate-readonly-query.sh

382 

383INPUT=$(cat)

384COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

385 

386# Block SQL write operations (case-insensitive)

387if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE)\b' > /dev/null; then

388 echo "Blocked: Only SELECT queries are allowed" >&2

389 exit 2

390fi

391 

392exit 0

190```393```

191 394 

192This opens an interactive menu where you can:395See [Hook input](/en/hooks#pretooluse-input) for the complete input schema and [exit codes](/en/hooks#exit-code-output) for how exit codes affect behavior.

193 396 

194* View all available subagents (built-in, user, and project)397#### Disable specific subagents

195* Create new subagents with guided setup

196* Edit existing custom subagents, including their tool access

197* Delete custom subagents

198* See which subagents are active when duplicates exist

199* **Easily manage tool permissions** with a complete list of available tools

200 398 

201### Direct file management399You can prevent Claude from using specific subagents by adding them to the `deny` array in your [settings](/en/settings#permission-settings). Use the format `Task(subagent-name)` where `subagent-name` matches the subagent's name field.

400 

401```json theme={null}

402{

403 "permissions": {

404 "deny": ["Task(Explore)", "Task(my-custom-agent)"]

405 }

406}

407```

202 408 

203You can also manage subagents by working directly with their files:409This works for both built-in and custom subagents. You can also use the `--disallowedTools` CLI flag:

204 410 

205```bash theme={null}411```bash theme={null}

206# Create a project subagent412claude --disallowedTools "Task(Explore)"

207mkdir -p .claude/agents413```

208echo '---414 

209name: test-runner415See [Permissions documentation](/en/permissions#tool-specific-permission-rules) for more details on permission rules.

210description: Use proactively to run tests and fix failures416 

417### Define hooks for subagents

418 

419Subagents can define [hooks](/en/hooks) that run during the subagent's lifecycle. There are two ways to configure hooks:

420 

4211. **In the subagent's frontmatter**: Define hooks that run only while that subagent is active

4222. **In `settings.json`**: Define hooks that run in the main session when subagents start or stop

423 

424#### Hooks in subagent frontmatter

425 

426Define hooks directly in the subagent's markdown file. These hooks only run while that specific subagent is active and are cleaned up when it finishes.

427 

428All [hook events](/en/hooks#hook-events) are supported. The most common events for subagents are:

429 

430| Event | Matcher input | When it fires |

431| :------------ | :------------ | :------------------------------------------------------------------ |

432| `PreToolUse` | Tool name | Before the subagent uses a tool |

433| `PostToolUse` | Tool name | After the subagent uses a tool |

434| `Stop` | (none) | When the subagent finishes (converted to `SubagentStop` at runtime) |

435 

436This example validates Bash commands with the `PreToolUse` hook and runs a linter after file edits with `PostToolUse`:

437 

438```yaml theme={null}

439---

440name: code-reviewer

441description: Review code changes with automatic linting

442hooks:

443 PreToolUse:

444 - matcher: "Bash"

445 hooks:

446 - type: command

447 command: "./scripts/validate-command.sh $TOOL_INPUT"

448 PostToolUse:

449 - matcher: "Edit|Write"

450 hooks:

451 - type: command

452 command: "./scripts/run-linter.sh"

211---453---

454```

455 

456`Stop` hooks in frontmatter are automatically converted to `SubagentStop` events.

457 

458#### Project-level hooks for subagent events

459 

460Configure hooks in `settings.json` that respond to subagent lifecycle events in the main session.

461 

462| Event | Matcher input | When it fires |

463| :-------------- | :-------------- | :------------------------------- |

464| `SubagentStart` | Agent type name | When a subagent begins execution |

465| `SubagentStop` | Agent type name | When a subagent completes |

212 466 

213You are a test automation expert. When you see code changes, proactively run the appropriate tests. If tests fail, analyze the failures and fix them while preserving the original test intent.' > .claude/agents/test-runner.md467Both events support matchers to target specific agent types by name. This example runs a setup script only when the `db-agent` subagent starts, and a cleanup script when any subagent stops:

214 468 

215# Create a user subagent469```json theme={null}

216mkdir -p ~/.claude/agents470{

217# ... create subagent file471 "hooks": {

472 "SubagentStart": [

473 {

474 "matcher": "db-agent",

475 "hooks": [

476 { "type": "command", "command": "./scripts/setup-db-connection.sh" }

477 ]

478 }

479 ],

480 "SubagentStop": [

481 {

482 "hooks": [

483 { "type": "command", "command": "./scripts/cleanup-db-connection.sh" }

484 ]

485 }

486 ]

487 }

488}

218```489```

219 490 

220## Using subagents effectively491See [Hooks](/en/hooks) for the complete hook configuration format.

221 492 

222### Automatic delegation493## Work with subagents

223 494 

224Claude Code proactively delegates tasks based on:495### Understand automatic delegation

225 496 

226* The task description in your request497Claude automatically delegates tasks based on the task description in your request, the `description` field in subagent configurations, and current context. To encourage proactive delegation, include phrases like "use proactively" in your subagent's description field.

227* The `description` field in subagent configurations

228* Current context and available tools

229 498 

230<Tip>499You can also request a specific subagent explicitly:

231 To encourage more proactive subagent use, include phrases like "use PROACTIVELY" or "MUST BE USED" in your `description` field.500 

232</Tip>501```

502Use the test-runner subagent to fix failing tests

503Have the code-reviewer subagent look at my recent changes

504```

505 

506### Run subagents in foreground or background

507 

508Subagents can run in the foreground (blocking) or background (concurrent):

509 

510* **Foreground subagents** block the main conversation until complete. Permission prompts and clarifying questions (like [`AskUserQuestion`](/en/settings#tools-available-to-claude)) are passed through to you.

511* **Background subagents** run concurrently while you continue working. Before launching, Claude Code prompts for any tool permissions the subagent will need, ensuring it has the necessary approvals upfront. Once running, the subagent inherits these permissions and auto-denies anything not pre-approved. If a background subagent needs to ask clarifying questions, that tool call fails but the subagent continues.

512 

513If a background subagent fails due to missing permissions, you can [resume it](#resume-subagents) in the foreground to retry with interactive prompts.

514 

515Claude decides whether to run subagents in the foreground or background based on the task. You can also:

516 

517* Ask Claude to "run this in the background"

518* Press **Ctrl+B** to background a running task

519 

520To disable all background task functionality, set the `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` environment variable to `1`. See [Environment variables](/en/settings#environment-variables).

521 

522### Common patterns

523 

524#### Isolate high-volume operations

525 

526One of the most effective uses for subagents is isolating operations that produce large amounts of output. Running tests, fetching documentation, or processing log files can consume significant context. By delegating these to a subagent, the verbose output stays in the subagent's context while only the relevant summary returns to your main conversation.

233 527 

234### Explicit invocation528```

529Use a subagent to run the test suite and report only the failing tests with their error messages

530```

531 

532#### Run parallel research

533 

534For independent investigations, spawn multiple subagents to work simultaneously:

535 

536```

537Research the authentication, database, and API modules in parallel using separate subagents

538```

539 

540Each subagent explores its area independently, then Claude synthesizes the findings. This works best when the research paths don't depend on each other.

541 

542<Warning>

543 When subagents complete, their results return to your main conversation. Running many subagents that each return detailed results can consume significant context.

544</Warning>

235 545 

236Request a specific subagent by mentioning it in your command:546For tasks that need sustained parallelism or exceed your context window, [agent teams](/en/agent-teams) give each worker its own independent context.

547 

548#### Chain subagents

549 

550For multi-step workflows, ask Claude to use subagents in sequence. Each subagent completes its task and returns results to Claude, which then passes relevant context to the next subagent.

237 551 

238```552```

239> Use the test-runner subagent to fix failing tests553Use the code-reviewer subagent to find performance issues, then use the optimizer subagent to fix them

240> Have the code-reviewer subagent look at my recent changes

241> Ask the debugger subagent to investigate this error

242```554```

243 555 

556### Choose between subagents and main conversation

557 

558Use the **main conversation** when:

559 

560* The task needs frequent back-and-forth or iterative refinement

561* Multiple phases share significant context (planning → implementation → testing)

562* You're making a quick, targeted change

563* Latency matters. Subagents start fresh and may need time to gather context

564 

565Use **subagents** when:

566 

567* The task produces verbose output you don't need in your main context

568* You want to enforce specific tool restrictions or permissions

569* The work is self-contained and can return a summary

570 

571Consider [Skills](/en/skills) instead when you want reusable prompts or workflows that run in the main conversation context rather than isolated subagent context.

572 

573<Note>

574 Subagents cannot spawn other subagents. If your workflow requires nested delegation, use [Skills](/en/skills) or [chain subagents](#chain-subagents) from the main conversation.

575</Note>

576 

577### Manage subagent context

578 

579#### Resume subagents

580 

581Each subagent invocation creates a new instance with fresh context. To continue an existing subagent's work instead of starting over, ask Claude to resume it.

582 

583Resumed subagents retain their full conversation history, including all previous tool calls, results, and reasoning. The subagent picks up exactly where it stopped rather than starting fresh.

584 

585When a subagent completes, Claude receives its agent ID. To resume a subagent, ask Claude to continue the previous work:

586 

587```

588Use the code-reviewer subagent to review the authentication module

589[Agent completes]

590 

591Continue that code review and now analyze the authorization logic

592[Claude resumes the subagent with full context from previous conversation]

593```

594 

595You can also ask Claude for the agent ID if you want to reference it explicitly, or find IDs in the transcript files at `~/.claude/projects/{project}/{sessionId}/subagents/`. Each transcript is stored as `agent-{agentId}.jsonl`.

596 

597Subagent transcripts persist independently of the main conversation:

598 

599* **Main conversation compaction**: When the main conversation compacts, subagent transcripts are unaffected. They're stored in separate files.

600* **Session persistence**: Subagent transcripts persist within their session. You can [resume a subagent](#resume-subagents) after restarting Claude Code by resuming the same session.

601* **Automatic cleanup**: Transcripts are cleaned up based on the `cleanupPeriodDays` setting (default: 30 days).

602 

603#### Auto-compaction

604 

605Subagents support automatic compaction using the same logic as the main conversation. By default, auto-compaction triggers at approximately 95% capacity. To trigger compaction earlier, set `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` to a lower percentage (for example, `50`). See [environment variables](/en/settings#environment-variables) for details.

606 

607Compaction events are logged in subagent transcript files:

608 

609```json theme={null}

610{

611 "type": "system",

612 "subtype": "compact_boundary",

613 "compactMetadata": {

614 "trigger": "auto",

615 "preTokens": 167189

616 }

617}

618```

619 

620The `preTokens` value shows how many tokens were used before compaction occurred.

621 

244## Example subagents622## Example subagents

245 623 

624These examples demonstrate effective patterns for building subagents. Use them as starting points, or generate a customized version with Claude.

625 

626<Tip>

627 **Best practices:**

628 

629 * **Design focused subagents:** each subagent should excel at one specific task

630 * **Write detailed descriptions:** Claude uses the description to decide when to delegate

631 * **Limit tool access:** grant only necessary permissions for security and focus

632 * **Check into version control:** share project subagents with your team

633</Tip>

634 

246### Code reviewer635### Code reviewer

247 636 

637A read-only subagent that reviews code without modifying it. This example shows how to design a focused subagent with limited tool access (no Edit or Write) and a detailed prompt that specifies exactly what to look for and how to format output.

638 

248```markdown theme={null}639```markdown theme={null}

249---640---

250name: code-reviewer641name: code-reviewer


2613. Begin review immediately6523. Begin review immediately

262 653 

263Review checklist:654Review checklist:

264- Code is simple and readable655- Code is clear and readable

265- Functions and variables are well-named656- Functions and variables are well-named

266- No duplicated code657- No duplicated code

267- Proper error handling658- Proper error handling


280 671 

281### Debugger672### Debugger

282 673 

674A subagent that can both analyze and fix issues. Unlike the code reviewer, this one includes Edit because fixing bugs requires modifying code. The prompt provides a clear workflow from diagnosis to verification.

675 

283```markdown theme={null}676```markdown theme={null}

284---677---

285name: debugger678name: debugger


310- Testing approach703- Testing approach

311- Prevention recommendations704- Prevention recommendations

312 705 

313Focus on fixing the underlying issue, not just symptoms.706Focus on fixing the underlying issue, not the symptoms.

314```707```

315 708 

316### Data scientist709### Data scientist

317 710 

711A domain-specific subagent for data analysis work. This example shows how to create subagents for specialized workflows outside of typical coding tasks. It explicitly sets `model: sonnet` for more capable analysis.

712 

318```markdown theme={null}713```markdown theme={null}

319---714---

320name: data-scientist715name: data-scientist


348Always ensure queries are efficient and cost-effective.743Always ensure queries are efficient and cost-effective.

349```744```

350 745 

351## Best practices746### Database query validator

352 747 

353* **Start with Claude-generated agents**: We highly recommend generating your initial subagent with Claude and then iterating on it to make it personally yours. This approach gives you the best results - a solid foundation that you can customize to your specific needs.748A subagent that allows Bash access but validates commands to permit only read-only SQL queries. This example shows how to use `PreToolUse` hooks for conditional validation when you need finer control than the `tools` field provides.

354 749 

355* **Design focused subagents**: Create subagents with single, clear responsibilities rather than trying to make one subagent do everything. This improves performance and makes subagents more predictable.750```markdown theme={null}

751---

752name: db-reader

753description: Execute read-only database queries. Use when analyzing data or generating reports.

754tools: Bash

755hooks:

756 PreToolUse:

757 - matcher: "Bash"

758 hooks:

759 - type: command

760 command: "./scripts/validate-readonly-query.sh"

761---

762 

763You are a database analyst with read-only access. Execute SELECT queries to answer questions about the data.

356 764 

357* **Write detailed prompts**: Include specific instructions, examples, and constraints in your system prompts. The more guidance you provide, the better the subagent will perform.765When asked to analyze data:

7661. Identify which tables contain the relevant data

7672. Write efficient SELECT queries with appropriate filters

7683. Present results clearly with context

358 769 

359* **Limit tool access**: Only grant tools that are necessary for the subagent's purpose. This improves security and helps the subagent focus on relevant actions.770You cannot modify data. If asked to INSERT, UPDATE, DELETE, or modify schema, explain that you only have read access.

771```

360 772 

361* **Version control**: Check project subagents into version control so your team can benefit from and improve them collaboratively.773Claude Code [passes hook input as JSON](/en/hooks#pretooluse-input) via stdin to hook commands. The validation script reads this JSON, extracts the command being executed, and checks it against a list of SQL write operations. If a write operation is detected, the script [exits with code 2](/en/hooks#exit-code-2-behavior-per-event) to block execution and returns an error message to Claude via stderr.

362 774 

363## Advanced usage775Create the validation script anywhere in your project. The path must match the `command` field in your hook configuration:

364 776 

365### Chaining subagents777```bash theme={null}

778#!/bin/bash

779# Blocks SQL write operations, allows SELECT queries

366 780 

367For complex workflows, you can chain multiple subagents:781# Read JSON input from stdin

782INPUT=$(cat)

368 783 

369```784# Extract the command field from tool_input using jq

370> First use the code-analyzer subagent to find performance issues, then use the optimizer subagent to fix them785COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

786 

787if [ -z "$COMMAND" ]; then

788 exit 0

789fi

790 

791# Block write operations (case-insensitive)

792if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE|REPLACE|MERGE)\b' > /dev/null; then

793 echo "Blocked: Write operations not allowed. Use SELECT queries only." >&2

794 exit 2

795fi

796 

797exit 0

371```798```

372 799 

373### Dynamic subagent selection800Make the script executable:

374 801 

375Claude Code intelligently selects subagents based on context. Make your `description` fields specific and action-oriented for best results.802```bash theme={null}

803chmod +x ./scripts/validate-readonly-query.sh

804```

376 805 

377## Performance considerations806The hook receives JSON via stdin with the Bash command in `tool_input.command`. Exit code 2 blocks the operation and feeds the error message back to Claude. See [Hooks](/en/hooks#exit-code-output) for details on exit codes and [Hook input](/en/hooks#pretooluse-input) for the complete input schema.

378 807 

379* **Context efficiency**: Agents help preserve main context, enabling longer overall sessions808## Next steps

380* **Latency**: Subagents start off with a clean slate each time they are invoked and may add latency as they gather context that they require to do their job effectively.

381 809 

382## Related documentation810Now that you understand subagents, explore these related features:

383 811 

384* [Plugins](/en/docs/claude-code/plugins) - Extend Claude Code with custom agents through plugins812* [Distribute subagents with plugins](/en/plugins) to share subagents across teams or projects

385* [Slash commands](/en/docs/claude-code/slash-commands) - Learn about other built-in commands813* [Run Claude Code programmatically](/en/headless) with the Agent SDK for CI/CD and automation

386* [Settings](/en/docs/claude-code/settings) - Configure Claude Code behavior814* [Use MCP servers](/en/mcp) to give subagents access to external tools and data

387* [Hooks](/en/docs/claude-code/hooks) - Automate workflows with event handlers

terminal-config.md +33 −17

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Optimize your terminal setup5# Optimize your terminal setup

2 6 

3> Claude Code works best when your terminal is properly configured. Follow these guidelines to optimize your experience.7> Claude Code works best when your terminal is properly configured. Follow these guidelines to optimize your experience.


6 10 

7Claude cannot control the theme of your terminal. That's handled by your terminal application. You can match Claude Code's theme to your terminal any time via the `/config` command.11Claude cannot control the theme of your terminal. That's handled by your terminal application. You can match Claude Code's theme to your terminal any time via the `/config` command.

8 12 

9For additional customization of the Claude Code interface itself, you can configure a [custom status line](/en/docs/claude-code/statusline) to display contextual information like the current model, working directory, or git branch at the bottom of your terminal.13For additional customization of the Claude Code interface itself, you can configure a [custom status line](/en/statusline) to display contextual information like the current model, working directory, or git branch at the bottom of your terminal.

10 14 

11### Line breaks15### Line breaks

12 16 

13You have several options for entering linebreaks into Claude Code:17You have several options for entering line breaks into Claude Code:

14 18 

15* **Quick escape**: Type `\` followed by Enter to create a newline19* **Quick escape**: Type `\` followed by Enter to create a newline

16* **Keyboard shortcut**: Set up a keybinding to insert a newline20* **Shift+Enter**: Works out of the box in iTerm2, WezTerm, Ghostty, and Kitty

21* **Keyboard shortcut**: Set up a keybinding to insert a newline in other terminals

22 

23**Set up Shift+Enter for other terminals**

17 24 

18#### Set up Shift+Enter (VS Code or iTerm2):25Run `/terminal-setup` within Claude Code to automatically configure Shift+Enter for VS Code, Alacritty, Zed, and Warp.

19 26 

20Run `/terminal-setup` within Claude Code to automatically configure Shift+Enter.27<Note>

28 The `/terminal-setup` command is only visible in terminals that require manual configuration. If you're using iTerm2, WezTerm, Ghostty, or Kitty, you won't see this command because Shift+Enter already works natively.

29</Note>

21 30 

22#### Set up Option+Enter (VS Code, iTerm2 or macOS Terminal.app):31**Set up Option+Enter (VS Code, iTerm2 or macOS Terminal.app)**

23 32 

24**For Mac Terminal.app:**33**For Mac Terminal.app:**

25 34 


33 42 

34### Notification setup43### Notification setup

35 44 

36Never miss when Claude completes a task with proper notification configuration:45When Claude finishes working and is waiting for your input, it fires a notification event. You can surface this event as a desktop notification through your terminal or run custom logic with [notification hooks](/en/hooks#notification).

37 46 

38#### iTerm 2 system notifications47#### Terminal notifications

39 48 

40For iTerm 2 alerts when tasks complete:49Kitty and Ghostty support desktop notifications without additional configuration. iTerm 2 requires setup:

41 50 

421. Open iTerm 2 Preferences511. Open iTerm 2 Settings → Profiles → Terminal

432. Navigate to Profiles Terminal522. Enable "Notification Center Alerts"

443. Enable "Silence bell" and Filter Alerts → "Send escape sequence-generated alerts"533. Click "Filter Alerts" and check "Send escape sequence-generated alerts"

454. Set your preferred notification delay

46 54 

47Note that these notifications are specific to iTerm 2 and not available in the default macOS Terminal.55If notifications aren't appearing, verify that your terminal app has notification permissions in your OS settings.

48 56 

49#### Custom notification hooks57Other terminals, including the default macOS Terminal, do not support native notifications. Use [notification hooks](/en/hooks#notification) instead.

50 58 

51For advanced notification handling, you can create [notification hooks](/en/docs/claude-code/hooks#notification) to run your own logic.59#### Notification hooks

60 

61To add custom behavior when notifications fire, such as playing a sound or sending a message, configure a [notification hook](/en/hooks#notification). Hooks run alongside terminal notifications, not as a replacement.

52 62 

53### Handling large inputs63### Handling large inputs

54 64 


65The supported subset includes:75The supported subset includes:

66 76 

67* Mode switching: `Esc` (to NORMAL), `i`/`I`, `a`/`A`, `o`/`O` (to INSERT)77* Mode switching: `Esc` (to NORMAL), `i`/`I`, `a`/`A`, `o`/`O` (to INSERT)

68* Navigation: `h`/`j`/`k`/`l`, `w`/`e`/`b`, `0`/`$`/`^`, `gg`/`G`78* Navigation: `h`/`j`/`k`/`l`, `w`/`e`/`b`, `0`/`$`/`^`, `gg`/`G`, `f`/`F`/`t`/`T` with `;`/`,` repeat

69* Editing: `x`, `dw`/`de`/`db`/`dd`/`D`, `cw`/`ce`/`cb`/`cc`/`C`, `.` (repeat)79* Editing: `x`, `dw`/`de`/`db`/`dd`/`D`, `cw`/`ce`/`cb`/`cc`/`C`, `.` (repeat)

80* Yank/paste: `yy`/`Y`, `yw`/`ye`/`yb`, `p`/`P`

81* Text objects: `iw`/`aw`, `iW`/`aW`, `i"`/`a"`, `i'`/`a'`, `i(`/`a(`, `i[`/`a[`, `i{`/`a{`

82* Indentation: `>>`/`<<`

83* Line operations: `J` (join lines)

84 

85See [Interactive mode](/en/interactive-mode#vim-editor-mode) for the complete reference.

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Enterprise deployment overview5# Enterprise deployment overview

2 6 

3> Learn how Claude Code can integrate with various third-party services and infrastructure to meet enterprise deployment requirements.7> Learn how Claude Code can integrate with various third-party services and infrastructure to meet enterprise deployment requirements.

4 8 

5This page provides an overview of available deployment options and helps you choose the right configuration for your organization.9Organizations can deploy Claude Code through Anthropic directly or through a cloud provider. This page helps you choose the right configuration.

10 

11## Compare deployment options

12 

13For most organizations, Claude for Teams or Claude for Enterprise provides the best experience. Team members get access to both Claude Code and Claude on the web with a single subscription, centralized billing, and no infrastructure setup required.

14 

15**Claude for Teams** is self-service and includes collaboration features, admin tools, and billing management. Best for smaller teams that need to get started quickly.

16 

17**Claude for Enterprise** adds SSO and domain capture, role-based permissions, compliance API access, and managed policy settings for deploying organization-wide Claude Code configurations. Best for larger organizations with security and compliance requirements.

6 18 

7## Provider comparison19Learn more about [Team plans](https://support.claude.com/en/articles/9266767-what-is-the-team-plan) and [Enterprise plans](https://support.claude.com/en/articles/9797531-what-is-the-enterprise-plan).

20 

21If your organization has specific infrastructure requirements, compare the options below:

8 22 

9<table>23<table>

10 <thead>24 <thead>

11 <tr>25 <tr>

12 <th>Feature</th>26 <th>Feature</th>

13 <th>Anthropic</th>27 <th>Claude for Teams/Enterprise</th>

28 <th>Anthropic Console</th>

14 <th>Amazon Bedrock</th>29 <th>Amazon Bedrock</th>

15 <th>Google Vertex AI</th>30 <th>Google Vertex AI</th>

31 <th>Microsoft Foundry</th>

16 </tr>32 </tr>

17 </thead>33 </thead>

18 34 

19 <tbody>35 <tbody>

36 <tr>

37 <td>Best for</td>

38 <td>Most organizations (recommended)</td>

39 <td>Individual developers</td>

40 <td>AWS-native deployments</td>

41 <td>GCP-native deployments</td>

42 <td>Azure-native deployments</td>

43 </tr>

44 

45 <tr>

46 <td>Billing</td>

47 <td><strong>Teams:</strong> \$150/seat (Premium) with PAYG available<br /><strong>Enterprise:</strong> <a href="https://claude.com/contact-sales">Contact Sales</a></td>

48 <td>PAYG</td>

49 <td>PAYG through AWS</td>

50 <td>PAYG through GCP</td>

51 <td>PAYG through Azure</td>

52 </tr>

53 

20 <tr>54 <tr>

21 <td>Regions</td>55 <td>Regions</td>

22 <td>Supported [countries](https://www.anthropic.com/supported-countries)</td>56 <td>Supported [countries](https://www.anthropic.com/supported-countries)</td>

57 <td>Supported [countries](https://www.anthropic.com/supported-countries)</td>

23 <td>Multiple AWS [regions](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html)</td>58 <td>Multiple AWS [regions](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html)</td>

24 <td>Multiple GCP [regions](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations)</td>59 <td>Multiple GCP [regions](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/locations)</td>

60 <td>Multiple Azure [regions](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/)</td>

25 </tr>61 </tr>

26 62 

27 <tr>63 <tr>


29 <td>Enabled by default</td>65 <td>Enabled by default</td>

30 <td>Enabled by default</td>66 <td>Enabled by default</td>

31 <td>Enabled by default</td>67 <td>Enabled by default</td>

68 <td>Enabled by default</td>

69 <td>Enabled by default</td>

32 </tr>70 </tr>

33 71 

34 <tr>72 <tr>

35 <td>Authentication</td>73 <td>Authentication</td>

74 <td>Claude.ai SSO or email</td>

36 <td>API key</td>75 <td>API key</td>

37 <td>AWS credentials (IAM)</td>76 <td>API key or AWS credentials</td>

38 <td>GCP credentials (OAuth/Service Account)</td>77 <td>GCP credentials</td>

78 <td>API key or Microsoft Entra ID</td>

39 </tr>79 </tr>

40 80 

41 <tr>81 <tr>

42 <td>Cost tracking</td>82 <td>Cost tracking</td>

43 <td>Dashboard</td>83 <td>Usage dashboard</td>

84 <td>Usage dashboard</td>

44 <td>AWS Cost Explorer</td>85 <td>AWS Cost Explorer</td>

45 <td>GCP Billing</td>86 <td>GCP Billing</td>

87 <td>Azure Cost Management</td>

88 </tr>

89 

90 <tr>

91 <td>Includes Claude on web</td>

92 <td>Yes</td>

93 <td>No</td>

94 <td>No</td>

95 <td>No</td>

96 <td>No</td>

46 </tr>97 </tr>

47 98 

48 <tr>99 <tr>

49 <td>Enterprise features</td>100 <td>Enterprise features</td>

50 <td>Teams, usage monitoring</td>101 <td>Team management, SSO, usage monitoring</td>

102 <td>None</td>

51 <td>IAM policies, CloudTrail</td>103 <td>IAM policies, CloudTrail</td>

52 <td>IAM roles, Cloud Audit Logs</td>104 <td>IAM roles, Cloud Audit Logs</td>

105 <td>RBAC policies, Azure Monitor</td>

53 </tr>106 </tr>

54 </tbody>107 </tbody>

55</table>108</table>

56 109 

57## Cloud providers110Select a deployment option to view setup instructions:

58 111 

59<CardGroup cols={2}>112* [Claude for Teams or Enterprise](/en/authentication#claude-for-teams-or-enterprise)

60 <Card title="Amazon Bedrock" icon="aws" href="/en/docs/claude-code/amazon-bedrock">113* [Anthropic Console](/en/authentication#claude-console-authentication)

61 Use Claude models through AWS infrastructure with IAM-based authentication and AWS-native monitoring114* [Amazon Bedrock](/en/amazon-bedrock)

62 </Card>115* [Google Vertex AI](/en/google-vertex-ai)

116* [Microsoft Foundry](/en/microsoft-foundry)

63 117 

64 <Card title="Google Vertex AI" icon="google" href="/en/docs/claude-code/google-vertex-ai">118## Configure proxies and gateways

65 Access Claude models via Google Cloud Platform with enterprise-grade security and compliance

66 </Card>

67</CardGroup>

68 119 

69## Corporate infrastructure120Most organizations can use a cloud provider directly without additional configuration. However, you may need to configure a corporate proxy or LLM gateway if your organization has specific network or management requirements. These are different configurations that can be used together:

70 121 

71<CardGroup cols={2}>122* **Corporate proxy**: Routes traffic through an HTTP/HTTPS proxy. Use this if your organization requires all outbound traffic to pass through a proxy server for security monitoring, compliance, or network policy enforcement. Configure with the `HTTPS_PROXY` or `HTTP_PROXY` environment variables. Learn more in [Enterprise network configuration](/en/network-config).

72 <Card title="Enterprise Network" icon="shield" href="/en/docs/claude-code/network-config">123* **LLM Gateway**: A service that sits between Claude Code and the cloud provider to handle authentication and routing. Use this if you need centralized usage tracking across teams, custom rate limiting or budgets, or centralized authentication management. Configure with the `ANTHROPIC_BASE_URL`, `ANTHROPIC_BEDROCK_BASE_URL`, or `ANTHROPIC_VERTEX_BASE_URL` environment variables. Learn more in [LLM gateway configuration](/en/llm-gateway).

73 Configure Claude Code to work with your organization's proxy servers and SSL/TLS requirements

74 </Card>

75 124 

76 <Card title="LLM Gateway" icon="server" href="/en/docs/claude-code/llm-gateway">125The following examples show the environment variables to set in your shell or shell profile (`.bashrc`, `.zshrc`). See [Settings](/en/settings) for other configuration methods.

77 Deploy centralized model access with usage tracking, budgeting, and audit logging

78 </Card>

79</CardGroup>

80 126 

81## Configuration overview127### Amazon Bedrock

82 128 

83Claude Code supports flexible configuration options that allow you to combine different providers and infrastructure:129<Tabs>

130 <Tab title="Corporate proxy">

131 Route Bedrock traffic through your corporate proxy by setting the following [environment variables](/en/settings#environment-variables):

84 132 

85<Note>133 ```bash theme={null}

86 Understand the difference between:134 # Enable Bedrock

135 export CLAUDE_CODE_USE_BEDROCK=1

136 export AWS_REGION=us-east-1

87 137 

88 * **Corporate proxy**: An HTTP/HTTPS proxy for routing traffic (set via `HTTPS_PROXY` or `HTTP_PROXY`)138 # Configure corporate proxy

89 * **LLM Gateway**: A service that handles authentication and provides provider-compatible endpoints (set via `ANTHROPIC_BASE_URL`, `ANTHROPIC_BEDROCK_BASE_URL`, or `ANTHROPIC_VERTEX_BASE_URL`)139 export HTTPS_PROXY='https://proxy.example.com:8080'

140 ```

141 </Tab>

90 142 

91 Both configurations can be used in tandem.143 <Tab title="LLM Gateway">

92</Note>144 Route Bedrock traffic through your LLM gateway by setting the following [environment variables](/en/settings#environment-variables):

93 145 

94### Using Bedrock with corporate proxy146 ```bash theme={null}

147 # Enable Bedrock

148 export CLAUDE_CODE_USE_BEDROCK=1

95 149 

96Route Bedrock traffic through a corporate HTTP/HTTPS proxy:150 # Configure LLM gateway

151 export ANTHROPIC_BEDROCK_BASE_URL='https://your-llm-gateway.com/bedrock'

152 export CLAUDE_CODE_SKIP_BEDROCK_AUTH=1 # If gateway handles AWS auth

153 ```

154 </Tab>

155</Tabs>

97 156 

98```bash theme={null}157### Microsoft Foundry

99# Enable Bedrock

100export CLAUDE_CODE_USE_BEDROCK=1

101export AWS_REGION=us-east-1

102 158 

103# Configure corporate proxy159<Tabs>

104export HTTPS_PROXY='https://proxy.example.com:8080'160 <Tab title="Corporate proxy">

105```161 Route Foundry traffic through your corporate proxy by setting the following [environment variables](/en/settings#environment-variables):

106 162 

107### Using Bedrock with LLM Gateway163 ```bash theme={null}

164 # Enable Microsoft Foundry

165 export CLAUDE_CODE_USE_FOUNDRY=1

166 export ANTHROPIC_FOUNDRY_RESOURCE=your-resource

167 export ANTHROPIC_FOUNDRY_API_KEY=your-api-key # Or omit for Entra ID auth

108 168 

109Use a gateway service that provides Bedrock-compatible endpoints:169 # Configure corporate proxy

170 export HTTPS_PROXY='https://proxy.example.com:8080'

171 ```

172 </Tab>

110 173 

111```bash theme={null}174 <Tab title="LLM Gateway">

112# Enable Bedrock175 Route Foundry traffic through your LLM gateway by setting the following [environment variables](/en/settings#environment-variables):

113export CLAUDE_CODE_USE_BEDROCK=1

114 176 

115# Configure LLM gateway177 ```bash theme={null}

116export ANTHROPIC_BEDROCK_BASE_URL='https://your-llm-gateway.com/bedrock'178 # Enable Microsoft Foundry

117export CLAUDE_CODE_SKIP_BEDROCK_AUTH=1 # If gateway handles AWS auth179 export CLAUDE_CODE_USE_FOUNDRY=1

118```

119 180 

120### Using Vertex AI with corporate proxy181 # Configure LLM gateway

182 export ANTHROPIC_FOUNDRY_BASE_URL='https://your-llm-gateway.com'

183 export CLAUDE_CODE_SKIP_FOUNDRY_AUTH=1 # If gateway handles Azure auth

184 ```

185 </Tab>

186</Tabs>

121 187 

122Route Vertex AI traffic through a corporate HTTP/HTTPS proxy:188### Google Vertex AI

123 189 

124```bash theme={null}190<Tabs>

125# Enable Vertex191 <Tab title="Corporate proxy">

126export CLAUDE_CODE_USE_VERTEX=1192 Route Vertex AI traffic through your corporate proxy by setting the following [environment variables](/en/settings#environment-variables):

127export CLOUD_ML_REGION=us-east5

128export ANTHROPIC_VERTEX_PROJECT_ID=your-project-id

129 193 

130# Configure corporate proxy194 ```bash theme={null}

131export HTTPS_PROXY='https://proxy.example.com:8080'195 # Enable Vertex

132```196 export CLAUDE_CODE_USE_VERTEX=1

197 export CLOUD_ML_REGION=us-east5

198 export ANTHROPIC_VERTEX_PROJECT_ID=your-project-id

133 199 

134### Using Vertex AI with LLM Gateway200 # Configure corporate proxy

201 export HTTPS_PROXY='https://proxy.example.com:8080'

202 ```

203 </Tab>

135 204 

136Combine Google Vertex AI models with an LLM gateway for centralized management:205 <Tab title="LLM Gateway">

206 Route Vertex AI traffic through your LLM gateway by setting the following [environment variables](/en/settings#environment-variables):

137 207 

138```bash theme={null}208 ```bash theme={null}

139# Enable Vertex209 # Enable Vertex

140export CLAUDE_CODE_USE_VERTEX=1210 export CLAUDE_CODE_USE_VERTEX=1

141 211 

142# Configure LLM gateway212 # Configure LLM gateway

143export ANTHROPIC_VERTEX_BASE_URL='https://your-llm-gateway.com/vertex'213 export ANTHROPIC_VERTEX_BASE_URL='https://your-llm-gateway.com/vertex'

144export CLAUDE_CODE_SKIP_VERTEX_AUTH=1 # If gateway handles GCP auth214 export CLAUDE_CODE_SKIP_VERTEX_AUTH=1 # If gateway handles GCP auth

145```215 ```

216 </Tab>

217</Tabs>

146 218 

147### Authentication configuration219<Tip>

148 220 Use `/status` in Claude Code to verify your proxy and gateway configuration is applied correctly.

149Claude Code uses the `ANTHROPIC_AUTH_TOKEN` for the `Authorization` header when needed. The `SKIP_AUTH` flags (`CLAUDE_CODE_SKIP_BEDROCK_AUTH`, `CLAUDE_CODE_SKIP_VERTEX_AUTH`) are used in LLM gateway scenarios where the gateway handles provider authentication.221</Tip>

150 

151## Choosing the right deployment configuration

152 

153Consider these factors when selecting your deployment approach:

154 

155### Direct provider access

156 

157Best for organizations that:

158 

159* Want the simplest setup

160* Have existing AWS or GCP infrastructure

161* Need provider-native monitoring and compliance

162 

163### Corporate proxy

164 

165Best for organizations that:

166 

167* Have existing corporate proxy requirements

168* Need traffic monitoring and compliance

169* Must route all traffic through specific network paths

170 

171### LLM Gateway

172 

173Best for organizations that:

174 

175* Need usage tracking across teams

176* Want to dynamically switch between models

177* Require custom rate limiting or budgets

178* Need centralized authentication management

179 

180## Debugging

181 

182When debugging your deployment:

183 

184* Use the `claude /status` [slash command](/en/docs/claude-code/slash-commands). This command provides observability into any applied authentication, proxy, and URL settings.

185* Set environment variable `export ANTHROPIC_LOG=debug` to log requests.

186 222 

187## Best practices for organizations223## Best practices for organizations

188 224 

189### 1. Invest in documentation and memory225### Invest in documentation and memory

190 226 

191We strongly recommend investing in documentation so that Claude Code understands your codebase. Organizations can deploy CLAUDE.md files at multiple levels:227We strongly recommend investing in documentation so that Claude Code understands your codebase. Organizations can deploy CLAUDE.md files at multiple levels:

192 228 

193* **Organization-wide**: Deploy to system directories like `/Library/Application Support/ClaudeCode/CLAUDE.md` (macOS) for company-wide standards229* **Organization-wide**: Deploy to system directories like `/Library/Application Support/ClaudeCode/CLAUDE.md` (macOS) for company-wide standards

194* **Repository-level**: Create `CLAUDE.md` files in repository roots containing project architecture, build commands, and contribution guidelines. Check these into source control so all users benefit230* **Repository-level**: Create `CLAUDE.md` files in repository roots containing project architecture, build commands, and contribution guidelines. Check these into source control so all users benefit

195 231 

196 [Learn more](/en/docs/claude-code/memory).232Learn more in [Memory and CLAUDE.md files](/en/memory).

197 233 

198### 2. Simplify deployment234### Simplify deployment

199 235 

200If you have a custom development environment, we find that creating a "one click" way to install Claude Code is key to growing adoption across an organization.236If you have a custom development environment, we find that creating a "one click" way to install Claude Code is key to growing adoption across an organization.

201 237 

202### 3. Start with guided usage238### Start with guided usage

203 239 

204Encourage new users to try Claude Code for codebase Q\&A, or on smaller bug fixes or feature requests. Ask Claude Code to make a plan. Check Claude's suggestions and give feedback if it's off-track. Over time, as users understand this new paradigm better, then they'll be more effective at letting Claude Code run more agentically.240Encourage new users to try Claude Code for codebase Q\&A, or on smaller bug fixes or feature requests. Ask Claude Code to make a plan. Check Claude's suggestions and give feedback if it's off-track. Over time, as users understand this new paradigm better, then they'll be more effective at letting Claude Code run more agentically.

205 241 

206### 4. Configure security policies242### Pin model versions for cloud providers

243 

244If you deploy through [Bedrock](/en/amazon-bedrock), [Vertex AI](/en/google-vertex-ai), or [Foundry](/en/microsoft-foundry), pin specific model versions using `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, and `ANTHROPIC_DEFAULT_HAIKU_MODEL`. Without pinning, Claude Code aliases resolve to the latest version, which can break users when Anthropic releases a new model that isn't yet enabled in your account. See [Model configuration](/en/model-config#pin-models-for-third-party-deployments) for details.

207 245 

208Security teams can configure managed permissions for what Claude Code is and is not allowed to do, which cannot be overwritten by local configuration. [Learn more](/en/docs/claude-code/security).246### Configure security policies

209 247 

210### 5. Leverage MCP for integrations248Security teams can configure managed permissions for what Claude Code is and is not allowed to do, which cannot be overwritten by local configuration. [Learn more](/en/security).

211 249 

212MCP is a great way to give Claude Code more information, such as connecting to ticket management systems or error logs. We recommend that one central team configures MCP servers and checks a `.mcp.json` configuration into the codebase so that all users benefit. [Learn more](/en/docs/claude-code/mcp).250### Leverage MCP for integrations

213 251 

214At Anthropic, we trust Claude Code to power development across every Anthropic codebase. We hope you enjoy using Claude Code as much as we do!252MCP is a great way to give Claude Code more information, such as connecting to ticket management systems or error logs. We recommend that one central team configures MCP servers and checks a `.mcp.json` configuration into the codebase so that all users benefit. [Learn more](/en/mcp).

253 

254At Anthropic, we trust Claude Code to power development across every Anthropic codebase. We hope you enjoy using Claude Code as much as we do.

215 255 

216## Next steps256## Next steps

217 257 

218* [Set up Amazon Bedrock](/en/docs/claude-code/amazon-bedrock) for AWS-native deployment258Once you've chosen a deployment option and configured access for your team:

219* [Configure Google Vertex AI](/en/docs/claude-code/google-vertex-ai) for GCP deployment259 

220* [Configure Enterprise Network](/en/docs/claude-code/network-config) for network requirements2601. **Roll out to your team**: Share installation instructions and have team members [install Claude Code](/en/setup) and authenticate with their credentials.

221* [Deploy LLM Gateway](/en/docs/claude-code/llm-gateway) for enterprise management2612. **Set up shared configuration**: Create a [CLAUDE.md file](/en/memory) in your repositories to help Claude Code understand your codebase and coding standards.

222* [Settings](/en/docs/claude-code/settings) for configuration options and environment variables2623. **Configure permissions**: Review [security settings](/en/security) to define what Claude Code can and cannot do in your environment.

troubleshooting.md +645 −90

Details

1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

4 

1# Troubleshooting5# Troubleshooting

2 6 

3> Discover solutions to common issues with Claude Code installation and usage.7> Discover solutions to common issues with Claude Code installation and usage.

4 8 

9## Troubleshoot installation issues

10 

11<Tip>

12 If you'd rather skip the terminal entirely, the [Claude Code Desktop app](/en/desktop-quickstart) lets you install and use Claude Code through a graphical interface. Download it for [macOS](https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code\&utm_medium=docs) or [Windows](https://claude.ai/api/desktop/win32/x64/exe/latest/redirect?utm_source=claude_code\&utm_medium=docs) and start coding without any command-line setup.

13</Tip>

14 

15Find the error message or symptom you're seeing:

16 

17| What you see | Solution |

18| :---------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------- |

19| `command not found: claude` or `'claude' is not recognized` | [Fix your PATH](#command-not-found-claude-after-installation) |

20| `syntax error near unexpected token '<'` | [Install script returns HTML](#install-script-returns-html-instead-of-a-shell-script) |

21| `curl: (56) Failure writing output to destination` | [Download script first, then run it](#curl-56-failure-writing-output-to-destination) |

22| `Killed` during install on Linux | [Add swap space for low-memory servers](#install-killed-on-low-memory-linux-servers) |

23| `TLS connect error` or `SSL/TLS secure channel` | [Update CA certificates](#tls-or-ssl-connection-errors) |

24| `Failed to fetch version` or can't reach download server | [Check network and proxy settings](#check-network-connectivity) |

25| `irm is not recognized` or `&& is not valid` | [Use the right command for your shell](#windows-irm-or--not-recognized) |

26| `Claude Code on Windows requires git-bash` | [Install or configure Git Bash](#windows-claude-code-on-windows-requires-git-bash) |

27| `Error loading shared library` | [Wrong binary variant for your system](#linux-wrong-binary-variant-installed-muslglibc-mismatch) |

28| `Illegal instruction` on Linux | [Architecture mismatch](#illegal-instruction-on-linux) |

29| `dyld: cannot load` or `Abort trap` on macOS | [Binary incompatibility](#dyld-cannot-load-on-macos) |

30| `Invoke-Expression: Missing argument in parameter list` | [Install script returns HTML](#install-script-returns-html-instead-of-a-shell-script) |

31| `App unavailable in region` | Claude Code is not available in your country. See [supported countries](https://www.anthropic.com/supported-countries). |

32| `unable to get local issuer certificate` | [Configure corporate CA certificates](#tls-or-ssl-connection-errors) |

33| `OAuth error` or `403 Forbidden` | [Fix authentication](#authentication-issues) |

34 

35If your issue isn't listed, work through these diagnostic steps.

36 

37## Debug installation problems

38 

39### Check network connectivity

40 

41The installer downloads from `storage.googleapis.com`. Verify you can reach it:

42 

43```bash theme={null}

44curl -sI https://storage.googleapis.com

45```

46 

47If this fails, your network may be blocking the connection. Common causes:

48 

49* Corporate firewalls or proxies blocking Google Cloud Storage

50* Regional network restrictions: try a VPN or alternative network

51* TLS/SSL issues: update your system's CA certificates, or check if `HTTPS_PROXY` is configured

52 

53If you're behind a corporate proxy, set `HTTPS_PROXY` and `HTTP_PROXY` to your proxy's address before installing. Ask your IT team for the proxy URL if you don't know it, or check your browser's proxy settings.

54 

55This example sets both proxy variables, then runs the installer through your proxy:

56 

57```bash theme={null}

58export HTTP_PROXY=http://proxy.example.com:8080

59export HTTPS_PROXY=http://proxy.example.com:8080

60curl -fsSL https://claude.ai/install.sh | bash

61```

62 

63### Verify your PATH

64 

65If installation succeeded but you get a `command not found` or `not recognized` error when running `claude`, the install directory isn't in your PATH. Your shell searches for programs in directories listed in PATH, and the installer places `claude` at `~/.local/bin/claude` on macOS/Linux or `%USERPROFILE%\.local\bin\claude.exe` on Windows.

66 

67Check if the install directory is in your PATH by listing your PATH entries and filtering for `local/bin`:

68 

69<Tabs>

70 <Tab title="macOS/Linux">

71 ```bash theme={null}

72 echo $PATH | tr ':' '\n' | grep local/bin

73 ```

74 

75 If there's no output, the directory is missing. Add it to your shell configuration:

76 

77 ```bash theme={null}

78 # Zsh (macOS default)

79 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

80 source ~/.zshrc

81 

82 # Bash (Linux default)

83 echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

84 source ~/.bashrc

85 ```

86 

87 Alternatively, close and reopen your terminal.

88 

89 Verify the fix worked:

90 

91 ```bash theme={null}

92 claude --version

93 ```

94 </Tab>

95 

96 <Tab title="Windows PowerShell">

97 ```powershell theme={null}

98 $env:PATH -split ';' | Select-String 'local\\bin'

99 ```

100 

101 If there's no output, add the install directory to your User PATH:

102 

103 ```powershell theme={null}

104 $currentPath = [Environment]::GetEnvironmentVariable('PATH', 'User')

105 [Environment]::SetEnvironmentVariable('PATH', "$currentPath;$env:USERPROFILE\.local\bin", 'User')

106 ```

107 

108 Restart your terminal for the change to take effect.

109 

110 Verify the fix worked:

111 

112 ```powershell theme={null}

113 claude --version

114 ```

115 </Tab>

116 

117 <Tab title="Windows CMD">

118 ```batch theme={null}

119 echo %PATH% | findstr /i "local\bin"

120 ```

121 

122 If there's no output, open System Settings, go to Environment Variables, and add `%USERPROFILE%\.local\bin` to your User PATH variable. Restart your terminal.

123 

124 Verify the fix worked:

125 

126 ```batch theme={null}

127 claude --version

128 ```

129 </Tab>

130</Tabs>

131 

132### Check for conflicting installations

133 

134Multiple Claude Code installations can cause version mismatches or unexpected behavior. Check what's installed:

135 

136<Tabs>

137 <Tab title="macOS/Linux">

138 List all `claude` binaries found in your PATH:

139 

140 ```bash theme={null}

141 which -a claude

142 ```

143 

144 Check whether the native installer and npm versions are present:

145 

146 ```bash theme={null}

147 ls -la ~/.local/bin/claude

148 ```

149 

150 ```bash theme={null}

151 ls -la ~/.claude/local/

152 ```

153 

154 ```bash theme={null}

155 npm -g ls @anthropic-ai/claude-code 2>/dev/null

156 ```

157 </Tab>

158 

159 <Tab title="Windows PowerShell">

160 ```powershell theme={null}

161 where.exe claude

162 Test-Path "$env:LOCALAPPDATA\Claude Code\claude.exe"

163 ```

164 </Tab>

165</Tabs>

166 

167If you find multiple installations, keep only one. The native install at `~/.local/bin/claude` is recommended. Remove any extra installations:

168 

169Uninstall an npm global install:

170 

171```bash theme={null}

172npm uninstall -g @anthropic-ai/claude-code

173```

174 

175Remove a Homebrew install on macOS:

176 

177```bash theme={null}

178brew uninstall --cask claude-code

179```

180 

181### Check directory permissions

182 

183The installer needs write access to `~/.local/bin/` and `~/.claude/`. If installation fails with permission errors, check whether these directories are writable:

184 

185```bash theme={null}

186test -w ~/.local/bin && echo "writable" || echo "not writable"

187test -w ~/.claude && echo "writable" || echo "not writable"

188```

189 

190If either directory isn't writable, create the install directory and set your user as the owner:

191 

192```bash theme={null}

193sudo mkdir -p ~/.local/bin

194sudo chown -R $(whoami) ~/.local

195```

196 

197### Verify the binary works

198 

199If `claude` is installed but crashes or hangs on startup, run these checks to narrow down the cause.

200 

201Confirm the binary exists and is executable:

202 

203```bash theme={null}

204ls -la $(which claude)

205```

206 

207On Linux, check for missing shared libraries. If `ldd` shows missing libraries, you may need to install system packages. On Alpine Linux and other musl-based distributions, see [Alpine Linux setup](/en/setup#alpine-linux-and-musl-based-distributions).

208 

209```bash theme={null}

210ldd $(which claude) | grep "not found"

211```

212 

213Run a quick sanity check that the binary can execute:

214 

215```bash theme={null}

216claude --version

217```

218 

5## Common installation issues219## Common installation issues

6 220 

221These are the most frequently encountered installation problems and their solutions.

222 

223### Install script returns HTML instead of a shell script

224 

225When running the install command, you may see one of these errors:

226 

227```

228bash: line 1: syntax error near unexpected token `<'

229bash: line 1: `<!DOCTYPE html>'

230```

231 

232On PowerShell, the same problem appears as:

233 

234```

235Invoke-Expression: Missing argument in parameter list.

236```

237 

238This means the install URL returned an HTML page instead of the install script. If the HTML page says "App unavailable in region," Claude Code is not available in your country. See [supported countries](https://www.anthropic.com/supported-countries).

239 

240Otherwise, this can happen due to network issues, regional routing, or a temporary service disruption.

241 

242**Solutions:**

243 

2441. **Use an alternative install method**:

245 

246 On macOS or Linux, install via Homebrew:

247 

248 ```bash theme={null}

249 brew install --cask claude-code

250 ```

251 

252 On Windows, install via WinGet:

253 

254 ```powershell theme={null}

255 winget install Anthropic.ClaudeCode

256 ```

257 

2582. **Retry after a few minutes**: the issue is often temporary. Wait and try the original command again.

259 

260### `command not found: claude` after installation

261 

262The install finished but `claude` doesn't work. The exact error varies by platform:

263 

264| Platform | Error message |

265| :---------- | :--------------------------------------------------------------------- |

266| macOS | `zsh: command not found: claude` |

267| Linux | `bash: claude: command not found` |

268| Windows CMD | `'claude' is not recognized as an internal or external command` |

269| PowerShell | `claude : The term 'claude' is not recognized as the name of a cmdlet` |

270 

271This means the install directory isn't in your shell's search path. See [Verify your PATH](#verify-your-path) for the fix on each platform.

272 

273### `curl: (56) Failure writing output to destination`

274 

275The `curl ... | bash` command downloads the script and passes it directly to Bash for execution using a pipe (`|`). This error means the connection broke before the script finished downloading. Common causes include network interruptions, the download being blocked mid-stream, or system resource limits.

276 

277**Solutions:**

278 

2791. **Check network stability**: Claude Code binaries are hosted on Google Cloud Storage. Test that you can reach it:

280 ```bash theme={null}

281 curl -fsSL https://storage.googleapis.com -o /dev/null

282 ```

283 If the command completes silently, your connection is fine and the issue is likely intermittent. Retry the install command. If you see an error, your network may be blocking the download.

284 

2852. **Try an alternative install method**:

286 

287 On macOS or Linux:

288 

289 ```bash theme={null}

290 brew install --cask claude-code

291 ```

292 

293 On Windows:

294 

295 ```powershell theme={null}

296 winget install Anthropic.ClaudeCode

297 ```

298 

299### TLS or SSL connection errors

300 

301Errors like `curl: (35) TLS connect error`, `schannel: next InitializeSecurityContext failed`, or PowerShell's `Could not establish trust relationship for the SSL/TLS secure channel` indicate TLS handshake failures.

302 

303**Solutions:**

304 

3051. **Update your system CA certificates**:

306 

307 On Ubuntu/Debian:

308 

309 ```bash theme={null}

310 sudo apt-get update && sudo apt-get install ca-certificates

311 ```

312 

313 On macOS via Homebrew:

314 

315 ```bash theme={null}

316 brew install ca-certificates

317 ```

318 

3192. **On Windows, enable TLS 1.2** in PowerShell before running the installer:

320 ```powershell theme={null}

321 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

322 irm https://claude.ai/install.ps1 | iex

323 ```

324 

3253. **Check for proxy or firewall interference**: corporate proxies that perform TLS inspection can cause these errors, including `unable to get local issuer certificate`. Set `NODE_EXTRA_CA_CERTS` to your corporate CA certificate bundle:

326 ```bash theme={null}

327 export NODE_EXTRA_CA_CERTS=/path/to/corporate-ca.pem

328 ```

329 Ask your IT team for the certificate file if you don't have it. You can also try on a direct connection to confirm the proxy is the cause.

330 

331### `Failed to fetch version from storage.googleapis.com`

332 

333The installer couldn't reach the download server. This typically means `storage.googleapis.com` is blocked on your network.

334 

335**Solutions:**

336 

3371. **Test connectivity directly**:

338 ```bash theme={null}

339 curl -sI https://storage.googleapis.com

340 ```

341 

3422. **If behind a proxy**, set `HTTPS_PROXY` so the installer can route through it. See [proxy configuration](/en/network-config#proxy-configuration) for details.

343 ```bash theme={null}

344 export HTTPS_PROXY=http://proxy.example.com:8080

345 curl -fsSL https://claude.ai/install.sh | bash

346 ```

347 

3483. **If on a restricted network**, try a different network or VPN, or use an alternative install method:

349 

350 On macOS or Linux:

351 

352 ```bash theme={null}

353 brew install --cask claude-code

354 ```

355 

356 On Windows:

357 

358 ```powershell theme={null}

359 winget install Anthropic.ClaudeCode

360 ```

361 

362### Windows: `irm` or `&&` not recognized

363 

364If you see `'irm' is not recognized` or `The token '&&' is not valid`, you're running the wrong command for your shell.

365 

366* **`irm` not recognized**: you're in CMD, not PowerShell. You have two options:

367 

368 Open PowerShell by searching for "PowerShell" in the Start menu, then run the original install command:

369 

370 ```powershell theme={null}

371 irm https://claude.ai/install.ps1 | iex

372 ```

373 

374 Or stay in CMD and use the CMD installer instead:

375 

376 ```batch theme={null}

377 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

378 ```

379 

380* **`&&` not valid**: you're in PowerShell but ran the CMD installer command. Use the PowerShell installer:

381 ```powershell theme={null}

382 irm https://claude.ai/install.ps1 | iex

383 ```

384 

385### Install killed on low-memory Linux servers

386 

387If you see `Killed` during installation on a VPS or cloud instance:

388 

389```

390Setting up Claude Code...

391Installing Claude Code native build latest...

392bash: line 142: 34803 Killed "$binary_path" install ${TARGET:+"$TARGET"}

393```

394 

395The Linux OOM killer terminated the process because the system ran out of memory. Claude Code requires at least 4 GB of available RAM.

396 

397**Solutions:**

398 

3991. **Add swap space** if your server has limited RAM. Swap uses disk space as overflow memory, letting the install complete even with low physical RAM.

400 

401 Create a 2 GB swap file and enable it:

402 

403 ```bash theme={null}

404 sudo fallocate -l 2G /swapfile

405 sudo chmod 600 /swapfile

406 sudo mkswap /swapfile

407 sudo swapon /swapfile

408 ```

409 

410 Then retry the installation:

411 

412 ```bash theme={null}

413 curl -fsSL https://claude.ai/install.sh | bash

414 ```

415 

4162. **Close other processes** to free memory before installing.

417 

4183. **Use a larger instance** if possible. Claude Code requires at least 4 GB of RAM.

419 

420### Install hangs in Docker

421 

422When installing Claude Code in a Docker container, installing as root into `/` can cause hangs.

423 

424**Solutions:**

425 

4261. **Set a working directory** before running the installer. When run from `/`, the installer scans the entire filesystem, which causes excessive memory usage. Setting `WORKDIR` limits the scan to a small directory:

427 ```dockerfile theme={null}

428 WORKDIR /tmp

429 RUN curl -fsSL https://claude.ai/install.sh | bash

430 ```

431 

4322. **Increase Docker memory limits** if using Docker Desktop:

433 ```bash theme={null}

434 docker build --memory=4g .

435 ```

436 

437### Windows: Claude Desktop overrides `claude` CLI command

438 

439If you installed an older version of Claude Desktop, it may register a `Claude.exe` in the `WindowsApps` directory that takes PATH priority over Claude Code CLI. Running `claude` opens the Desktop app instead of the CLI.

440 

441Update Claude Desktop to the latest version to fix this issue.

442 

443### Windows: "Claude Code on Windows requires git-bash"

444 

445Claude Code on native Windows needs [Git for Windows](https://git-scm.com/downloads/win), which includes Git Bash.

446 

447**If Git is not installed**, download and install it from [git-scm.com/downloads/win](https://git-scm.com/downloads/win). During setup, select "Add to PATH." Restart your terminal after installing.

448 

449**If Git is already installed** but Claude Code still can't find it, set the path in your [settings.json file](/en/settings):

450 

451```json theme={null}

452{

453 "env": {

454 "CLAUDE_CODE_GIT_BASH_PATH": "C:\\Program Files\\Git\\bin\\bash.exe"

455 }

456}

457```

458 

459If your Git is installed somewhere else, find the path by running `where.exe git` in PowerShell and use the `bin\bash.exe` path from that directory.

460 

461### Linux: wrong binary variant installed (musl/glibc mismatch)

462 

463If you see errors about missing shared libraries like `libstdc++.so.6` or `libgcc_s.so.1` after installation, the installer may have downloaded the wrong binary variant for your system.

464 

465```

466Error loading shared library libstdc++.so.6: No such file or directory

467```

468 

469This can happen on glibc-based systems that have musl cross-compilation packages installed, causing the installer to misdetect the system as musl.

470 

471**Solutions:**

472 

4731. **Check which libc your system uses**:

474 ```bash theme={null}

475 ldd /bin/ls | head -1

476 ```

477 If it shows `linux-vdso.so` or references to `/lib/x86_64-linux-gnu/`, you're on glibc. If it shows `musl`, you're on musl.

478 

4792. **If you're on glibc but got the musl binary**, remove the installation and reinstall. You can also manually download the correct binary from the GCS bucket at `https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/{VERSION}/manifest.json`. File a [GitHub issue](https://github.com/anthropics/claude-code/issues) with the output of `ldd /bin/ls` and `ls /lib/libc.musl*`.

480 

4813. **If you're actually on musl** (Alpine Linux), install the required packages:

482 ```bash theme={null}

483 apk add libgcc libstdc++ ripgrep

484 ```

485 

486### `Illegal instruction` on Linux

487 

488If the installer prints `Illegal instruction` instead of the OOM `Killed` message, the downloaded binary doesn't match your CPU architecture. This commonly happens on ARM servers that receive an x86 binary, or on older CPUs that lack required instruction sets.

489 

490```

491bash: line 142: 2238232 Illegal instruction "$binary_path" install ${TARGET:+"$TARGET"}

492```

493 

494**Solutions:**

495 

4961. **Verify your architecture**:

497 ```bash theme={null}

498 uname -m

499 ```

500 `x86_64` means 64-bit Intel/AMD, `aarch64` means ARM64. If the binary doesn't match, [file a GitHub issue](https://github.com/anthropics/claude-code/issues) with the output.

501 

5022. **Try an alternative install method** while the architecture issue is resolved:

503 ```bash theme={null}

504 brew install --cask claude-code

505 ```

506 

507### `dyld: cannot load` on macOS

508 

509If you see `dyld: cannot load` or `Abort trap: 6` during installation, the binary is incompatible with your macOS version or hardware.

510 

511```

512dyld: cannot load 'claude-2.1.42-darwin-x64' (load command 0x80000034 is unknown)

513Abort trap: 6

514```

515 

516**Solutions:**

517 

5181. **Check your macOS version**: Claude Code requires macOS 13.0 or later. Open the Apple menu and select About This Mac to check your version.

519 

5202. **Update macOS** if you're on an older version. The binary uses load commands that older macOS versions don't support.

521 

5223. **Try Homebrew** as an alternative install method:

523 ```bash theme={null}

524 brew install --cask claude-code

525 ```

526 

7### Windows installation issues: errors in WSL527### Windows installation issues: errors in WSL

8 528 

9You might encounter the following issues in WSL:529You might encounter the following issues in WSL:

10 530 

11**OS/platform detection issues**: If you receive an error during installation, WSL may be using Windows `npm`. Try:531**OS/platform detection issues**: if you receive an error during installation, WSL may be using Windows `npm`. Try:

12 532 

13* Run `npm config set os linux` before installation533* Run `npm config set os linux` before installation

14* Install with `npm install -g @anthropic-ai/claude-code --force --no-os-check` (Do NOT use `sudo`)534* Install with `npm install -g @anthropic-ai/claude-code --force --no-os-check`. Do not use `sudo`.

15 535 

16**Node not found errors**: If you see `exec: node: not found` when running `claude`, your WSL environment may be using a Windows installation of Node.js. You can confirm this with `which npm` and `which node`, which should point to Linux paths starting with `/usr/` rather than `/mnt/c/`. To fix this, try installing Node via your Linux distribution's package manager or via [`nvm`](https://github.com/nvm-sh/nvm).536**Node not found errors**: if you see `exec: node: not found` when running `claude`, your WSL environment may be using a Windows installation of Node.js. You can confirm this with `which npm` and `which node`, which should point to Linux paths starting with `/usr/` rather than `/mnt/c/`. To fix this, try installing Node via your Linux distribution's package manager or via [`nvm`](https://github.com/nvm-sh/nvm).

17 537 

18**nvm version conflicts**: If you have nvm installed in both WSL and Windows, you may experience version conflicts when switching Node versions in WSL. This happens because WSL imports the Windows PATH by default, causing Windows nvm/npm to take priority over the WSL installation.538**nvm version conflicts**: if you have nvm installed in both WSL and Windows, you may experience version conflicts when switching Node versions in WSL. This happens because WSL imports the Windows PATH by default, causing Windows nvm/npm to take priority over the WSL installation.

19 539 

20You can identify this issue by:540You can identify this issue by:

21 541 


50```570```

51 571 

52<Warning>572<Warning>

53 Avoid disabling Windows PATH importing (`appendWindowsPath = false`) as this breaks the ability to easily call Windows executables from WSL. Similarly, avoid uninstalling Node.js from Windows if you use it for Windows development.573 Avoid disabling Windows PATH importing via `appendWindowsPath = false` as this breaks the ability to call Windows executables from WSL. Similarly, avoid uninstalling Node.js from Windows if you use it for Windows development.

54</Warning>574</Warning>

55 575 

56### Linux and Mac installation issues: permission or command not found errors576### WSL2 sandbox setup

57 577 

58When installing Claude Code with npm, `PATH` problems may prevent access to `claude`.578[Sandboxing](/en/sandboxing) is supported on WSL2 but requires installing additional packages. If you see an error like "Sandbox requires socat and bubblewrap" when running `/sandbox`, install the dependencies:

59You may also encounter permission errors if your npm global prefix is not user writable (eg. `/usr`, or `/usr/local`).

60 579 

61#### Recommended solution: Native Claude Code installation580<Tabs>

581 <Tab title="Ubuntu/Debian">

582 ```bash theme={null}

583 sudo apt-get install bubblewrap socat

584 ```

585 </Tab>

62 586 

63Claude Code has a native installation that doesn't depend on npm or Node.js.587 <Tab title="Fedora">

588 ```bash theme={null}

589 sudo dnf install bubblewrap socat

590 ```

591 </Tab>

592</Tabs>

64 593 

65<Note>594WSL1 does not support sandboxing. If you see "Sandboxing requires WSL2", you need to upgrade to WSL2 or run Claude Code without sandboxing.

66 The native Claude Code installer is currently in beta.595 

67</Note>596### Permission errors during installation

68 597 

69Use the following command to run the native installer.598If the native installer fails with permission errors, the target directory may not be writable. See [Check directory permissions](#check-directory-permissions).

70 599 

71**macOS, Linux, WSL:**600If you previously installed with npm and are hitting npm-specific permission errors, switch to the native installer:

72 601 

73```bash theme={null}602```bash theme={null}

74# Install stable version (default)

75curl -fsSL https://claude.ai/install.sh | bash603curl -fsSL https://claude.ai/install.sh | bash

604```

605 

606## Permissions and authentication

76 607 

77# Install latest version608These sections address login failures, token issues, and permission prompt behavior.

78curl -fsSL https://claude.ai/install.sh | bash -s latest

79 609 

80# Install specific version number610### Repeated permission prompts

81curl -fsSL https://claude.ai/install.sh | bash -s 1.0.58

82```

83 611 

84**Windows PowerShell:**612If you find yourself repeatedly approving the same commands, you can allow specific tools

613to run without approval using the `/permissions` command. See [Permissions docs](/en/permissions#manage-permissions).

85 614 

86```powershell theme={null}615### Authentication issues

87# Install stable version (default)

88irm https://claude.ai/install.ps1 | iex

89 616 

90# Install latest version617If you're experiencing authentication problems:

91& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) latest

92 618 

93# Install specific version number6191. Run `/logout` to sign out completely

94& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 1.0.586202. Close Claude Code

6213. Restart with `claude` and complete the authentication process again

95 622 

96```623If the browser doesn't open automatically during login, press `c` to copy the OAuth URL to your clipboard, then paste it into your browser manually.

97 624 

98This command installs the appropriate build of Claude Code for your operating system and architecture and adds a symlink to the installation at `~/.local/bin/claude`.625### OAuth error: Invalid code

99 626 

100<Tip>627If you see `OAuth error: Invalid code. Please make sure the full code was copied`, the login code expired or was truncated during copy-paste.

101 Make sure that you have the installation directory in your system PATH.

102</Tip>

103 628 

104#### Alternative solution: Migrate to local installation629**Solutions:**

105 630 

106Alternatively, if Claude Code will run, you can migrate to a local installation:631* Press Enter to retry and complete the login quickly after the browser opens

632* Type `c` to copy the full URL if the browser doesn't open automatically

633* If using a remote/SSH session, the browser may open on the wrong machine. Copy the URL displayed in the terminal and open it in your local browser instead.

107 634 

108```bash theme={null}635### 403 Forbidden after login

109claude migrate-installer

110```

111 636 

112This moves Claude Code to `~/.claude/local/` and sets up an alias in your shell configuration. No `sudo` is required for future updates.637If you see `API Error: 403 {"error":{"type":"forbidden","message":"Request not allowed"}}` after logging in:

113 638 

114After migration, restart your shell, and then verify your installation:639* **Claude Pro/Max users**: verify your subscription is active at [claude.ai/settings](https://claude.ai/settings)

640* **Console users**: confirm your account has the "Claude Code" or "Developer" role assigned by your admin

641* **Behind a proxy**: corporate proxies can interfere with API requests. See [network configuration](/en/network-config) for proxy setup.

115 642 

116On macOS/Linux/WSL:643### OAuth login fails in WSL2

644 

645Browser-based login in WSL2 may fail if WSL can't open your Windows browser. Set the `BROWSER` environment variable:

117 646 

118```bash theme={null}647```bash theme={null}

119which claude # Should show an alias to ~/.claude/local/claude648export BROWSER="/mnt/c/Program Files/Google/Chrome/Application/chrome.exe"

649claude

120```650```

121 651 

122On Windows:652Or copy the URL manually: when the login prompt appears, press `c` to copy the OAuth URL, then paste it into your Windows browser.

123 653 

124```powershell theme={null}654### "Not logged in" or token expired

125where claude # Should show path to claude executable

126```

127 655 

128Verify installation:656If Claude Code prompts you to log in again after a session, your OAuth token may have expired.

129 657 

130```bash theme={null}658Run `/login` to re-authenticate. If this happens frequently, check that your system clock is accurate, as token validation depends on correct timestamps.

131claude doctor # Check installation health

132```

133 659 

134## Permissions and authentication660## Configuration file locations

135 661 

136### Repeated permission prompts662Claude Code stores configuration in several locations:

137 663 

138If you find yourself repeatedly approving the same commands, you can allow specific tools664| File | Purpose |

139to run without approval using the `/permissions` command. See [Permissions docs](/en/docs/claude-code/iam#configuring-permissions).665| :---------------------------- | :----------------------------------------------------------------------------------------------------- |

666| `~/.claude/settings.json` | User settings (permissions, hooks, model overrides) |

667| `.claude/settings.json` | Project settings (checked into source control) |

668| `.claude/settings.local.json` | Local project settings (not committed) |

669| `~/.claude.json` | Global state (theme, OAuth, MCP servers) |

670| `.mcp.json` | Project MCP servers (checked into source control) |

671| `managed-mcp.json` | [Managed MCP servers](/en/mcp#managed-mcp-configuration) |

672| Managed settings | [Managed settings](/en/settings#settings-files) (server-managed, MDM/OS-level policies, or file-based) |

140 673 

141### Authentication issues674On Windows, `~` refers to your user home directory, such as `C:\Users\YourName`.

142 675 

143If you're experiencing authentication problems:676For details on configuring these files, see [Settings](/en/settings) and [MCP](/en/mcp).

144 677 

1451. Run `/logout` to sign out completely678### Resetting configuration

1462. Close Claude Code

1473. Restart with `claude` and complete the authentication process again

148 679 

149If problems persist, try:680To reset Claude Code to default settings, you can remove the configuration files:

150 681 

151```bash theme={null}682```bash theme={null}

152rm -rf ~/.config/claude-code/auth.json683# Reset all user settings and state

153claude684rm ~/.claude.json

685rm -rf ~/.claude/

686 

687# Reset project-specific settings

688rm -rf .claude/

689rm .mcp.json

154```690```

155 691 

156This removes your stored authentication information and forces a clean login.692<Warning>

693 This will remove all your settings, MCP server configurations, and session history.

694</Warning>

157 695 

158## Performance and stability696## Performance and stability

159 697 

698These sections cover issues related to resource usage, responsiveness, and search behavior.

699 

160### High CPU or memory usage700### High CPU or memory usage

161 701 

162Claude Code is designed to work with most development environments, but may consume significant resources when processing large codebases. If you're experiencing performance issues:702Claude Code is designed to work with most development environments, but may consume significant resources when processing large codebases. If you're experiencing performance issues:


174 714 

175### Search and discovery issues715### Search and discovery issues

176 716 

177If Search tool, `@file` mentions, custom agents, and custom slash commands aren't working, install system `ripgrep`:717If Search tool, `@file` mentions, custom agents, and custom skills aren't working, install system `ripgrep`:

178 718 

179```bash theme={null}719```bash theme={null}

180# macOS (Homebrew) 720# macOS (Homebrew)


193pacman -S ripgrep733pacman -S ripgrep

194```734```

195 735 

196Then set `USE_BUILTIN_RIPGREP=0` in your [environment](/en/docs/claude-code/settings#environment-variables).736Then set `USE_BUILTIN_RIPGREP=0` in your [environment](/en/settings#environment-variables).

197 737 

198### Slow or incomplete search results on WSL738### Slow or incomplete search results on WSL

199 739 

200Disk read performance penalties when [working across file systems on WSL](https://learn.microsoft.com/en-us/windows/wsl/filesystems) may result in fewer-than-expected matches (but not a complete lack of search functionality) when using Claude Code on WSL.740Disk read performance penalties when [working across file systems on WSL](https://learn.microsoft.com/en-us/windows/wsl/filesystems) may result in fewer-than-expected matches when using Claude Code on WSL. Search still functions, but returns fewer results than on a native filesystem.

201 741 

202<Note>742<Note>

203 `/doctor` will show Search as OK in this case.743 `/doctor` will show Search as OK in this case.


205 745 

206**Solutions:**746**Solutions:**

207 747 

2081. **Submit more specific searches**: Reduce the number of files searched by specifying directories or file types: "Search for JWT validation logic in the auth-service package" or "Find use of md5 hash in JS files".7481. **Submit more specific searches**: reduce the number of files searched by specifying directories or file types: "Search for JWT validation logic in the auth-service package" or "Find use of md5 hash in JS files".

209 749 

2102. **Move project to Linux filesystem**: If possible, ensure your project is located on the Linux filesystem (`/home/`) rather than the Windows filesystem (`/mnt/c/`).7502. **Move project to Linux filesystem**: if possible, ensure your project is located on the Linux filesystem (`/home/`) rather than the Windows filesystem (`/mnt/c/`).

211 751 

2123. **Use native Windows instead**: Consider running Claude Code natively on Windows instead of through WSL, for better file system performance.7523. **Use native Windows instead**: consider running Claude Code natively on Windows instead of through WSL, for better file system performance.

213 753 

214## IDE integration issues754## IDE integration issues

215 755 

756If Claude Code does not connect to your IDE or behaves unexpectedly within an IDE terminal, try the solutions below.

757 

216### JetBrains IDE not detected on WSL2758### JetBrains IDE not detected on WSL2

217 759 

218If you're using Claude Code on WSL2 with JetBrains IDEs and getting "No available IDEs detected" errors, this is likely due to WSL2's networking configuration or Windows Firewall blocking the connection.760If you're using Claude Code on WSL2 with JetBrains IDEs and getting "No available IDEs detected" errors, this is likely due to WSL2's networking configuration or Windows Firewall blocking the connection.


2261. Find your WSL2 IP address:7681. Find your WSL2 IP address:

227 ```bash theme={null}769 ```bash theme={null}

228 wsl hostname -I770 wsl hostname -I

229 # Example output: 172.21.123.456771 # Example output: 172.21.123.45

230 ```772 ```

231 773 

2322. Open PowerShell as Administrator and create a firewall rule:7742. Open PowerShell as Administrator and create a firewall rule:

233 ```powershell theme={null}775 ```powershell theme={null}

234 New-NetFirewallRule -DisplayName "Allow WSL2 Internal Traffic" -Direction Inbound -Protocol TCP -Action Allow -RemoteAddress 172.21.0.0/16 -LocalAddress 172.21.0.0/16776 New-NetFirewallRule -DisplayName "Allow WSL2 Internal Traffic" -Direction Inbound -Protocol TCP -Action Allow -RemoteAddress 172.21.0.0/16 -LocalAddress 172.21.0.0/16

235 ```777 ```

236 (Adjust the IP range based on your WSL2 subnet from step 1)778 Adjust the IP range based on your WSL2 subnet from step 1.

237 779 

2383. Restart both your IDE and Claude Code7803. Restart both your IDE and Claude Code

239 781 


252 These networking issues only affect WSL2. WSL1 uses the host's network directly and doesn't require these configurations.794 These networking issues only affect WSL2. WSL1 uses the host's network directly and doesn't require these configurations.

253</Note>795</Note>

254 796 

255For additional JetBrains configuration tips, see our [IDE integration guide](/en/docs/claude-code/ide-integrations#jetbrains-plugin-settings).797For additional JetBrains configuration tips, see the [JetBrains IDE guide](/en/jetbrains#plugin-settings).

798 

799### Report Windows IDE integration issues

256 800 

257### Reporting Windows IDE integration issues (both native and WSL)801If you're experiencing IDE integration problems on Windows, [create an issue](https://github.com/anthropics/claude-code/issues) with the following information:

258 802 

259If you're experiencing IDE integration problems on Windows, please [create an issue](https://github.com/anthropics/claude-code/issues) with the following information: whether you are native (git bash), or WSL1/WSL2, WSL networking mode (NAT or mirrored), IDE name/version, Claude Code extension/plugin version, and shell type (bash/zsh/etc)803* Environment type: native Windows (Git Bash) or WSL1/WSL2

804* WSL networking mode, if applicable: NAT or mirrored

805* IDE name and version

806* Claude Code extension/plugin version

807* Shell type: Bash, Zsh, PowerShell, etc.

260 808 

261### ESC key not working in JetBrains (IntelliJ, PyCharm, etc.) terminals809### Escape key not working in JetBrains IDE terminals

262 810 

263If you're using Claude Code in JetBrains terminals and the ESC key doesn't interrupt the agent as expected, this is likely due to a keybinding clash with JetBrains' default shortcuts.811If you're using Claude Code in JetBrains terminals and the `Esc` key doesn't interrupt the agent as expected, this is likely due to a keybinding clash with JetBrains' default shortcuts.

264 812 

265To fix this issue:813To fix this issue:

266 814 


270 * Click "Configure terminal keybindings" and delete the "Switch focus to Editor" shortcut818 * Click "Configure terminal keybindings" and delete the "Switch focus to Editor" shortcut

2713. Apply the changes8193. Apply the changes

272 820 

273This allows the ESC key to properly interrupt Claude Code operations.821This allows the `Esc` key to properly interrupt Claude Code operations.

274 822 

275## Markdown formatting issues823## Markdown formatting issues

276 824 


300 848 

301**Solutions:**849**Solutions:**

302 850 

3031. **Ask Claude to add language tags**: Simply request "Please add appropriate language tags to all code blocks in this markdown file."8511. **Ask Claude to add language tags**: request "Add appropriate language tags to all code blocks in this markdown file."

304 852 

3052. **Use post-processing hooks**: Set up automatic formatting hooks to detect and add missing language tags. See the [markdown formatting hook example](/en/docs/claude-code/hooks-guide#markdown-formatting-hook) for implementation details.8532. **Use post-processing hooks**: set up automatic formatting hooks to detect and add missing language tags. See [Auto-format code after edits](/en/hooks-guide#auto-format-code-after-edits) for an example of a PostToolUse formatting hook.

306 854 

3073. **Manual verification**: After generating markdown files, review them for proper code block formatting and request corrections if needed.8553. **Manual verification**: after generating markdown files, review them for proper code block formatting and request corrections if needed.

308 856 

309### Inconsistent spacing and formatting857### Inconsistent spacing and formatting

310 858 


312 860 

313**Solutions:**861**Solutions:**

314 862 

3151. **Request formatting corrections**: Ask Claude to "Fix spacing and formatting issues in this markdown file."8631. **Request formatting corrections**: ask Claude to "Fix spacing and formatting issues in this markdown file."

316 864 

3172. **Use formatting tools**: Set up hooks to run markdown formatters like `prettier` or custom formatting scripts on generated markdown files.8652. **Use formatting tools**: set up hooks to run markdown formatters like `prettier` or custom formatting scripts on generated markdown files.

318 866 

3193. **Specify formatting preferences**: Include formatting requirements in your prompts or project [memory](/en/docs/claude-code/memory) files.8673. **Specify formatting preferences**: include formatting requirements in your prompts or project [memory](/en/memory) files.

320 868 

321### Best practices for markdown generation869### Reduce markdown formatting issues

322 870 

323To minimize formatting issues:871To minimize formatting issues:

324 872 

325* **Be explicit in requests**: Ask for "properly formatted markdown with language-tagged code blocks"873* **Be explicit in requests**: ask for "properly formatted markdown with language-tagged code blocks"

326* **Use project conventions**: Document your preferred markdown style in [CLAUDE.md](/en/docs/claude-code/memory)874* **Use project conventions**: document your preferred markdown style in [`CLAUDE.md`](/en/memory)

327* **Set up validation hooks**: Use post-processing hooks to automatically verify and fix common formatting issues875* **Set up validation hooks**: use post-processing hooks to automatically verify and fix common formatting issues

328 876 

329## Getting more help877## Get more help

330 878 

331If you're experiencing issues not covered here:879If you're experiencing issues not covered here:

332 880 

3331. Use the `/bug` command within Claude Code to report problems directly to Anthropic8811. Use the `/bug` command within Claude Code to report problems directly to Anthropic

3342. Check the [GitHub repository](https://github.com/anthropics/claude-code) for known issues8822. Check the [GitHub repository](https://github.com/anthropics/claude-code) for known issues

3353. Run `/doctor` to check the health of your Claude Code installation8833. Run `/doctor` to diagnose issues. It checks:

884 * Installation type, version, and search functionality

885 * Auto-update status and available versions

886 * Invalid settings files (malformed JSON, incorrect types)

887 * MCP server configuration errors

888 * Keybinding configuration problems

889 * Context usage warnings (large CLAUDE.md files, high MCP token usage, unreachable permission rules)

890 * Plugin and agent loading errors

3364. Ask Claude directly about its capabilities and features - Claude has built-in access to its documentation8914. Ask Claude directly about its capabilities and features - Claude has built-in access to its documentation

vs-code.md +384 −82

Details

1# Visual Studio Code1> ## Documentation Index

2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

3> Use this file to discover all available pages before exploring further.

2 4 

3> Use Claude Code with Visual Studio Code through our native extension or CLI integration5# Use Claude Code in VS Code

4 6 

5<img src="https://mintcdn.com/anthropic-claude-docs/Xfpgr-ckk38MZnw3/images/vs-code-extension-interface.jpg?fit=max&auto=format&n=Xfpgr-ckk38MZnw3&q=85&s=600835067c8b03557a0529978e3f0261" alt="Claude Code VS Code Extension Interface" data-og-width="2500" width="2500" data-og-height="1155" height="1155" data-path="images/vs-code-extension-interface.jpg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/anthropic-claude-docs/Xfpgr-ckk38MZnw3/images/vs-code-extension-interface.jpg?w=280&fit=max&auto=format&n=Xfpgr-ckk38MZnw3&q=85&s=c11a25932f84ca58124a368156b476d2 280w, https://mintcdn.com/anthropic-claude-docs/Xfpgr-ckk38MZnw3/images/vs-code-extension-interface.jpg?w=560&fit=max&auto=format&n=Xfpgr-ckk38MZnw3&q=85&s=3642697ed4d8a6c02396c403bf7aae44 560w, https://mintcdn.com/anthropic-claude-docs/Xfpgr-ckk38MZnw3/images/vs-code-extension-interface.jpg?w=840&fit=max&auto=format&n=Xfpgr-ckk38MZnw3&q=85&s=fb3cb16e752060fbeb0f5e8ba775798b 840w, https://mintcdn.com/anthropic-claude-docs/Xfpgr-ckk38MZnw3/images/vs-code-extension-interface.jpg?w=1100&fit=max&auto=format&n=Xfpgr-ckk38MZnw3&q=85&s=1c6073edc8fcfcbc8e237cbf5f25cdc6 1100w, https://mintcdn.com/anthropic-claude-docs/Xfpgr-ckk38MZnw3/images/vs-code-extension-interface.jpg?w=1650&fit=max&auto=format&n=Xfpgr-ckk38MZnw3&q=85&s=152628678fe3301018b79e932706c430 1650w, https://mintcdn.com/anthropic-claude-docs/Xfpgr-ckk38MZnw3/images/vs-code-extension-interface.jpg?w=2500&fit=max&auto=format&n=Xfpgr-ckk38MZnw3&q=85&s=7ac83b2db00366c9a745380571a748ab 2500w" />7> Install and configure the Claude Code extension for VS Code. Get AI coding assistance with inline diffs, @-mentions, plan review, and keyboard shortcuts.

6 8 

7## VS Code Extension (Beta)9<img src="https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=300652d5678c63905e6b0ea9e50835f8" alt="VS Code editor with the Claude Code extension panel open on the right side, showing a conversation with Claude" data-og-width="2500" width="2500" data-og-height="1155" height="1155" data-path="images/vs-code-extension-interface.jpg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?w=280&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=87630c671517a3d52e9aee627041696e 280w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?w=560&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=716b093879204beec8d952649ef75292 560w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?w=840&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=c1525d1a01513acd9d83d8b5a8fe2fc8 840w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?w=1100&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=1d90021d58bbb51f871efec13af955c3 1100w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?w=1650&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=7babdd25440099886f193cfa99af88ae 1650w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?w=2500&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=08c92eedfb56fe61a61e480fb63784b6 2500w" />

8 10 

9The VS Code extension, available in beta, lets you see Claude's changes in real-time through a native graphical interface integrated directly into your IDE. The VS Code extension makes it easier to access and interact with Claude Code for users who prefer a visual interface over the terminal.11The VS Code extension provides a native graphical interface for Claude Code, integrated directly into your IDE. This is the recommended way to use Claude Code in VS Code.

10 12 

11### Features13With the extension, you can review and edit Claude's plans before accepting them, auto-accept edits as they're made, @-mention files with specific line ranges from your selection, access conversation history, and open multiple conversations in separate tabs or windows.

12 14 

13The VS Code extension provides:15## Prerequisites

14 16 

15* **Native IDE experience**: Dedicated Claude Code sidebar panel accessed via the Spark icon17* VS Code 1.98.0 or higher

16* **Plan mode with editing**: Review and edit Claude's plans before accepting them18* An Anthropic account (you'll sign in when you first open the extension). If you're using a third-party provider like Amazon Bedrock or Google Vertex AI, see [Use third-party providers](#use-third-party-providers) instead.

17* **Auto-accept edits mode**: Automatically apply Claude's changes as they're made

18* **File management**: @-mention files or attach files and images using the system file picker

19* **MCP server usage**: Use Model Context Protocol servers configured through the CLI

20* **Conversation history**: Easy access to past conversations

21* **Multiple sessions**: Run multiple Claude Code sessions simultaneously

22* **Keyboard shortcuts**: Support for most shortcuts from the CLI

23* **Slash commands**: Access most CLI slash commands directly in the extension

24 19 

25### Requirements20<Tip>

21 The extension includes the CLI (command-line interface), which you can access from VS Code's integrated terminal for advanced features. See [VS Code extension vs. Claude Code CLI](#vs-code-extension-vs-claude-code-cli) for details.

22</Tip>

26 23 

27* VS Code 1.98.0 or higher24## Install the extension

25 

26Click the link for your IDE to install directly:

27 

28* [Install for VS Code](vscode:extension/anthropic.claude-code)

29* [Install for Cursor](cursor:extension/anthropic.claude-code)

28 30 

29### Installation31Or in VS Code, press `Cmd+Shift+X` (Mac) or `Ctrl+Shift+X` (Windows/Linux) to open the Extensions view, search for "Claude Code", and click **Install**.

30 32 

31Download and install the extension from the [Visual Studio Code Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code).33<Note>If the extension doesn't appear after installation, restart VS Code or run "Developer: Reload Window" from the Command Palette.</Note>

32 34 

33### How It Works35## Get started

34 36 

35Once installed, you can start using Claude Code through the VS Code interface:37Once installed, you can start using Claude Code through the VS Code interface:

36 38 

371. Click the Spark icon in your editor's sidebar to open the Claude Code panel39<Steps>

382. Prompt Claude Code in the same way you would in the terminal40 <Step title="Open the Claude Code panel">

393. Watch as Claude analyzes your code and suggests changes41 Throughout VS Code, the Spark icon indicates Claude Code: <img src="https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-spark-icon.svg?fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=a734d84e785140016672f08e0abb236c" alt="Spark icon" style={{display: "inline", height: "0.85em", verticalAlign: "middle"}} data-og-width="16" width="16" data-og-height="16" height="16" data-path="images/vs-code-spark-icon.svg" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-spark-icon.svg?w=280&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=9a45aad9a84b9fa1701ac99a1f9aa4e9 280w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-spark-icon.svg?w=560&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=3f4cb9254c4d4e93989c4b6bf9292f4b 560w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-spark-icon.svg?w=840&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=e75ccc9faa3e572db8f291ceb65bb264 840w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-spark-icon.svg?w=1100&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=f147bd81a381a62539a4ce361fac41c7 1100w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-spark-icon.svg?w=1650&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=78fe68efaee5d6e844bbacab1b442ed5 1650w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-spark-icon.svg?w=2500&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=efb8dbe1dfa722d094edc6ad2ad4bedb 2500w" />

404. Review and accept edits directly in the interface42 

41 * **Tip**: Drag the sidebar wider to see inline diffs, then click on them to expand for full details43 The quickest way to open Claude is to click the Spark icon in the **Editor Toolbar** (top-right corner of the editor). The icon only appears when you have a file open.

44 

45 <img src="https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-editor-icon.png?fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=eb4540325d94664c51776dbbfec4cf02" alt="VS Code editor showing the Spark icon in the Editor Toolbar" data-og-width="2796" width="2796" data-og-height="734" height="734" data-path="images/vs-code-editor-icon.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-editor-icon.png?w=280&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=56f218d5464359d6480cfe23f70a923e 280w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-editor-icon.png?w=560&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=344a8db024b196c795a80dc85cacb8d1 560w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-editor-icon.png?w=840&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=f30bf834ee0625b2a4a635d552d87163 840w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-editor-icon.png?w=1100&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=81fdf984840e43a9f08ae42729d1484d 1100w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-editor-icon.png?w=1650&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=8b60fb32de54717093d512afaa99785c 1650w, https://mintcdn.com/claude-code/mfM-EyoZGnQv8JTc/images/vs-code-editor-icon.png?w=2500&fit=max&auto=format&n=mfM-EyoZGnQv8JTc&q=85&s=893e6bda8f2e9d42c8a294d394f0b736 2500w" />

46 

47 Other ways to open Claude Code:

48 

49 * **Command Palette**: `Cmd+Shift+P` (Mac) or `Ctrl+Shift+P` (Windows/Linux), type "Claude Code", and select an option like "Open in New Tab"

50 * **Status Bar**: Click **✱ Claude Code** in the bottom-right corner of the window. This works even when no file is open.

51 

52 When you first open the panel, a **Learn Claude Code** checklist appears. Work through each item by clicking **Show me**, or dismiss it with the X. To reopen it later, uncheck **Hide Onboarding** in VS Code settings under Extensions → Claude Code.

53 

54 You can drag the Claude panel to reposition it anywhere in VS Code. See [Customize your workflow](#customize-your-workflow) for details.

55 </Step>

56 

57 <Step title="Send a prompt">

58 Ask Claude to help with your code or files, whether that's explaining how something works, debugging an issue, or making changes.

59 

60 <Tip>Claude automatically sees your selected text. Press `Option+K` (Mac) / `Alt+K` (Windows/Linux) to also insert an @-mention reference (like `@file.ts#5-10`) into your prompt.</Tip>

61 

62 Here's an example of asking about a particular line in a file:

63 

64 <img src="https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-send-prompt.png?fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=ede3ed8d8d5f940e01c5de636d009cfd" alt="VS Code editor with lines 2-3 selected in a Python file, and the Claude Code panel showing a question about those lines with an @-mention reference" data-og-width="3288" width="3288" data-og-height="1876" height="1876" data-path="images/vs-code-send-prompt.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-send-prompt.png?w=280&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=f40bde7b2c245fe8f0f5b784e8106492 280w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-send-prompt.png?w=560&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=fad66a27a9a6faa23b05370aa4f398b2 560w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-send-prompt.png?w=840&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=4539c8a3823ca80a5c8771f6c088ce9e 840w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-send-prompt.png?w=1100&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=fae8ebf300c7853409a562ffa46d9c71 1100w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-send-prompt.png?w=1650&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=22e4462bb8cf0c0ca20f8102bc4c971a 1650w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-send-prompt.png?w=2500&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=739bfd045f70fe7be1a109a53494590e 2500w" />

65 </Step>

66 

67 <Step title="Review changes">

68 When Claude wants to edit a file, it shows a side-by-side comparison of the original and proposed changes, then asks for permission. You can accept, reject, or tell Claude what to do instead.

69 

70 <img src="https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-edits.png?fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=e005f9b41c541c5c7c59c082f7c4841c" alt="VS Code showing a diff of Claude's proposed changes with a permission prompt asking whether to make the edit" data-og-width="3292" width="3292" data-og-height="1876" height="1876" data-path="images/vs-code-edits.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-edits.png?w=280&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=cb5d41b81087f79b842a56b5a3304660 280w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-edits.png?w=560&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=90bb691960decdc06393c3c21cd62c75 560w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-edits.png?w=840&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=9a11bf878ba619e850380904ff4f38e8 840w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-edits.png?w=1100&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=6dddbf596b4f69ec6245bdc5eb6dd487 1100w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-edits.png?w=1650&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=ef2713b8cbfd2cee97af817d813d64c7 1650w, https://mintcdn.com/claude-code/FVYz38sRY-VuoGHA/images/vs-code-edits.png?w=2500&fit=max&auto=format&n=FVYz38sRY-VuoGHA&q=85&s=1f7e1c52919cdfddf295f32a2ec7ae59 2500w" />

71 </Step>

72</Steps>

73 

74For more ideas on what you can do with Claude Code, see [Common workflows](/en/common-workflows).

75 

76<Tip>

77 Run "Claude Code: Open Walkthrough" from the Command Palette for a guided tour of the basics.

78</Tip>

79 

80## Use the prompt box

81 

82The prompt box supports several features:

83 

84* **Permission modes**: Click the mode indicator at the bottom of the prompt box to switch modes. In normal mode, Claude asks permission before each action. In Plan mode, Claude describes what it will do and waits for approval before making changes. In auto-accept mode, Claude makes edits without asking. Set the default in VS Code settings under `claudeCode.initialPermissionMode`.

85* **Command menu**: Click `/` or type `/` to open the command menu. Options include attaching files, switching models, toggling extended thinking, and viewing plan usage (`/usage`). The Customize section provides access to MCP servers, hooks, memory, permissions, and plugins. Items with a terminal icon open in the integrated terminal.

86* **Context indicator**: The prompt box shows how much of Claude's context window you're using. Claude automatically compacts when needed, or you can run `/compact` manually.

87* **Extended thinking**: Lets Claude spend more time reasoning through complex problems. Toggle it on via the command menu (`/`). See [Extended thinking](/en/common-workflows#use-extended-thinking-thinking-mode) for details.

88* **Multi-line input**: Press `Shift+Enter` to add a new line without sending. This also works in the "Other" free-text input of question dialogs.

89 

90### Reference files and folders

91 

92Use @-mentions to give Claude context about specific files or folders. When you type `@` followed by a file or folder name, Claude reads that content and can answer questions about it or make changes to it. Claude Code supports fuzzy matching, so you can type partial names to find what you need:

93 

94```

95> Explain the logic in @auth (fuzzy matches auth.js, AuthService.ts, etc.)

96> What's in @src/components/ (include a trailing slash for folders)

97```

98 

99For large PDFs, you can ask Claude to read specific pages instead of the whole file: a single page, a range like pages 1-10, or an open-ended range like page 3 onward.

100 

101When you select text in the editor, Claude can see your highlighted code automatically. The prompt box footer shows how many lines are selected. Press `Option+K` (Mac) / `Alt+K` (Windows/Linux) to insert an @-mention with the file path and line numbers (e.g., `@app.ts#5-10`). Click the selection indicator to toggle whether Claude can see your highlighted text - the eye-slash icon means the selection is hidden from Claude.

102 

103You can also hold `Shift` while dragging files into the prompt box to add them as attachments. Click the X on any attachment to remove it from context.

104 

105### Resume past conversations

106 

107Click the dropdown at the top of the Claude Code panel to access your conversation history. You can search by keyword or browse by time (Today, Yesterday, Last 7 days, etc.). Click any conversation to resume it with the full message history. For more on resuming sessions, see [Common workflows](/en/common-workflows#resume-previous-conversations).

108 

109### Resume remote sessions from Claude.ai

110 

111If you use [Claude Code on the web](/en/claude-code-on-the-web), you can resume those remote sessions directly in VS Code. This requires signing in with **Claude.ai Subscription**, not Anthropic Console.

112 

113<Steps>

114 <Step title="Open Past Conversations">

115 Click the **Past Conversations** dropdown at the top of the Claude Code panel.

116 </Step>

117 

118 <Step title="Select the Remote tab">

119 The dialog shows two tabs: Local and Remote. Click **Remote** to see sessions from claude.ai.

120 </Step>

121 

122 <Step title="Select a session to resume">

123 Browse or search your remote sessions. Click any session to download it and continue the conversation locally.

124 </Step>

125</Steps>

126 

127<Note>

128 Only web sessions started with a GitHub repository appear in the Remote tab. Resuming loads the conversation history locally; changes are not synced back to claude.ai.

129</Note>

130 

131## Customize your workflow

132 

133Once you're up and running, you can reposition the Claude panel, run multiple sessions, or switch to terminal mode.

134 

135### Choose where Claude lives

136 

137You can drag the Claude panel to reposition it anywhere in VS Code. Grab the panel's tab or title bar and drag it to:

138 

139* **Secondary sidebar**: The right side of the window. Keeps Claude visible while you code.

140* **Primary sidebar**: The left sidebar with icons for Explorer, Search, etc.

141* **Editor area**: Opens Claude as a tab alongside your files. Useful for side tasks.

142 

143<Tip>

144 Use the sidebar for your main Claude session and open additional tabs for side tasks. Claude remembers your preferred location. Note that the Spark icon only appears in the Activity Bar when the Claude panel is docked to the left. Since Claude defaults to the right side, use the Editor Toolbar icon to open Claude.

145</Tip>

146 

147### Run multiple conversations

148 

149Use **Open in New Tab** or **Open in New Window** from the Command Palette to start additional conversations. Each conversation maintains its own history and context, allowing you to work on different tasks in parallel.

150 

151When using tabs, a small colored dot on the spark icon indicates status: blue means a permission request is pending, orange means Claude finished while the tab was hidden.

152 

153### Switch to terminal mode

154 

155By default, the extension opens a graphical chat panel. If you prefer the CLI-style interface, open the [Use Terminal setting](vscode://settings/claudeCode.useTerminal) and check the box.

156 

157You can also open VS Code settings (`Cmd+,` on Mac or `Ctrl+,` on Windows/Linux), go to Extensions → Claude Code, and check **Use Terminal**.

158 

159## Manage plugins

160 

161The VS Code extension includes a graphical interface for installing and managing [plugins](/en/plugins). Type `/plugins` in the prompt box to open the **Manage plugins** interface.

162 

163### Install plugins

164 

165The plugin dialog shows two tabs: **Plugins** and **Marketplaces**.

166 

167In the Plugins tab:

168 

169* **Installed plugins** appear at the top with toggle switches to enable or disable them

170* **Available plugins** from your configured marketplaces appear below

171* Search to filter plugins by name or description

172* Click **Install** on any available plugin

173 

174When you install a plugin, choose the installation scope:

175 

176* **Install for you**: Available in all your projects (user scope)

177* **Install for this project**: Shared with project collaborators (project scope)

178* **Install locally**: Only for you, only in this repository (local scope)

179 

180### Manage marketplaces

181 

182Switch to the **Marketplaces** tab to add or remove plugin sources:

183 

184* Enter a GitHub repo, URL, or local path to add a new marketplace

185* Click the refresh icon to update a marketplace's plugin list

186* Click the trash icon to remove a marketplace

42 187 

43### Using Third-Party Providers (Vertex and Bedrock)188After making changes, a banner prompts you to restart Claude Code to apply the updates.

44 189 

45The VS Code extension supports using Claude Code with third-party providers like Amazon Bedrock and Google Vertex AI. When configured with these providers, the extension will not prompt for login. To use third-party providers, configure environment variables in the VS Code extension settings:190<Note>

191 Plugin management in VS Code uses the same CLI commands under the hood. Plugins and marketplaces you configure in the extension are also available in the CLI, and vice versa.

192</Note>

46 193 

471. Open VS Code settings194For more about the plugin system, see [Plugins](/en/plugins) and [Plugin marketplaces](/en/plugin-marketplaces).

482. Search for "Claude Code: Environment Variables"

493. Add the required environment variables

50 195 

51#### Environment Variables196## Automate browser tasks with Chrome

52 197 

53| Variable | Description | Required | Example |198Connect Claude to your Chrome browser to test web apps, debug with console logs, and automate browser workflows without leaving VS Code. This requires the [Claude in Chrome extension](https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn) version 1.0.36 or higher.

54| :---------------------------- | :------------------------------------- | :--------------------- | :----------------------------------------------- |

55| `CLAUDE_CODE_USE_BEDROCK` | Enable Amazon Bedrock integration | Required for Bedrock | `"1"` or `"true"` |

56| `CLAUDE_CODE_USE_VERTEX` | Enable Google Vertex AI integration | Required for Vertex AI | `"1"` or `"true"` |

57| `ANTHROPIC_API_KEY` | API key for third-party access | Required | `"your-api-key"` |

58| `AWS_REGION` | AWS region for Bedrock | | `"us-east-2"` |

59| `AWS_PROFILE` | AWS profile for Bedrock authentication | | `"your-profile"` |

60| `CLOUD_ML_REGION` | Region for Vertex AI | | `"global"` or `"us-east5"` |

61| `ANTHROPIC_VERTEX_PROJECT_ID` | GCP project ID for Vertex AI | | `"your-project-id"` |

62| `ANTHROPIC_MODEL` | Override primary model | Override model ID | `"us.anthropic.claude-sonnet-4-5-20250929-v1:0"` |

63| `ANTHROPIC_SMALL_FAST_MODEL` | Override small/fast model | Optional | `"us.anthropic.claude-3-5-haiku-20241022-v1:0"` |

64| `CLAUDE_CODE_SKIP_AUTH_LOGIN` | Disable all prompts to login | Optional | `"1"` or `"true"` |

65 199 

66For detailed setup instructions and additional configuration options, see:200Type `@browser` in the prompt box followed by what you want Claude to do:

67 201 

68* [Claude Code on Amazon Bedrock](/en/docs/claude-code/amazon-bedrock)202```text theme={null}

69* [Claude Code on Google Vertex AI](/en/docs/claude-code/google-vertex-ai)203@browser go to localhost:3000 and check the console for errors

204```

70 205 

71### Not Yet Implemented206You can also open the attachment menu to select specific browser tools like opening a new tab or reading page content.

72 207 

73The following features are not yet available in the VS Code extension:208Claude opens new tabs for browser tasks and shares your browser's login state, so it can access any site you're already signed into.

74 209 

75* **Full MCP server configuration**: You need to [configure MCP servers through the CLI](/en/docs/claude-code/mcp) first, then the extension will use them210For setup instructions, the full list of capabilities, and troubleshooting, see [Use Claude Code with Chrome](/en/chrome).

76* **Subagents configuration**: Configure [subagents through the CLI](/en/docs/claude-code/sub-agents) to use them in VS Code

77* **Checkpoints**: Save and restore conversation state at specific points

78* **Advanced shortcuts**:

79 * `#` shortcut to add to memory

80 * `!` shortcut to run bash commands directly

81* **Tab completion**: File path completion with tab key

82 211 

83We are working on adding these features in future updates.212## VS Code commands and shortcuts

84 213 

85## Security Considerations214Open the Command Palette (`Cmd+Shift+P` on Mac or `Ctrl+Shift+P` on Windows/Linux) and type "Claude Code" to see all available VS Code commands for the Claude Code extension.

86 215 

87When Claude Code runs in VS Code with auto-edit permissions enabled, it may be able to modify IDE configuration files that can be automatically executed by your IDE. This may increase the risk of running Claude Code in auto-edit mode and allow bypassing Claude Code's permission prompts for bash execution.216Some shortcuts depend on which panel is "focused" (receiving keyboard input). When your cursor is in a code file, the editor is focused. When your cursor is in Claude's prompt box, Claude is focused. Use `Cmd+Esc` / `Ctrl+Esc` to toggle between them.

88 217 

89When running in VS Code, consider:218<Note>

219 These are VS Code commands for controlling the extension. Not all built-in Claude Code commands are available in the extension. See [VS Code extension vs. Claude Code CLI](#vs-code-extension-vs-claude-code-cli) for details.

220</Note>

90 221 

91* Enabling [VS Code Restricted Mode](https://code.visualstudio.com/docs/editor/workspace-trust#_restricted-mode) for untrusted workspaces222| Command | Shortcut | Description |

92* Using manual approval mode for edits223| -------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------ |

93* Taking extra care to ensure Claude is only used with trusted prompts224| Focus Input | `Cmd+Esc` (Mac) / `Ctrl+Esc` (Windows/Linux) | Toggle focus between editor and Claude |

225| Open in Side Bar | - | Open Claude in the left sidebar |

226| Open in Terminal | - | Open Claude in terminal mode |

227| Open in New Tab | `Cmd+Shift+Esc` (Mac) / `Ctrl+Shift+Esc` (Windows/Linux) | Open a new conversation as an editor tab |

228| Open in New Window | - | Open a new conversation in a separate window |

229| New Conversation | `Cmd+N` (Mac) / `Ctrl+N` (Windows/Linux) | Start a new conversation (requires Claude to be focused) |

230| Insert @-Mention Reference | `Option+K` (Mac) / `Alt+K` (Windows/Linux) | Insert a reference to the current file and selection (requires editor to be focused) |

231| Show Logs | - | View extension debug logs |

232| Logout | - | Sign out of your Anthropic account |

94 233 

95## Legacy CLI Integration234## Configure settings

96 235 

97The first VS Code integration that we released allows Claude Code running in the terminal to interact with your IDE. It provides selection context sharing (current selection/tab is automatically shared with Claude Code), diff viewing in the IDE instead of terminal, file reference shortcuts (`Cmd+Option+K` on Mac or `Alt+Ctrl+K` on Windows/Linux to insert file references like @File#L1-99), and automatic diagnostic sharing (lint and syntax errors).236The extension has two types of settings:

98 237 

99The legacy integration auto-installs when you run `claude` from VS Code's integrated terminal. Simply run `claude` from the terminal and all features activate. For external terminals, use the `/ide` command to connect Claude Code to your VS Code instance. To configure, run `claude`, enter `/config`, and set the diff tool to `auto` for automatic IDE detection.238* **Extension settings** in VS Code: Control the extension's behavior within VS Code. Open with `Cmd+,` (Mac) or `Ctrl+,` (Windows/Linux), then go to Extensions Claude Code. You can also type `/` and select **General Config** to open settings.

239* **Claude Code settings** in `~/.claude/settings.json`: Shared between the extension and CLI. Use for allowed commands, environment variables, hooks, and MCP servers. See [Settings](/en/settings) for details.

100 240 

101Both the extension and CLI integration work with Visual Studio Code, Cursor, Windsurf, and VSCodium.241<Tip>

242 Add `"$schema": "https://json.schemastore.org/claude-code-settings.json"` to your `settings.json` to get autocomplete and inline validation for all available settings directly in VS Code.

243</Tip>

102 244 

103## Troubleshooting245### Extension settings

104 246 

105### Extension Not Installing247| Setting | Default | Description |

248| --------------------------------- | --------- | ----------------------------------------------------------------------------------------------------- |

249| `selectedModel` | `default` | Model for new conversations. Change per-session with `/model`. |

250| `useTerminal` | `false` | Launch Claude in terminal mode instead of graphical panel |

251| `initialPermissionMode` | `default` | Controls approval prompts: `default` (ask each time), `plan`, `acceptEdits`, or `bypassPermissions` |

252| `preferredLocation` | `panel` | Where Claude opens: `sidebar` (right) or `panel` (new tab) |

253| `autosave` | `true` | Auto-save files before Claude reads or writes them |

254| `useCtrlEnterToSend` | `false` | Use Ctrl/Cmd+Enter instead of Enter to send prompts |

255| `enableNewConversationShortcut` | `true` | Enable Cmd/Ctrl+N to start a new conversation |

256| `hideOnboarding` | `false` | Hide the onboarding checklist (graduation cap icon) |

257| `respectGitIgnore` | `true` | Exclude .gitignore patterns from file searches |

258| `environmentVariables` | `[]` | Set environment variables for the Claude process. Use Claude Code settings instead for shared config. |

259| `disableLoginPrompt` | `false` | Skip authentication prompts (for third-party provider setups) |

260| `allowDangerouslySkipPermissions` | `false` | Bypass all permission prompts. **Use with extreme caution.** |

261| `claudeProcessWrapper` | - | Executable path used to launch the Claude process |

106 262 

107* Ensure you have a compatible version of VS Code (1.85.0 or later)263## VS Code extension vs. Claude Code CLI

264 

265Claude Code is available as both a VS Code extension (graphical panel) and a CLI (command-line interface in the terminal). Some features are only available in the CLI. If you need a CLI-only feature, run `claude` in VS Code's integrated terminal.

266 

267| Feature | CLI | VS Code Extension |

268| ------------------- | --------------------------------------------- | ---------------------------------------- |

269| Commands and skills | [All](/en/interactive-mode#built-in-commands) | Subset (type `/` to see available) |

270| MCP server config | Yes | No (configure via CLI, use in extension) |

271| Checkpoints | Yes | Yes |

272| `!` bash shortcut | Yes | No |

273| Tab completion | Yes | No |

274 

275### Rewind with checkpoints

276 

277The VS Code extension supports checkpoints, which track Claude's file edits and let you rewind to a previous state. Hover over any message to reveal the rewind button, then choose from three options:

278 

279* **Fork conversation from here**: start a new conversation branch from this message while keeping all code changes intact

280* **Rewind code to here**: revert file changes back to this point in the conversation while keeping the full conversation history

281* **Fork conversation and rewind code**: start a new conversation branch and revert file changes to this point

282 

283For full details on how checkpoints work and their limitations, see [Checkpointing](/en/checkpointing).

284 

285### Run CLI in VS Code

286 

287To use the CLI while staying in VS Code, open the integrated terminal (`` Ctrl+` `` on Windows/Linux or `` Cmd+` `` on Mac) and run `claude`. The CLI automatically integrates with your IDE for features like diff viewing and diagnostic sharing.

288 

289If using an external terminal, run `/ide` inside Claude Code to connect it to VS Code.

290 

291### Switch between extension and CLI

292 

293The extension and CLI share the same conversation history. To continue an extension conversation in the CLI, run `claude --resume` in the terminal. This opens an interactive picker where you can search for and select your conversation.

294 

295### Include terminal output in prompts

296 

297Reference terminal output in your prompts using `@terminal:name` where `name` is the terminal's title. This lets Claude see command output, error messages, or logs without copy-pasting.

298 

299### Monitor background processes

300 

301When Claude runs long-running commands, the extension shows progress in the status bar. However, visibility for background tasks is limited compared to the CLI. For better visibility, have Claude output the command so you can run it in VS Code's integrated terminal.

302 

303### Connect to external tools with MCP

304 

305MCP (Model Context Protocol) servers give Claude access to external tools, databases, and APIs. Configure them via CLI, then use them in both extension and CLI.

306 

307To add an MCP server, open the integrated terminal (`` Ctrl+` `` or `` Cmd+` ``) and run:

308 

309```bash theme={null}

310claude mcp add --transport http github https://api.githubcopilot.com/mcp/

311```

312 

313Once configured, ask Claude to use the tools (e.g., "Review PR #456"). Some servers require authentication: run `claude` in the terminal, then type `/mcp` to authenticate. See the [MCP documentation](/en/mcp) for available servers.

314 

315## Work with git

316 

317Claude Code integrates with git to help with version control workflows directly in VS Code. Ask Claude to commit changes, create pull requests, or work across branches.

318 

319### Create commits and pull requests

320 

321Claude can stage changes, write commit messages, and create pull requests based on your work:

322 

323```

324> commit my changes with a descriptive message

325> create a pr for this feature

326> summarize the changes I've made to the auth module

327```

328 

329When creating pull requests, Claude generates descriptions based on the actual code changes and can add context about testing or implementation decisions.

330 

331### Use git worktrees for parallel tasks

332 

333Use the `--worktree` (`-w`) flag to start Claude in an isolated worktree with its own files and branch:

334 

335```bash theme={null}

336claude --worktree feature-auth

337```

338 

339Each worktree maintains independent file state while sharing git history. This prevents Claude instances from interfering with each other when working on different tasks. For more details, see [Run parallel sessions with Git worktrees](/en/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees).

340 

341## Use third-party providers

342 

343By default, Claude Code connects directly to Anthropic's API. If your organization uses Amazon Bedrock, Google Vertex AI, or Microsoft Foundry to access Claude, configure the extension to use your provider instead:

344 

345<Steps>

346 <Step title="Disable login prompt">

347 Open the [Disable Login Prompt setting](vscode://settings/claudeCode.disableLoginPrompt) and check the box.

348 

349 You can also open VS Code settings (`Cmd+,` on Mac or `Ctrl+,` on Windows/Linux), search for "Claude Code login", and check **Disable Login Prompt**.

350 </Step>

351 

352 <Step title="Configure your provider">

353 Follow the setup guide for your provider:

354 

355 * [Claude Code on Amazon Bedrock](/en/amazon-bedrock)

356 * [Claude Code on Google Vertex AI](/en/google-vertex-ai)

357 * [Claude Code on Microsoft Foundry](/en/microsoft-foundry)

358 

359 These guides cover configuring your provider in `~/.claude/settings.json`, which ensures your settings are shared between the VS Code extension and the CLI.

360 </Step>

361</Steps>

362 

363## Security and privacy

364 

365Your code stays private. Claude Code processes your code to provide assistance but does not use it to train models. For details on data handling and how to opt out of logging, see [Data and privacy](/en/data-usage).

366 

367With auto-edit permissions enabled, Claude Code can modify VS Code configuration files (like `settings.json` or `tasks.json`) that VS Code may execute automatically. To reduce risk when working with untrusted code:

368 

369* Enable [VS Code Restricted Mode](https://code.visualstudio.com/docs/editor/workspace-trust#_restricted-mode) for untrusted workspaces

370* Use manual approval mode instead of auto-accept for edits

371* Review changes carefully before accepting them

372 

373## Fix common issues

374 

375### Extension won't install

376 

377* Ensure you have a compatible version of VS Code (1.98.0 or later)

108* Check that VS Code has permission to install extensions378* Check that VS Code has permission to install extensions

109* Try installing directly from the marketplace website379* Try installing directly from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code)

380 

381### Spark icon not visible

382 

383The Spark icon appears in the **Editor Toolbar** (top-right of editor) when you have a file open. If you don't see it:

384 

3851. **Open a file**: The icon requires a file to be open. Having just a folder open isn't enough.

3862. **Check VS Code version**: Requires 1.98.0 or higher (Help → About)

3873. **Restart VS Code**: Run "Developer: Reload Window" from the Command Palette

3884. **Disable conflicting extensions**: Temporarily disable other AI extensions (Cline, Continue, etc.)

3895. **Check workspace trust**: The extension doesn't work in Restricted Mode

390 

391Alternatively, click "✱ Claude Code" in the **Status Bar** (bottom-right corner). This works even without a file open. You can also use the **Command Palette** (`Cmd+Shift+P` / `Ctrl+Shift+P`) and type "Claude Code".

392 

393### Claude Code never responds

394 

395If Claude Code isn't responding to your prompts:

396 

3971. **Check your internet connection**: Ensure you have a stable internet connection

3982. **Start a new conversation**: Try starting a fresh conversation to see if the issue persists

3993. **Try the CLI**: Run `claude` from the terminal to see if you get more detailed error messages

400 

401If problems persist, [file an issue on GitHub](https://github.com/anthropics/claude-code/issues) with details about the error.

402 

403## Uninstall the extension

404 

405To uninstall the Claude Code extension:

406 

4071. Open the Extensions view (`Cmd+Shift+X` on Mac or `Ctrl+Shift+X` on Windows/Linux)

4082. Search for "Claude Code"

4093. Click **Uninstall**

410 

411To also remove extension data and reset all settings:

412 

413```bash theme={null}

414rm -rf ~/.vscode/globalStorage/anthropic.claude-code

415```

416 

417For additional help, see the [troubleshooting guide](/en/troubleshooting).

110 418 

111### Legacy Integration Not Working419## Next steps

112 420 

113* Ensure you're running Claude Code from VS Code's integrated terminal421Now that you have Claude Code set up in VS Code:

114* Ensure the CLI for your IDE variant is installed:

115 * VS Code: `code` command should be available

116 * Cursor: `cursor` command should be available

117 * Windsurf: `windsurf` command should be available

118 * VSCodium: `codium` command should be available

119* If the command isn't installed:

120 1. Open command palette with `Cmd+Shift+P` (Mac) or `Ctrl+Shift+P` (Windows/Linux)

121 2. Search for "Shell Command: Install 'code' command in PATH" (or equivalent for your IDE)

122 422 

123For additional help, see our [troubleshooting guide](/en/docs/claude-code/troubleshooting).423* [Explore common workflows](/en/common-workflows) to get the most out of Claude Code

424* [Set up MCP servers](/en/mcp) to extend Claude's capabilities with external tools. Configure servers using the CLI, then use them in the extension.

425* [Configure Claude Code settings](/en/settings) to customize allowed commands, hooks, and more. These settings are shared between the extension and CLI.