SpyBara
Go Premium Account
2026
24 Nov 2025, 21:01
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
4 Feb 2026, 03:45
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

amazon-bedrock.md +34 −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# 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.5) 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 


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

49```53```

50 54 

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

56 

57```bash theme={null}

58aws login

59```

60 

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

62 

63**Option E: Bedrock API keys**

52 64 

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

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


75 87 

76##### Configuration settings explained88##### Configuration settings explained

77 89 

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.90**`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 91 

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:92**`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 93 

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

83{95{


102export ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION=us-west-2114export ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION=us-west-2

103```115```

104 116 

105**For VS Code Extension users**: Configure environment variables in the VS Code extension settings instead of exporting them in your shell. See [Using Third-Party Providers in VS Code](/en/vs-code#using-third-party-providers-vertex-and-bedrock) for detailed instructions. All environment variables shown in this guide should work when configured through the VS Code extension settings.

106 

107When enabling Bedrock for Claude Code, keep the following in mind:117When enabling Bedrock for Claude Code, keep the following in mind:

108 118 

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


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

121 131 

122<Note>132<Note>

123 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`).133 For Bedrock users, Claude Code won't 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 (for example, `us.anthropic.claude-haiku-4-5-20251001-v1:0`).

124</Note>134</Note>

125 135 

126To customize models, use one of these methods:136To customize models, use one of these methods:


137export DISABLE_PROMPT_CACHING=1147export DISABLE_PROMPT_CACHING=1

138```148```

139 149 

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

141 [Prompt caching](https://docs.claude.com/en/docs/build-with-claude/prompt-caching) may not be available in all regions

142</Note>

143 151 

144### 5. Output token configuration152### 5. Output token configuration

145 153 

146When using Claude Code with Amazon Bedrock, we recommend the following token settings:154These are the recommended token settings for Claude Code with Amazon Bedrock:

147 155 

148```bash theme={null}156```bash theme={null}

149# Recommended output token settings for Bedrock157# Recommended output token settings for Bedrock


153 161 

154**Why these values:**162**Why these values:**

155 163 

156* **`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.164* **`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.

157 165 

158* **`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.166* **`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.

159 167 


205 We recommend creating a dedicated AWS account for Claude Code to simplify cost tracking and access control.213 We recommend creating a dedicated AWS account for Claude Code to simplify cost tracking and access control.

206</Note>214</Note>

207 215 

216## AWS Guardrails

217 

218[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.

219 

220Example configuration:

221 

222```json theme={null}

223{

224 "env": {

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

226 }

227}

228```

229 

208## Troubleshooting230## Troubleshooting

209 231 

210If you encounter region issues:232If you encounter region issues:

analytics.md +178 −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<Steps>

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

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

40 </Step>

41 

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

43 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.

44 </Step>

45 

46 <Step title="Enable GitHub analytics">

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

48 </Step>

49 

50 <Step title="Authenticate with GitHub">

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

52 </Step>

53</Steps>

54 

55Data typically appears within 24 hours after enabling, with daily updates. If no data appears, you may see one of these messages:

12 56 

13Navigate to the analytics dashboard at [console.anthropic.com/claude-code](https://console.anthropic.com/claude-code).57* **"GitHub app required"**: install the GitHub app to view contribution metrics

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

14 59 

15### Required roles60Contribution metrics support GitHub Cloud and GitHub Enterprise Server.

16 61 

17* **Primary Owner**62### Review summary metrics

18* **Owner**

19* **Billing**

20* **Admin**

21* **Developer**

22 63 

23<Note>64<Note>

24 Users with **User**, **Claude Code User** or **Membership Admin** roles cannot access analytics.65 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>66</Note>

26 67 

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

69 

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

71* **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.

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

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

74* **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.

75 

76### Explore the charts

77 

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

79 

80#### Track adoption

81 

82The Adoption chart shows daily usage trends:

83 

84* **users**: daily active users

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

86 

87#### Measure PRs per user

88 

89This chart displays individual developer activity over time:

90 

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

92* **users**: daily active users

93 

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

95 

96#### View pull requests breakdown

97 

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

28 99 

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

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

30 102 

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

32 104 

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

34* Doesn't track subsequent deletions

35 106 

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

37 108 

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

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

39 111 

40* Edit112Click **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 113 

44### Activity114### PR attribution

45 115 

46**users**: Number of active users in a given day (number on left Y-axis)116When 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 117 

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

49 119 

50### Spend120PRs 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 121 

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

53 123 

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

55 125 

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

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

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

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

57 130 

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

59 132 

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

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

62 134 

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

64 136 

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

66 138 

67## Using analytics effectively139#### Excluded files

68 140 

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

70 142 

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

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

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

146* Test fixtures: snapshots, cassettes, mock data

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

148 

149#### Attribution notes

150 

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

152 

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

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

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

156 

157### Get the most from analytics

158 

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

160 

161#### Monitor adoption

162 

163Track the Adoption chart and user counts to identify:

72 164 

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

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

167* Dips in usage that may indicate friction or issues

168 

169#### Measure ROI

170 

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

172 

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

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

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

176 

177#### Identify power users

178 

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

180 

181* Share prompting techniques and workflows with the team

182* Provide feedback on what's working well

183* Help onboard new users

75 184 

76### Measure productivity185#### Access data programmatically

77 186 

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

79 188 

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

81* Track code generation effectiveness190 

82* Identify opportunities for training or process improvements191API 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.

192 

193<Note>

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

195</Note>

196 

197The Console dashboard displays:

198 

199* **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.

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

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

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

203 

204### View team insights

205 

206The team insights table shows per-user metrics:

207 

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

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

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

211 

212<Note>

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

214</Note>

83 215 

84## Related resources216## Related resources

85 217 

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

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

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

authentication.md +104 −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> Learn how to configure user authentication and credential management for Claude Code in your organization.

8 

9## Authentication methods

10 

11Setting up Claude Code requires access to Anthropic models. For teams, you can set up Claude Code access in one of these ways:

12 

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

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

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

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

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

18 

19### Claude for Teams or Enterprise

20 

21[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.

22 

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

24* **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.

25 

26<Steps>

27 <Step title="Subscribe">

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

29 </Step>

30 

31 <Step title="Invite team members">

32 Invite team members from the admin dashboard.

33 </Step>

34 

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

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

37 </Step>

38</Steps>

39 

40### Claude Console authentication

41 

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

43 

44<Steps>

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

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

47 </Step>

48 

49 <Step title="Add users">

50 You can add users through either method:

51 

52 * Bulk invite users from within the Console (Console -> Settings -> Members -> Invite)

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

54 </Step>

55 

56 <Step title="Assign roles">

57 When inviting users, assign one of:

58 

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

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

61 </Step>

62 

63 <Step title="Users complete setup">

64 Each invited user needs to:

65 

66 * Accept the Console invite

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

68 * [Install Claude Code](/en/setup#installation)

69 * Log in with Console account credentials

70 </Step>

71</Steps>

72 

73### Cloud provider authentication

74 

75For teams using Amazon Bedrock, Google Vertex AI, or Microsoft Azure:

76 

77<Steps>

78 <Step title="Follow provider setup">

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

80 </Step>

81 

82 <Step title="Distribute configuration">

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

84 </Step>

85 

86 <Step title="Install Claude Code">

87 Users can [install Claude Code](/en/setup#installation).

88 </Step>

89</Steps>

90 

91## Credential management

92 

93Claude Code securely manages your authentication credentials:

94 

95* **Storage location**: on macOS, API keys, OAuth tokens, and other credentials are stored in the encrypted macOS Keychain.

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

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

98* **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.

99 

100## See also

101 

102* [Permissions](/en/permissions): configure what Claude Code can access and do

103* [Settings](/en/settings): complete configuration reference

104* [Security](/en/security): security safeguards and best practices

best-practices.md +597 −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. For detailed strategies on reducing token usage, see [Reduce token usage](/en/costs#reduce-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 a 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.

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* 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

404 

405### Use subagents for investigation

406 

407<Tip>

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

409</Tip>

410 

411Since 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:

412 

413```

414Use subagents to investigate how our authentication system handles token

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

416```

417 

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

419 

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

421 

422```

423use a subagent to review this code for edge cases

424```

425 

426### Rewind with checkpoints

427 

428<Tip>

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

430</Tip>

431 

432Claude automatically checkpoints before changes. Double-tap `Escape` or run `/rewind` to open the checkpoint menu. You can restore conversation only (keep code changes), restore code only (keep conversation), or restore both.

433 

434Instead 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.

435 

436<Warning>

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

438</Warning>

439 

440### Resume conversations

441 

442<Tip>

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

444</Tip>

445 

446Claude 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:

447 

448```bash theme={null}

449claude --continue # Resume the most recent conversation

450claude --resume # Select from recent conversations

451```

452 

453Use `/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.

454 

455***

456 

457## Automate and scale

458 

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

460 

461Everything 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.

462 

463### Run headless mode

464 

465<Tip>

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

467</Tip>

468 

469With `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.

470 

471```bash theme={null}

472# One-off queries

473claude -p "Explain what this project does"

474 

475# Structured output for scripts

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

477 

478# Streaming for real-time processing

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

480```

481 

482### Run multiple Claude sessions

483 

484<Tip>

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

486</Tip>

487 

488There are two main ways to run parallel sessions:

489 

490* [Claude Desktop](/en/desktop): Manage multiple local sessions visually. Each session gets its own isolated worktree.

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

492 

493Beyond 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.

494 

495For example, use a Writer/Reviewer pattern:

496 

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

498| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

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

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

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

502 

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

504 

505### Fan out across files

506 

507<Tip>

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

509</Tip>

510 

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

512 

513<Steps>

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

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

516 </Step>

517 

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

519 ```bash theme={null}

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

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

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

523 done

524 ```

525 </Step>

526 

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

528 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.

529 </Step>

530</Steps>

531 

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

533 

534```bash theme={null}

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

536```

537 

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

539 

540### Safe Autonomous Mode

541 

542Use `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.

543 

544<Warning>

545 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.

546 

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

548</Warning>

549 

550***

551 

552## Avoid common failure patterns

553 

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

555 

556* **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.

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

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

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

560* **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.

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

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

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

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

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

566 

567***

568 

569## Develop your intuition

570 

571The 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.

572 

573Sometimes 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.

574 

575Pay 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?

576 

577Over 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.

578 

579## Related resources

580 

581<CardGroup cols={2}>

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

583 Understand the agentic loop, tools, and context management

584 </Card>

585 

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

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

588 </Card>

589 

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

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

592 </Card>

593 

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

595 Store project conventions and persistent context

596 </Card>

597</CardGroup>

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> Automatically track and rewind Claude's edits to quickly recover from unwanted changes.


61## See also65## See also

62 66 

63* [Interactive mode](/en/interactive-mode) - Keyboard shortcuts and session controls67* [Interactive mode](/en/interactive-mode) - Keyboard shortcuts and session controls

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

65* [CLI reference](/en/cli-reference) - Command-line options69* [CLI reference](/en/cli-reference) - Command-line options

chrome.md +219 −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 browser to test web apps, debug with console logs, and automate browser tasks.

8 

9<Note>

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

11</Note>

12 

13Claude Code integrates with the Claude in Chrome browser extension to give you browser automation capabilities directly from your terminal. Build in your terminal, then test and debug in your browser without switching contexts.

14 

15## What the integration enables

16 

17With Chrome connected, you can chain browser actions with terminal commands in a single workflow. For example: scrape documentation from a website, analyze it, generate code based on what you learned, and commit the result.

18 

19Key capabilities include:

20 

21* **Live debugging**: Claude reads console errors and DOM state directly, then fixes the code that caused them

22* **Design verification**: Build a UI from a Figma mock, then have Claude open it in the browser and verify it matches

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

24* **Authenticated web apps**: Interact with Google Docs, Gmail, Notion, or any app you're logged into without needing 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/) browser

34* [Claude in Chrome extension](https://chromewebstore.google.com/detail/claude/fcoeoabgfenejglbffodgkkbkcdhcgfn) version 1.0.36 or higher

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

36* A paid Claude plan (Pro, Team, or Enterprise)

37 

38## How the integration works

39 

40Claude Code communicates with Chrome through the Claude in Chrome browser extension. The extension uses Chrome's [Native Messaging API](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging) to receive commands from Claude Code and execute them in your browser. This architecture lets Claude Code control browser tabs, read page content, and perform actions while you continue working in your terminal.

41 

42When Claude encounters a login page, CAPTCHA, or other blocker, it pauses and asks you to handle it. You can provide credentials for Claude to enter, or log in manually in the browser. Once you're past the blocker, tell Claude to continue and it picks up where it left off.

43 

44Claude opens new tabs for browser tasks rather than taking over existing ones. However, it shares your browser's login state, so if you're already signed into a site in Chrome, Claude can access it without re-authenticating.

45 

46<Note>

47 The Chrome integration requires a visible browser window. When Claude performs browser actions, you'll see Chrome open and navigate in real time. There's no headless mode since the integration relies on your actual browser session with its login state.

48</Note>

49 

50## Set up the integration

51 

52<Steps>

53 <Step title="Update Claude Code">

54 Chrome integration requires a recent version of Claude Code. If you installed using the [native installer](/en/quickstart#step-1-install-claude-code), updates happen automatically. Otherwise, run:

55 

56 ```bash theme={null}

57 claude update

58 ```

59 </Step>

60 

61 <Step title="Start Claude Code with Chrome enabled">

62 Launch Claude Code with the `--chrome` flag:

63 

64 ```bash theme={null}

65 claude --chrome

66 ```

67 </Step>

68 

69 <Step title="Verify the connection">

70 Run `/chrome` to check the connection status and manage settings. If the extension isn't detected, you'll see a warning with a link to install it.

71 </Step>

72</Steps>

73 

74You can also enable Chrome integration from within an existing session using the `/chrome` command.

75 

76## Try it out

77 

78Once connected, type this into Claude to see the integration in action:

79 

80```

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

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

83```

84 

85Claude opens the page, clicks into the search field, types the query, and reports the autocomplete results. This shows navigation, clicking, and typing in a single workflow.

86 

87## Example workflows

88 

89Claude can navigate pages, click and type, fill forms, scroll, read console logs and network requests, manage tabs, resize windows, and record GIFs. Run `/mcp` and click into `claude-in-chrome` to see the full list of available tools.

90 

91The following examples show common patterns for browser automation.

92 

93### Test a local web application

94 

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

96 

97```

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

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

100messages appear correctly?

101```

102 

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

104 

105### Debug with console logs

106 

107If your app has issues, Claude can read console output to help diagnose problems:

108 

109```

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

111the page loads.

112```

113 

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

115 

116### Automate form filling

117 

118Speed up repetitive data entry tasks:

119 

120```

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

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

123name, email, and phone fields.

124```

125 

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

127 

128### Draft content in Google Docs

129 

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

131 

132```

133Draft a project update based on our recent commits and add it to my

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

135```

136 

137Claude 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.

138 

139### Extract data from web pages

140 

141Pull structured information from websites:

142 

143```

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

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

146```

147 

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

149 

150### Run multi-site workflows

151 

152Coordinate tasks across multiple websites:

153 

154```

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

156an external attendee, look up their company on LinkedIn and add a

157note about what they do.

158```

159 

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

161 

162### Record a demo GIF

163 

164Create shareable recordings of browser interactions:

165 

166```

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

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

169```

170 

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

172 

173## Best practices

174 

175When using browser automation, keep these guidelines in mind:

176 

177* **Modal dialogs can interrupt the flow**: JavaScript alerts, confirms, and prompts block browser events and prevent Claude from receiving commands. If a dialog appears, dismiss it manually and tell Claude to continue.

178* **Use fresh tabs**: Claude creates new tabs for each session. If a tab becomes unresponsive, ask Claude to create a new one.

179* **Filter console output**: Console logs can be verbose. When debugging, tell Claude what patterns to look for rather than asking for all console output.

180 

181## Troubleshooting

182 

183### Extension not detected

184 

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

186 

1871. Verify the Chrome extension (version 1.0.36 or higher) is installed

1882. Verify Claude Code is version 2.0.73 or higher by running `claude --version`

1893. Check that Chrome is running

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

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

192 

193### Browser not responding

194 

195If Claude's browser commands stop working:

196 

1971. Check if a modal dialog (alert, confirm, prompt) is blocking the page

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

1993. Restart the Chrome extension by disabling and re-enabling it

200 

201### First-time setup

202 

203The first time you use the integration, Claude Code installs a native messaging host that allows communication between the CLI and Chrome. If you encounter permission errors, you may need to restart Chrome for the installation to take effect.

204 

205## Enable by default

206 

207Chrome integration requires the `--chrome` flag each time you start Claude Code. To enable it by default, run `/chrome` and select "Enabled by default".

208 

209<Note>

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

211</Note>

212 

213Site-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. Run `/chrome` to see current permission settings.

214 

215## See also

216 

217* [CLI reference](/en/cli-reference) - Command-line flags including `--chrome`

218* [Common workflows](/en/common-workflows) - More ways to use Claude Code

219* [Getting started with Claude for Chrome](https://support.anthropic.com/en/articles/12012173-getting-started-with-claude-for-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 iOS app 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.

25 26 

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

27 28 


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.

60 130 

611. Click the "Open in CLI" button131#### Requirements for teleporting

622. Paste and run the command in your terminal in a checkout of the repo132 

633. Any existing local changes will be stashed, and the remote session will be loaded133Teleport 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.

644. Continue working locally134 

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

150 

151For Enterprise and Teams accounts, the two visibility options are **Private**

152and **Team**. Team visibility makes the session visible to other members of your

153Claude.ai organization. Repository access verification is enabled by default,

154based 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 


127 232 

128**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.

129 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 

130<Note>237<Note>

131 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:

132 239 


223 330 

224* api.anthropic.com331* api.anthropic.com

225* statsig.anthropic.com332* statsig.anthropic.com

333* platform.claude.com

334* code.claude.com

226* claude.ai335* claude.ai

227 336 

228#### Version Control337#### Version Control


230* github.com339* github.com

231* [www.github.com](http://www.github.com)340* [www.github.com](http://www.github.com)

232* api.github.com341* api.github.com

342* npm.pkg.github.com

233* raw\.githubusercontent.com343* raw\.githubusercontent.com

344* pkg-npm.githubusercontent.com

234* objects.githubusercontent.com345* objects.githubusercontent.com

235* codeload.github.com346* codeload.github.com

236* avatars.githubusercontent.com347* avatars.githubusercontent.com


252* [www.docker.com](http://www.docker.com)363* [www.docker.com](http://www.docker.com)

253* production.cloudflare.docker.com364* production.cloudflare.docker.com

254* download.docker.com365* download.docker.com

366* gcr.io

255* \*.gcr.io367* \*.gcr.io

256* ghcr.io368* ghcr.io

257* mcr.microsoft.com369* mcr.microsoft.com

258* \*.data.mcr.microsoft.com370* \*.data.mcr.microsoft.com

371* public.ecr.aws

259 372 

260#### Cloud Platforms373#### Cloud Platforms

261 374 


276* dot.net389* dot.net

277* visualstudio.com390* visualstudio.com

278* dev.azure.com391* dev.azure.com

392* \*.amazonaws.com

393* \*.api.aws

279* oracle.com394* oracle.com

280* [www.oracle.com](http://www.oracle.com)395* [www.oracle.com](http://www.oracle.com)

281* java.com396* java.com


325 440 

326* crates.io441* crates.io

327* [www.crates.io](http://www.crates.io)442* [www.crates.io](http://www.crates.io)

443* index.crates.io

328* static.crates.io444* static.crates.io

329* rustup.rs445* rustup.rs

330* static.rust-lang.org446* static.rust-lang.org


350* gradle.org466* gradle.org

351* [www.gradle.org](http://www.gradle.org)467* [www.gradle.org](http://www.gradle.org)

352* services.gradle.org468* services.gradle.org

469* plugins.gradle.org

470* kotlin.org

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

353* spring.io472* spring.io

354* repo.spring.io473* repo.spring.io

355 474 


423* statsig.com542* statsig.com

424* [www.statsig.com](http://www.statsig.com)543* [www.statsig.com](http://www.statsig.com)

425* api.statsig.com544* api.statsig.com

545* sentry.io

426* \*.sentry.io546* \*.sentry.io

547* http-intake.logs.datadoghq.com

548* \*.datadoghq.com

549* \*.datadoghq.eu

427 550 

428#### Content Delivery & Mirrors551#### Content Delivery & Mirrors

429 552 

553* sourceforge.net

430* \*.sourceforge.net554* \*.sourceforge.net

431* packagecloud.io555* packagecloud.io

432* \*.packagecloud.io556* \*.packagecloud.io


438* json.schemastore.org562* json.schemastore.org

439* [www.schemastore.org](http://www.schemastore.org)563* [www.schemastore.org](http://www.schemastore.org)

440 564 

565#### Model Context Protocol

566 

567* \*.modelcontextprotocol.io

568 

441<Note>569<Note>

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

443</Note>571</Note>


473 601 

474## Best practices602## Best practices

475 603 

4761. **Use Claude Code hooks**: Configure [sessionStart hooks](/en/hooks#sessionstart) to automate environment setup and dependency installation.6041. **Use Claude Code hooks**: Configure [SessionStart hooks](/en/hooks#sessionstart) to automate environment setup and dependency installation.

4772. **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.6052. **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.

478 606 

479## Related resources607## Related resources

cli-reference.md +64 −35

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/mcp). |21| `claude mcp` | Configure Model Context Protocol (MCP) servers | See the [Claude Code MCP documentation](/en/mcp). |

18 22 


21Customize Claude Code's behavior with these command-line flags:25Customize Claude Code's behavior with these command-line flags:

22 26 

23| Flag | Description | Example |27| Flag | Description | Example |

24| :------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------- |28| :------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- |

25| `--add-dir` | Add additional working directories for Claude to access (validates each path exists as a directory) | `claude --add-dir ../apps ../lib` |29| `--add-dir` | Add additional working directories for Claude to access (validates each path exists as a directory) | `claude --add-dir ../apps ../lib` |

30| `--agent` | Specify an agent for the current session (overrides the `agent` setting) | `claude --agent my-custom-agent` |

26| `--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"}}'` |31| `--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"}}'` |

27| `--allowedTools` | A list of tools that should be allowed without prompting the user for permission, in addition to [settings.json files](/en/settings) | `"Bash(git log:*)" "Bash(git diff:*)" "Read"` |32| `--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` |

28| `--disallowedTools` | A list of tools that should be disallowed without prompting the user for permission, in addition to [settings.json files](/en/settings) | `"Bash(git log:*)" "Bash(git diff:*)" "Edit"` |33| `--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"` |

29| `--print`, `-p` | Print response without interactive mode (see [SDK documentation](https://docs.claude.com/en/docs/agent-sdk) for programmatic usage details) | `claude -p "query"` |34| `--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"` |

30| `--system-prompt` | Replace the entire system prompt with custom text (works in both interactive and print modes; added in v2.0.14) | `claude --system-prompt "You are a Python expert"` |35| `--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"` |

31| `--system-prompt-file` | Load system prompt from a file, replacing the default prompt (print mode only; added in v1.0.54) | `claude -p --system-prompt-file ./custom-prompt.txt "query"` |36| `--betas` | Beta headers to include in API requests (API key users only) | `claude --betas interleaved-thinking` |

32| `--append-system-prompt` | Append custom text to the end of the default system prompt (works in both interactive and print modes; added in v1.0.55) | `claude --append-system-prompt "Always use TypeScript"` |37| `--chrome` | Enable [Chrome browser integration](/en/chrome) for web automation and testing | `claude --chrome` |

33| `--output-format` | Specify output format for print mode (options: `text`, `json`, `stream-json`) | `claude -p "query" --output-format json` |38| `--continue`, `-c` | Load the most recent conversation in the current directory | `claude --continue` |

34| `--input-format` | Specify input format for print mode (options: `text`, `stream-json`) | `claude -p --output-format json --input-format stream-json` |39| `--dangerously-skip-permissions` | Skip all permission prompts (use with caution) | `claude --dangerously-skip-permissions` |

35| `--json-schema` | Get validated JSON output matching a JSON Schema after agent completes its workflow (print mode only, see [Agent SDK Structured Outputs](https://docs.claude.com/en/docs/agent-sdk/structured-outputs)) | `claude -p --json-schema '{"type":"object","properties":{...}}' "query"` |40| `--debug` | Enable debug mode with optional category filtering (for example, `"api,hooks"` or `"!statsig,!file"`) | `claude --debug "api,mcp"` |

41| `--disable-slash-commands` | Disable all skills and slash commands for this session | `claude --disable-slash-commands` |

42| `--disallowedTools` | Tools that are removed from the model's context and cannot be used | `"Bash(git log *)" "Bash(git diff *)" "Edit"` |

43| `--fallback-model` | Enable automatic fallback to specified model when default model is overloaded (print mode only) | `claude -p --fallback-model sonnet "query"` |

44| `--fork-session` | When resuming, create a new session ID instead of reusing the original (use with `--resume` or `--continue`) | `claude --resume abc123 --fork-session` |

45| `--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` |

46| `--ide` | Automatically connect to IDE on startup if exactly one valid IDE is available | `claude --ide` |

47| `--init` | Run initialization hooks and start interactive mode | `claude --init` |

48| `--init-only` | Run initialization hooks and exit (no interactive session) | `claude --init-only` |

36| `--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"` |49| `--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"` |

37| `--verbose` | Enable verbose logging, shows full turn-by-turn output (helpful for debugging in both print and interactive modes) | `claude --verbose` |50| `--input-format` | Specify input format for print mode (options: `text`, `stream-json`) | `claude -p --output-format json --input-format stream-json` |

38| `--max-turns` | Limit the number of agentic turns in non-interactive mode | `claude -p --max-turns 3 "query"` |51| `--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"` |

52| `--maintenance` | Run maintenance hooks and exit | `claude --maintenance` |

53| `--max-budget-usd` | Maximum dollar amount to spend on API calls before stopping (print mode only) | `claude -p --max-budget-usd 5.00 "query"` |

54| `--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"` |

55| `--mcp-config` | Load MCP servers from JSON files or strings (space-separated) | `claude --mcp-config ./mcp.json` |

39| `--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` |56| `--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` |

40| `--permission-mode` | Begin in a specified [permission mode](/en/iam#permission-modes) | `claude --permission-mode plan` |57| `--no-chrome` | Disable [Chrome browser integration](/en/chrome) for this session | `claude --no-chrome` |

58| `--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"` |

59| `--output-format` | Specify output format for print mode (options: `text`, `json`, `stream-json`) | `claude -p "query" --output-format json` |

60| `--permission-mode` | Begin in a specified [permission mode](/en/permissions#permission-modes) | `claude --permission-mode plan` |

41| `--permission-prompt-tool` | Specify an MCP tool to handle permission prompts in non-interactive mode | `claude -p --permission-prompt-tool mcp_auth_tool "query"` |61| `--permission-prompt-tool` | Specify an MCP tool to handle permission prompts in non-interactive mode | `claude -p --permission-prompt-tool mcp_auth_tool "query"` |

42| `--resume` | Resume a specific session by ID, or by choosing in interactive mode | `claude --resume abc123 "query"` |62| `--plugin-dir` | Load plugins from directories for this session only (repeatable) | `claude --plugin-dir ./my-plugins` |

43| `--continue` | Load the most recent conversation in the current directory | `claude --continue` |63| `--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"` |

44| `--dangerously-skip-permissions` | Skip permission prompts (use with caution) | `claude --dangerously-skip-permissions` |64| `--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"` |

65| `--resume`, `-r` | Resume a specific session by ID or name, or show an interactive picker to choose a session | `claude --resume auth-refactor` |

66| `--session-id` | Use a specific session ID for the conversation (must be a valid UUID) | `claude --session-id "550e8400-e29b-41d4-a716-446655440000"` |

67| `--setting-sources` | Comma-separated list of setting sources to load (`user`, `project`, `local`) | `claude --setting-sources user,project` |

68| `--settings` | Path to a settings JSON file or a JSON string to load additional settings from | `claude --settings ./settings.json` |

69| `--strict-mcp-config` | Only use MCP servers from `--mcp-config`, ignoring all other MCP configurations | `claude --strict-mcp-config --mcp-config ./mcp.json` |

70| `--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"` |

71| `--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"` |

72| `--teleport` | Resume a [web session](/en/claude-code-on-the-web) in your local terminal | `claude --teleport` |

73| `--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"` |

74| `--verbose` | Enable verbose logging, shows full turn-by-turn output (helpful for debugging in both print and interactive modes) | `claude --verbose` |

75| `--version`, `-v` | Output the version number | `claude -v` |

45 76 

46<Tip>77<Tip>

47 The `--output-format json` flag is particularly useful for scripting and78 The `--output-format json` flag is particularly useful for scripting and


53The `--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:84The `--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:

54 85 

55| Field | Required | Description |86| Field | Required | Description |

56| :------------ | :------- | :-------------------------------------------------------------------------------------------------------------- |87| :------------ | :------- | :---------------------------------------------------------------------------------------------------------------------------------- |

57| `description` | Yes | Natural language description of when the subagent should be invoked |88| `description` | Yes | Natural language description of when the subagent should be invoked |

58| `prompt` | Yes | The system prompt that guides the subagent's behavior |89| `prompt` | Yes | The system prompt that guides the subagent's behavior |

59| `tools` | No | Array of specific tools the subagent can use (e.g., `["Read", "Edit", "Bash"]`). If omitted, inherits all tools |90| `tools` | No | Array of specific tools the subagent can use (for example, `["Read", "Edit", "Bash"]`). If omitted, inherits all tools |

60| `model` | No | Model alias to use: `sonnet`, `opus`, or `haiku`. If omitted, uses the default subagent model |91| `model` | No | Model alias to use: `sonnet`, `opus`, `haiku`, or `inherit`. If omitted, defaults to `inherit` (uses the main conversation's model) |

61 92 

62Example:93Example:

63 94 


80 111 

81### System prompt flags112### System prompt flags

82 113 

83Claude Code provides three flags for customizing the system prompt, each serving a different purpose:114Claude Code provides four flags for customizing the system prompt, each serving a different purpose:

84 115 

85| Flag | Behavior | Modes | Use Case |116| Flag | Behavior | Modes | Use Case |

86| :----------------------- | :--------------------------------- | :------------------ | :------------------------------------------------------------------- |117| :---------------------------- | :------------------------------------------ | :------------------ | :------------------------------------------------------------------- |

87| `--system-prompt` | **Replaces** entire default prompt | Interactive + Print | Complete control over Claude's behavior and instructions |118| `--system-prompt` | **Replaces** entire default prompt | Interactive + Print | Complete control over Claude's behavior and instructions |

88| `--system-prompt-file` | **Replaces** with file contents | Print only | Load prompts from files for reproducibility and version control |119| `--system-prompt-file` | **Replaces** with file contents | Print only | Load prompts from files for reproducibility and version control |

89| `--append-system-prompt` | **Appends** to default prompt | Interactive + Print | Add specific instructions while keeping default Claude Code behavior |120| `--append-system-prompt` | **Appends** to default prompt | Interactive + Print | Add specific instructions while keeping default Claude Code behavior |

121| `--append-system-prompt-file` | **Appends** file contents to default prompt | Print only | Load additional instructions from files while keeping defaults |

90 122 

91**When to use each:**123**When to use each:**

92 124 


105 claude --append-system-prompt "Always use TypeScript and include JSDoc comments"137 claude --append-system-prompt "Always use TypeScript and include JSDoc comments"

106 ```138 ```

107 139 

108<Note>140* **`--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.

109 `--system-prompt` and `--system-prompt-file` are mutually exclusive. You cannot use both flags simultaneously.141 ```bash theme={null}

110</Note>142 claude -p --append-system-prompt-file ./prompts/style-rules.txt "Review this PR"

143 ```

111 144 

112<Tip>145`--system-prompt` and `--system-prompt-file` are mutually exclusive. The append flags can be used together with either replacement flag.

113 For most use cases, `--append-system-prompt` is recommended as it preserves 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.

114</Tip>

115 146 

116For detailed information about print mode (`-p`) including output formats,147For 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.

117streaming, verbose logging, and programmatic usage, see the

118[SDK documentation](https://docs.claude.com/en/docs/agent-sdk).

119 148 

120## See also149## See also

121 150 

151* [Chrome extension](/en/chrome) - Browser automation and web testing

122* [Interactive mode](/en/interactive-mode) - Shortcuts, input modes, and interactive features152* [Interactive mode](/en/interactive-mode) - Shortcuts, input modes, and interactive features

123* [Slash commands](/en/slash-commands) - Interactive session commands

124* [Quickstart guide](/en/quickstart) - Getting started with Claude Code153* [Quickstart guide](/en/quickstart) - Getting started with Claude Code

125* [Common workflows](/en/common-workflows) - Advanced workflows and patterns154* [Common workflows](/en/common-workflows) - Advanced workflows and patterns

126* [Settings](/en/settings) - Configuration options155* [Settings](/en/settings) - Configuration options

127* [SDK documentation](https://docs.claude.com/en/docs/agent-sdk) - Programmatic usage and integrations156* [Agent SDK documentation](https://platform.claude.com/docs/en/agent-sdk/overview) - Programmatic usage and integrations

common-workflows.md +141 −223

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 


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/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}


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***


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)

511 

512[Extended thinking](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) is enabled by default, reserving a portion of the output token budget (up to 31,999 tokens) for Claude to reason through complex problems step-by-step. This reasoning is visible in verbose mode, which you can toggle on with `Ctrl+O`.

507 513 

508Suppose you're working on complex architectural decisions, challenging bugs, or planning multi-step implementations that require deep reasoning.514Extended thinking is particularly valuable for complex architectural decisions, challenging bugs, multi-step implementation planning, and evaluating tradeoffs between different approaches. It provides more space for exploring multiple solutions, analyzing edge cases, and self-correcting mistakes.

509 515 

510<Note>516<Note>

511 [Extended thinking](https://docs.claude.com/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/settings#environment-variables) in your settings.517 Phrases like "think", "think hard", "ultrathink", and "think more" are interpreted as regular prompt instructions and don't allocate thinking tokens.

512</Note>518</Note>

513 519 

514<Steps>520### Configure thinking mode

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 521 

520 Claude will gather relevant information from your codebase and522Thinking is enabled by default, but you can adjust or disable it.

521 use extended thinking, which will be visible in the interface.

522 </Step>

523 523 

524 <Step title="Refine the thinking with follow-up prompts">524| Scope | How to configure | Details |

525 ```525| ---------------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |

526 > think about potential security vulnerabilities in this approach 526| **Toggle shortcut** | Press `Option+T` (macOS) or `Alt+T` (Windows/Linux) | Toggle thinking on/off for the current session. May require [terminal configuration](/en/terminal-config) to enable Option key shortcuts |

527 ```527| **Global default** | Use `/config` to toggle thinking mode | Sets your default across all projects.<br />Saved as `alwaysThinkingEnabled` in `~/.claude/settings.json` |

528| **Limit token budget** | Set [`MAX_THINKING_TOKENS`](/en/settings#environment-variables) environment variable | Limit the thinking budget to a specific number of tokens. Example: `export MAX_THINKING_TOKENS=10000` |

528 529 

529 ```530To view Claude's thinking process, press `Ctrl+O` to toggle verbose mode and see the internal reasoning displayed as gray italic text.

530 > think hard about edge cases we should handle

531 ```

532 </Step>

533</Steps>

534 531 

535<Tip>532### How extended thinking token budgets work

536 Tips to get the most value out of extended thinking:

537 533 

538 [Extended thinking](https://docs.claude.com/en/docs/build-with-claude/extended-thinking) is most valuable for complex tasks such as:534Extended thinking uses a **token budget** that controls how much internal reasoning Claude can perform before responding.

539 535 

540 * Planning complex architectural changes536A larger thinking token budget provides:

541 * Debugging intricate issues

542 * Creating implementation plans for new features

543 * Understanding complex codebases

544 * Evaluating tradeoffs between different approaches

545 537 

546 Use `Tab` to toggle Thinking on and off during a session.538* More space to explore multiple solution approaches step-by-step

539* Room to analyze edge cases and evaluate tradeoffs thoroughly

540* Ability to revise reasoning and self-correct mistakes

547 541 

548 The way you prompt for thinking results in varying levels of thinking depth:542Token budgets for thinking mode:

549 543 

550 * "think" triggers basic extended thinking544* When thinking is **enabled**, Claude can use up to **31,999 tokens** from your output budget for internal reasoning

551 * intensifying phrases such as "keep hard", "think more", "think a lot", or "think longer" triggers deeper thinking545* When thinking is **disabled** (via toggle or `/config`), Claude uses **0 tokens** for thinking

552 546 

553 For more extended thinking prompting tips, see [Extended thinking tips](https://docs.claude.com/en/docs/build-with-claude/prompt-engineering/extended-thinking-tips).547**Limit the thinking budget:**

554</Tip>

555 548 

556<Note>549* Use the [`MAX_THINKING_TOKENS` environment variable](/en/settings#environment-variables) to cap the thinking budget

557 Claude will display its thinking process as italic gray text above the550* When set, this value limits the maximum tokens Claude can use for thinking

558 response.551* See the [extended thinking documentation](https://docs.claude.com/en/docs/build-with-claude/extended-thinking) for valid token ranges

559</Note>552 

553<Warning>

554 You're charged for all thinking tokens used, even though Claude 4 models show summarized thinking

555</Warning>

560 556 

561***557***

562 558 

563## Resume previous conversations559## Resume previous conversations

564 560 

565Suppose you've been working on a task with Claude Code and need to continue where you left off in a later session.561When starting Claude Code, you can resume a previous session:

562 

563* `claude --continue` continues the most recent conversation in the current directory

564* `claude --resume` opens a conversation picker or resumes by name

565* `claude --from-pr 123` resumes sessions linked to a specific pull request

566 

567From inside an active session, use `/resume` to switch to a different conversation.

568 

569Sessions are stored per project directory. The `/resume` picker shows sessions from the same git repository, including worktrees.

566 570 

567Claude Code provides two options for resuming previous conversations:571### Name your sessions

568 572 

569* `--continue` to automatically continue the most recent conversation573Give sessions descriptive names to find them later. This is a best practice when working on multiple tasks or features.

570* `--resume` to display a conversation picker

571 574 

572<Steps>575<Steps>

573 <Step title="Continue the most recent conversation">576 <Step title="Name the current session">

574 ```bash theme={null}577 Use `/rename` during a session to give it a memorable name:

575 claude --continue578 

579 ```

580 > /rename auth-refactor

576 ```581 ```

577 582 

578 This immediately resumes your most recent conversation without any prompts.583 You can also rename any session from the picker: run `/resume`, navigate to a session, and press `R`.

579 </Step>584 </Step>

580 585 

581 <Step title="Continue in non-interactive mode">586 <Step title="Resume by name later">

587 From the command line:

588 

582 ```bash theme={null}589 ```bash theme={null}

583 claude --continue --print "Continue with my task"590 claude --resume auth-refactor

584 ```591 ```

585 592 

586 Use `--print` with `--continue` to resume the most recent conversation in non-interactive mode, perfect for scripts or automation.593 Or from inside an active session:

587 </Step>

588 594 

589 <Step title="Show conversation picker">

590 ```bash theme={null}

591 claude --resume

592 ```595 ```

596 > /resume auth-refactor

597 ```

598 </Step>

599</Steps>

593 600 

594 This displays an interactive conversation selector with a clean list view showing:601### Use the session picker

595 602 

596 * Session summary (or initial prompt)603The `/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 604 

599 Use arrow keys to navigate and press Enter to select a conversation. Press Esc to exit.605**Keyboard shortcuts in the picker:**

600 </Step>606 

601</Steps>607| Shortcut | Action |

608| :-------- | :------------------------------------------------ |

609| `↑` / `↓` | Navigate between sessions |

610| `→` / `←` | Expand or collapse grouped sessions |

611| `Enter` | Select and resume the highlighted session |

612| `P` | Preview the session content |

613| `R` | Rename the highlighted session |

614| `/` | Search to filter sessions |

615| `A` | Toggle between current directory and all projects |

616| `B` | Filter to sessions from your current git branch |

617| `Esc` | Exit the picker or search mode |

618 

619**Session organization:**

620 

621The picker displays sessions with helpful metadata:

622 

623* Session name or initial prompt

624* Time elapsed since last activity

625* Message count

626* Git branch (if applicable)

627 

628Forked sessions (created with `/rewind` or `--fork-session`) are grouped together under their root session, making it easier to find related conversations.

602 629 

603<Tip>630<Tip>

604 Tips:631 Tips:

605 632 

606 * Conversation history is stored locally on your machine633 * **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 conversation634 * 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 conversation635 * Use `--resume session-name` when you know which session you need

609 * When resuming, you'll see the entire conversation history before continuing636 * Use `--resume` (without a name) when you need to browse and select

637 * For scripts, use `claude --continue --print "prompt"` to resume in non-interactive mode

638 * 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 original639 * The resumed conversation starts with the same model and configuration as the original

611 640 

612 How it works:641 How it works:


615 2. **Message Deserialization**: When resuming, the entire message history is restored to maintain context644 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 preserved645 3. **Tool State**: Tool usage and results from the previous conversation are preserved

617 4. **Context Restoration**: The conversation resumes with all previous context intact646 4. **Context Restoration**: The conversation resumes with all previous context intact

618 

619 Examples:

620 

621 ```bash theme={null}

622 # Continue most recent conversation

623 claude --continue

624 

625 # Continue most recent conversation with a specific prompt

626 claude --continue --print "Show me our progress"

627 

628 # Show conversation picker

629 claude --resume

630 

631 # Continue most recent conversation in non-interactive mode

632 claude --continue --print "Run the tests again"

633 ```

634</Tip>647</Tip>

635 648 

636***649***


789 802 

790***803***

791 804 

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/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 capabilities805## Ask Claude about its capabilities

902 806 

903Claude has built-in access to its documentation and can answer questions about its own features and limitations.807Claude has built-in access to its documentation and can answer questions about its own features and limitations.


913```817```

914 818 

915```819```

916> what slash commands are available?820> what skills are available?

917```821```

918 822 

919```823```


944 848 

945## Next steps849## Next steps

946 850 

947<Card title="Claude Code reference implementation" icon="code" href="https://github.com/anthropics/claude-code/tree/main/.devcontainer">851<CardGroup cols={2}>

948 Clone our development container reference implementation.852 <Card title="Best practices" icon="lightbulb" href="/en/best-practices">

949</Card>853 Patterns for getting the most out of Claude Code

854 </Card>

855 

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

857 Understand the agentic loop and context management

858 </Card>

859 

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

861 Add skills, hooks, MCP, subagents, and plugins

862 </Card>

863 

864 <Card title="Reference implementation" icon="code" href="https://github.com/anthropics/claude-code/tree/main/.devcontainer">

865 Clone our development container reference implementation

866 </Card>

867</CardGroup>

costs.md +111 −56

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.

4 8 

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.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.

6 10 

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.11For 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.

8 12 

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).

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 we have not audited its 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/third-party-integrations#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 


60 62 

61## Reduce token usage63## Reduce token usage

62 64 

63* **Compact conversations:**65Token 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 66 

65 * Claude uses auto-compact by default when context exceeds 95% capacity67The 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 68 

71 ```markdown theme={null}69### Manage context proactively

72 # Summary instructions

73 70 

74 When you are using compact, please focus on test output and code changes71Use `/cost` to check your current token usage, or [configure your status line](/en/statusline#context-window-usage) to display it continuously.

75 ```

76 72 

77* **Write specific queries:** Avoid vague requests that trigger unnecessary scanning73* **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.

74* **Add custom compaction instructions**: `/compact Focus on code samples and API usage` tells Claude what to preserve during summarization.

78 75 

79* **Break down complex tasks:** Split large tasks into focused interactions76You can also customize compaction behavior in your CLAUDE.md:

80 77 

81* **Clear history between tasks:** Use `/clear` to reset context78```markdown theme={null}

79# Compact instructions

82 80 

83Costs can vary significantly based on:81When you are using compact, please focus on test output and code changes

82```

84 83 

85* Size of codebase being analyzed84### 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 85 

91## Background token usage86Sonnet 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 87 

93Claude Code uses tokens for some background functionality even when idle:88### Reduce MCP server overhead

94 89 

95* **Conversation summarization**: Background jobs that summarize previous conversations for the `claude --resume` feature90Each 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 91 

98These background processes consume a small amount of tokens (typically under \$0.04 per session) even without active interaction.92* **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.

93* **Disable unused servers**: Run `/mcp` to see configured servers and disable any you're not actively using.

94* **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 95 

100## Tracking version changes and updates96### Install code intelligence plugins for typed languages

101 97 

102### Current version information98[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 99 

104To check your current Claude Code version and installation details:100### Offload processing to hooks and skills

105 101 

106```bash theme={null}102Custom [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 103 

110This command shows your version, installation type, and system information.104A [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 105 

112### Understanding changes in Claude Code behavior106For example, this PreToolUse hook filters test output to show only failures:

113 107 

114Claude Code regularly receives updates that may change how features work, including cost reporting:108<Tabs>

109 <Tab title="settings.json">

110 Add this to your [settings.json](/en/settings#settings-files) to run the hook before every Bash command:

115 111 

116* **Version tracking**: Use `claude doctor` to see your current version112 ```json theme={null}

117* **Behavior changes**: Features like `/cost` may display information differently across versions113 {

118* **Documentation access**: Claude always has access to the latest documentation, which can help explain current feature behavior114 "hooks": {

115 "PreToolUse": [

116 {

117 "matcher": "Bash",

118 "hooks": [

119 {

120 "type": "command",

121 "command": "~/.claude/hooks/filter-test-output.sh"

122 }

123 ]

124 }

125 ]

126 }

127 }

128 ```

129 </Tab>

130 

131 <Tab title="filter-test-output.sh">

132 The hook calls this script, which checks if the command is a test runner and modifies it to show only failures:

133 

134 ```bash theme={null}

135 #!/bin/bash

136 input=$(cat)

137 cmd=$(echo "$input" | jq -r '.tool_input.command')

138 

139 # If running tests, filter to show only failures

140 if [[ "$cmd" =~ ^(npm test|pytest|go test) ]]; then

141 filtered_cmd="$cmd 2>&1 | grep -A 5 -E '(FAIL|ERROR|error:)' | head -100"

142 echo "{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"allow\",\"updatedInput\":{\"command\":\"$filtered_cmd\"}}}"

143 else

144 echo "{}"

145 fi

146 ```

147 </Tab>

148</Tabs>

119 149 

120### When cost reporting changes150### Move instructions from CLAUDE.md to skills

121 151 

122If you notice changes in how costs are displayed (such as the `/cost` command showing different information):152Your [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 153 

1241. **Verify your version**: Run `claude doctor` to confirm your current version154### 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 155 

128<Note>156Extended 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 disabling it in `/config` or lowering the budget (for example, `MAX_THINKING_TOKENS=8000`).

129 For team deployments, we recommend starting with a small pilot group to157 

130 establish usage patterns before wider rollout.158### Delegate verbose operations to subagents

131</Note>159 

160Running 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.

161 

162### Write specific prompts

163 

164Vague 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.

165 

166### Work efficiently on complex tasks

167 

168For longer or more complex work, these habits help avoid wasted tokens from going down the wrong path:

169 

170* **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.

171* **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.

172* **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.

173* **Test incrementally**: Write one file, test it, then continue. This catches issues early when they're cheap to fix.

174 

175## Background token usage

176 

177Claude Code uses tokens for some background functionality even when idle:

178 

179* **Conversation summarization**: Background jobs that summarize previous conversations for the `claude --resume` feature

180* **Command processing**: Some commands like `/cost` may generate requests to check status

181 

182These background processes consume a small amount of tokens (typically under \$0.04 per session) even without active interaction.

183 

184## Understanding changes in Claude Code behavior

185 

186Claude 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 +28 −28

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.


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/claude-code/-YhHHmtSxwr7W8gy/images/claude-code-data-flow.png?fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=4672f138596e864633b4b7c7ae4ae812" 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/claude-code/-YhHHmtSxwr7W8gy/images/claude-code-data-flow.png?w=280&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=5d9bdaf7ea50fc38dc01bbde7b952835 280w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/claude-code-data-flow.png?w=560&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=525736e5860ac9f262de4b40c9c68a0e 560w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/claude-code-data-flow.png?w=840&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=5262f9d1a1d0cffb0d5944e49b2d72be 840w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/claude-code-data-flow.png?w=1100&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=ec74e6b2f87b667f6d0e2278c20944de 1100w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/claude-code-data-flow.png?w=1650&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=05f11b1d061b6ddbb69969d4e535547a 1650w, https://mintcdn.com/claude-code/-YhHHmtSxwr7W8gy/images/claude-code-data-flow.png?w=2500&fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=9b9cce0fb5989bd1d27f143825be73ff 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). 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/I9Dpo7RZuIbc86cX/images/claude-code-data-flow.svg?fit=max&auto=format&n=I9Dpo7RZuIbc86cX&q=85&s=9e77f476347e7c9983f6e211d27cf6a9" 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/I9Dpo7RZuIbc86cX/images/claude-code-data-flow.svg?w=280&fit=max&auto=format&n=I9Dpo7RZuIbc86cX&q=85&s=94c033b9b6db3d10b9e2d7c6d681d9dc 280w, https://mintcdn.com/claude-code/I9Dpo7RZuIbc86cX/images/claude-code-data-flow.svg?w=560&fit=max&auto=format&n=I9Dpo7RZuIbc86cX&q=85&s=430aaaf77c28c501d5753ffa456ee227 560w, https://mintcdn.com/claude-code/I9Dpo7RZuIbc86cX/images/claude-code-data-flow.svg?w=840&fit=max&auto=format&n=I9Dpo7RZuIbc86cX&q=85&s=63c3c3f160b522220a8291fe2f93f970 840w, https://mintcdn.com/claude-code/I9Dpo7RZuIbc86cX/images/claude-code-data-flow.svg?w=1100&fit=max&auto=format&n=I9Dpo7RZuIbc86cX&q=85&s=a7f6e838482f4a1a0a0b4683439369ea 1100w, https://mintcdn.com/claude-code/I9Dpo7RZuIbc86cX/images/claude-code-data-flow.svg?w=1650&fit=max&auto=format&n=I9Dpo7RZuIbc86cX&q=85&s=5fbf749c2f94babb3ef72edfb7aba1e9 1650w, https://mintcdn.com/claude-code/I9Dpo7RZuIbc86cX/images/claude-code-data-flow.svg?w=2500&fit=max&auto=format&n=I9Dpo7RZuIbc86cX&q=85&s=7a1babbdccc4986957698d9c5c30c4a8 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/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/security#cloud-execution-security).75For security details about cloud execution, see [Security](/en/security#cloud-execution-security).

77 76 


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/settings)).96All environment variables can be checked into `settings.json` ([read more](/en/settings)).

desktop.md +265 −39

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 desktop5# Claude Code on desktop

2 6 

3> Run Claude Code tasks locally or on secure cloud infrastructure with the Claude desktop app7> Run Claude Code tasks locally or on secure cloud infrastructure with the Claude desktop app

4 8 

5<img src="https://mintcdn.com/claude-code/zEGbGSbinVtT3BLw/images/desktop-interface.png?fit=max&auto=format&n=zEGbGSbinVtT3BLw&q=85&s=c4e9dc9737b437d36ab253b75a1cc595" alt="Claude Code on desktop interface" data-og-width="4132" width="4132" data-og-height="2620" height="2620" data-path="images/desktop-interface.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/zEGbGSbinVtT3BLw/images/desktop-interface.png?w=280&fit=max&auto=format&n=zEGbGSbinVtT3BLw&q=85&s=b1a8421a544c3e8c78679fa1a7b56190 280w, https://mintcdn.com/claude-code/zEGbGSbinVtT3BLw/images/desktop-interface.png?w=560&fit=max&auto=format&n=zEGbGSbinVtT3BLw&q=85&s=79cf4ea0923098cc429198678ea50903 560w, https://mintcdn.com/claude-code/zEGbGSbinVtT3BLw/images/desktop-interface.png?w=840&fit=max&auto=format&n=zEGbGSbinVtT3BLw&q=85&s=14bcbcd569d179770fe656686ffbf6bf 840w, https://mintcdn.com/claude-code/zEGbGSbinVtT3BLw/images/desktop-interface.png?w=1100&fit=max&auto=format&n=zEGbGSbinVtT3BLw&q=85&s=b873274db1e9ff8585ba545032aa24a5 1100w, https://mintcdn.com/claude-code/zEGbGSbinVtT3BLw/images/desktop-interface.png?w=1650&fit=max&auto=format&n=zEGbGSbinVtT3BLw&q=85&s=25553dced783c3a8c2a1134a53295f7e 1650w, https://mintcdn.com/claude-code/zEGbGSbinVtT3BLw/images/desktop-interface.png?w=2500&fit=max&auto=format&n=zEGbGSbinVtT3BLw&q=85&s=9ad49e6468c2f87b1895093deeea7bb2 2500w" />9<Note>

10 Claude Code on desktop is currently in preview.

11</Note>

12 

13Claude Code is an AI coding assistant that works directly with your codebase. Unlike Claude.ai chat, it can read your project files, edit code, run terminal commands, and understand how different parts of your code connect. You watch changes happen in real time.

14 

15You can use Claude Code through the terminal ([CLI](/en/quickstart)) or through the desktop app described here. Both provide the same core capabilities. The desktop app adds a graphical interface and visual session management.

16 

17<CardGroup cols={2}>

18 <Card title="New to Claude Code?" icon="rocket" href="#installation-and-setup">

19 Start here to install and make your first edit

20 </Card>

21 

22 <Card title="Coming from the CLI?" icon="terminal" href="#how-desktop-relates-to-cli">

23 See what's shared and what's different

24 </Card>

25</CardGroup>

26 

27The desktop app has three tabs:

28 

29* **Chat**: A conversational interface for general questions and tasks (like Claude.ai)

30* **Cowork**: An autonomous agent that works on tasks in the background

31* **Code**: An AI coding assistant that reads and edits your project files directly

32 

33This documentation covers the **Code** tab. For the chat interface, see the [Claude Desktop support articles](https://support.claude.com/en/collections/16163169-claude-desktop).

34 

35## Installation and setup

36 

37<Steps>

38 <Step title="Download the app">

39 Download Claude for your platform. You'll need an Anthropic account ([sign up at claude.ai](https://claude.ai) if you don't have one).

40 

41 <CardGroup cols={2}>

42 <Card title="macOS" icon="apple" href="https://claude.ai/api/desktop/darwin/universal/dmg/latest/redirect?utm_source=claude_code&utm_medium=docs">

43 Universal build for Intel and Apple Silicon

44 </Card>

45 

46 <Card title="Windows" icon="windows" href="https://claude.ai/api/desktop/win32/x64/exe/latest/redirect?utm_source=claude_code&utm_medium=docs">

47 For x64 processors

48 </Card>

49 </CardGroup>

50 

51 For Windows ARM64, [download here](https://claude.ai/api/desktop/win32/arm64/exe/latest/redirect?utm_source=claude_code\&utm_medium=docs). Local sessions are not available on ARM64 devices, so use remote sessions instead.

52 

53 Linux is not currently supported.

54 </Step>

55 

56 <Step title="Open the app and sign in">

57 Launch Claude from your Applications folder (macOS) or Start menu (Windows). Sign in with your Anthropic account.

58 </Step>

59 

60 <Step title="Select the Code tab">

61 Click the **Code** tab in the top left. If clicking Code prompts you to sign in online, complete the sign-in and restart the app.

62 </Step>

63</Steps>

64 

65## Getting started

66 

67If you already use the CLI, you can skip to [How Desktop relates to CLI](#how-desktop-relates-to-cli) for a quick overview of differences.

68 

69<Steps>

70 <Step title="Choose a folder and environment">

71 Select **Local** to run Claude on your machine using your files directly. This is the best choice for getting started. Click **Select folder** and choose your project directory.

72 

73 You can also run [remote sessions](/en/claude-code-on-the-web) that continue in the cloud even if you close the app.

74 </Step>

6 75 

7## Claude Code on desktop (Preview)76 <Step title="Start a session">

77 Type what you want Claude to do:

8 78 

9The Claude desktop app provides a native interface for running multiple Claude Code sessions on your local machine and seamless integration with Claude Code on the web.79 * "Find a TODO comment and fix it"

80 * "Add tests for the main function"

81 * "Create a CLAUDE.md with instructions for this codebase"

10 82 

11## Features83 A **session** 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.

84 </Step>

12 85 

13Claude Code on desktop provides:86 <Step title="Review and accept changes">

87 By default, Code is in **Ask** mode, where Claude proposes changes and waits for your approval before applying them. You'll see:

14 88 

15* **Parallel local sessions with `git` worktrees**: Run multiple Claude Code sessions simultaneously in the same repository, each with its own isolated `git` worktree89 1. **A diff view** showing exactly what will change in each file

16* **Include `.gitignored` files in your worktrees**: Automatically copy gitignored files like `.env` to new worktrees using `.worktreeinclude`90 2. **Accept/Reject buttons** to approve or decline each change

17* **Launch Claude Code on the web**: Kick off secure cloud sessions directly from the desktop app91 3. **Real-time updates** as Claude works through your request

18 92 

19## Installation93 If you reject a change, Claude will ask how you'd like to proceed differently. Your files aren't modified until you accept.

94 </Step>

95</Steps>

20 96 

21Download and install the Claude Desktop app from [claude.ai/download](https://claude.ai/download)97The sections below cover commands, permission modes, parallel sessions, and ways to extend Claude Code with custom workflows and integrations.

98 

99## What you can do

100 

101Claude Code can edit files, run terminal commands, and understand how your code connects. Try prompts like:

102 

103* `Fix the bug in the login function`

104* `Run the tests and fix any failures`

105* `How does the authentication flow work?`

106 

107You can rename, resume, and archive sessions through the sidebar.

108 

109### Choose a permission mode

110 

111Control how Claude works using the mode selector next to the send button:

112 

113* **Ask** (recommended for new users): Claude asks for your approval before each file edit or command. You see a diff view and can accept or reject each change.

114* **Code**: Claude auto-accepts file edits but still asks before running terminal commands. Use this when you trust file changes and want faster iteration.

115* **Plan**: Claude creates a detailed plan for your approval before making any changes. Good for complex tasks where you want to review the approach first.

116 

117To stop Claude mid-task, click the stop button.

118 

119Remote sessions only support **Code** and **Plan** modes because they continue running in the background without requiring your active participation. See [permission modes](/en/permissions#permission-modes) for details on how these work internally.

120 

121### Work in parallel with sessions

122 

123Click **+ 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 worktrees, so changes in one session don't affect another until you commit them. Worktrees are stored in `~/.claude-worktrees/` by default.

22 124 

23<Note>125<Note>

24 Local sessions are not available on Windows arm64 architectures.126 Session isolation requires [Git](https://git-scm.com/downloads). Without Git, sessions in the same directory edit the same files, so changes in one session are immediately visible in others.

25</Note>127</Note>

26 128 

27## Using Git worktrees129To include files listed in your `.gitignore` (like `.env`) in new worktrees, create a `.worktreeinclude` file in your project root listing the file patterns to copy.

130 

131To manage a session, click its dropdown in the sidebar to rename it, archive it, or check context usage. When context fills up, Claude automatically summarizes the conversation. You can also ask Claude to compact if you want to free up space earlier.

132 

133### Run long-running tasks remotely

134 

135For 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.

136 

137Remote sessions support **Code** and **Plan** modes. See [Claude Code on the web](/en/claude-code-on-the-web) for details on configuring remote environments.

138 

139### Review changes with diff view

140 

141After Claude makes changes to your code, the diff view lets you review modifications file by file before creating a pull request.

142 

143When Claude changes files, a diff stats indicator appears showing the number of lines added and removed (for example, `+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.

144 

145To comment on specific lines, click any line in the diff to open a comment box. Type your feedback and press **Enter** to send. In the full diff view, press **Enter** to accept each comment, then **Cmd+Enter** to send them all. Claude reads your comments and makes the requested changes, which appear as a new diff you can review.

146 

147## Extend Claude Code

148 

149You can extend Claude Code with custom commands, automated workflows, and external integrations.

150 

151### Connect external tools

28 152 

29Claude Code on desktop enables running multiple Claude Code sessions in the same repository using Git worktrees. Each session gets its own isolated worktree, allowing Claude to work on different tasks without conflicts. The default location for worktrees is `~/.claude-worktrees` but this can be configured in your settings on the Claude desktop app.153For local sessions, click the **...** button before starting and select **Connectors** to add integrations like Google Calendar, Slack, GitHub, Linear, Notion, and more. Connectors must be configured before the session starts and are only available for local sessions. Once 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.

154 

155Connectors are [MCP (Model Context Protocol) servers](/en/mcp) with built-in setup. You can also [create custom connectors](https://support.claude.com/en/articles/11175166-getting-started-with-custom-connectors-using-remote-mcp) or add MCP servers manually via [configuration files](/en/mcp#configure-mcp-servers).

156 

157### Create custom skills

158 

159[Skills](/en/skills) are reusable prompts that extend Claude's capabilities. For example, you could create a `review` skill that runs your standard code review checklist, or a `deploy` skill that walks through your deployment steps. Skills are defined as markdown files in `.claude/skills/` and can include instructions, context, and even call other tools. Ask Claude what skills are available or to run a specific skill. Claude can also help you create a skill if you describe what you want, or see [skills](/en/skills) to learn how to write them yourself.

160 

161### Automate workflows with hooks

162 

163[Hooks](/en/hooks) run shell commands automatically in response to Claude Code events. For example, you could run a linter after every file edit, auto-format code, or send notifications when tasks complete. Hooks are configured in your [settings files](/en/settings). See [hooks](/en/hooks) for available events and configuration examples.

164 

165## Environment configuration

166 

167When starting a session, you choose between **Local** (runs on your machine) or **Remote** (runs on Anthropic's cloud).

168 

169**Local sessions** inherit environment variables from your shell. If you need additional variables, set them in your shell profile (`~/.zshrc`, `~/.bashrc`) and restart the desktop app. See [environment variables](/en/settings#environment-variables) for the full list of supported variables.

170 

171[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. The thinking process runs in the background but isn't displayed in the Desktop interface. To disable it or adjust the budget, set `MAX_THINKING_TOKENS` in your shell profile (use `0` to disable).

172 

173**Remote sessions** run on Anthropic's cloud infrastructure and continue even if you close the app. Usage counts toward your subscription plan limits with no separate compute charges. See [Claude Code on the web](/en/claude-code-on-the-web) for details on configuring remote environments.

174 

175## How Desktop relates to CLI

176 

177If 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 (CLAUDE.md files).

178 

179### CLI flag equivalents

180 

181If you're used to CLI flags, the table below shows the Desktop equivalent for each. Some flags have no Desktop equivalent because they're designed for scripting or automation.

182 

183| CLI | Desktop equivalent |

184| ------------------------------------- | ---------------------------------------------- |

185| `--model sonnet` | **...** menu > Model (before starting session) |

186| `--resume`, `--continue` | Click a session in the sidebar |

187| `--allowedTools`, `--disallowedTools` | Not available in Desktop |

188| `--dangerously-skip-permissions` | Not available in Desktop |

189| `--print` | Not available (Desktop is interactive) |

190 

191### Shared configuration

192 

193Desktop and CLI read the same configuration files, so your setup carries over:

194 

195* **[CLAUDE.md](/en/memory)** and **CLAUDE.local.md** files in your project are used by both

196* **[MCP servers](/en/mcp)** configured in `~/.claude.json` or `.mcp.json` work in both

197* **[Hooks](/en/hooks)** and **[skills](/en/skills)** defined in settings apply to both

198* **[Settings](/en/settings)** in `~/.claude.json` and `~/.claude/settings.json` are shared

199* **Models** (Sonnet, Opus, Haiku) are available in both (Desktop requires selecting before starting a session)

30 200 

31<Note>201<Note>

32 If you start a local session in a folder that does not have Git initialized, the desktop app will not create a new worktree.202 MCP servers configured for the **Claude Desktop chat app** (in `claude_desktop_config.json`) are separate from Claude Code. To use MCP servers in Claude Code, configure them in `~/.claude.json` or your project's `.mcp.json` file. See [MCP configuration](/en/mcp#configure-mcp-servers) for details.

33</Note>203</Note>

34 204 

35### Copying files ignored with `.gitignore`205### What's different

36 206 

37When Claude Code creates a worktree, files ignored via `.gitignore` aren't automatically available. Including a `.worktreeinclude` file solves this by specifying which ignored files should be copied to new worktrees.207**Desktop adds:**

38 208 

39Create a `.worktreeinclude` file in your repository root:209* Graphical interface with visual session management

210* Built-in connectors for common integrations

211* Automatic session isolation for Git repositories (each session gets its own worktree)

40 212 

41```213**CLI adds:**

42.env214 

43.env.local215* [Third-party API providers](/en/third-party-integrations) (Bedrock, Vertex, Foundry). If you use these, continue using CLI for those projects.

44.env.*216* [CLI flags](/en/cli-reference) for scripting (`--print`, `--resume`, `--continue`)

45**/.claude/settings.local.json217* [Programmatic usage](/en/headless) via the Agent SDK

218 

219## Troubleshooting

220 

221Solutions to common issues with the Claude desktop app. For CLI issues, see [CLI troubleshooting](/en/troubleshooting).

222 

223### Check your version

224 

225To see which version of the desktop app you're running:

226 

227* **macOS**: Click **Claude** in the menu bar, then **About Claude**

228* **Windows**: Click **Help**, then **About**

229 

230Click the version number to copy it to your clipboard.

231 

232### "Branch doesn't exist yet" when opening in CLI

233 

234Remote 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:

235 

236```bash theme={null}

237git fetch origin <branch-name>

238git checkout <branch-name>

46```239```

47 240 

48The file uses `.gitignore`-style patterns. When a worktree is created, files matching these patterns that are also in your `.gitignore` will be copied from your main repository to the worktree.241### "Failed to load session" error

49 242 

50<Tip>243This error can occur for several reasons:

51 Only files that are both matched by `.worktreeinclude` AND listed in `.gitignore` are copied. This prevents accidentally duplicating tracked files.

52</Tip>

53 244 

54### Launch Claude Code on the web245* The selected folder no longer exists or is inaccessible

246* A Git repository requires Git LFS but it's not installed (see [Git LFS errors](#git-lfs-errors))

247* File permissions prevent access to the project directory

55 248 

56From the desktop app, you can kick off Claude Code sessions that run on Anthropic's secure cloud infrastructure. This is useful for:249Try selecting a different folder or restarting the desktop app.

57 250 

58To start a web session from desktop, select a remote environment when creating a new session.251### App won't quit

59 252 

60For more details, see [Claude Code on the web](/en/claude-code-on-the-web).253If the desktop app doesn't close properly:

61 254 

62## Bundled Claude Code version255* **macOS**: Press Cmd+Q. If the app doesn't respond, use Force Quit (Cmd+Option+Esc, select Claude, click Force Quit).

256* **Windows**: Use Task Manager (Ctrl+Shift+Esc) to end the Claude process.

63 257 

64Claude Code on desktop includes a bundled, stable version of Claude Code to ensure a consistent experience for all desktop users. The bundled version is required and downloaded on first launch even if a version of Claude Code exists on the computer. Desktop automatically manages version updates and cleans up old versions.258### Windows installation issues

65 259 

66<Note>260If the installer fails silently or doesn't complete properly:

67 The bundled Claude Code version in Desktop may differ from the latest CLI version. Desktop prioritizes stability while the CLI may have newer features.261 

68</Note>2621. **PATH not updated**: After installation, open a new terminal window. The PATH updates only apply to new terminal sessions.

2632. **Concurrent installation error**: If you see an error about another installation in progress but there isn't one, try running the installer as Administrator.

264 

265### Session not finding installed tools

266 

267If Claude can't find tools like `npm`, `node`, or other CLI commands:

268 

2691. Verify the tools work in your regular terminal

2702. Check that your shell profile (`~/.zshrc`, `~/.bashrc`) properly sets up PATH

2713. Restart the desktop app to reload environment variables

272 

273### MCP servers not working (Windows)

274 

275If MCP server toggles don't respond or servers fail to connect on Windows:

276 

2771. Check that the MCP server is properly configured in your settings

2782. Restart the desktop app after making changes

2793. Verify the MCP server process is running (check Task Manager)

2804. Review the server logs for connection errors

281 

282### Git LFS errors

283 

284If you see "Git LFS is required by this repository but is not installed," your repository uses Git Large File Storage for large binary files. Install Git LFS before opening this repository:

285 

2861. Install Git LFS from [git-lfs.com](https://git-lfs.com/)

2872. Run `git lfs install` in your terminal

2883. Restart the desktop app

289 

290## Enterprise configuration

291 

292Organizations can disable local Claude Code use in the desktop application with the `isClaudeCodeForDesktopEnabled` [enterprise policy option](https://support.claude.com/en/articles/12622667-enterprise-configuration#h_003283c7cb). Additionally, Claude Code on the web can be disabled in your [admin settings](https://claude.ai/admin-settings/claude-code).

69 293 

70## Related resources294## Related resources

71 295 

72* [Claude Code on the web](/en/claude-code-on-the-web)296* [Claude Code on the web](/en/claude-code-on-the-web): Run remote sessions that continue in the cloud

73* [Claude Desktop support articles](https://support.claude.com/en/collections/16163169-claude-desktop)297* [CLI reference](/en/cli-reference): Use Claude Code in your terminal with flags and scripting

74* [Common workflows](/en/common-workflows)298* [Common workflows](/en/common-workflows): Tutorials for debugging, refactoring, testing, and more

75* [Settings reference](/en/settings)299* [Settings reference](/en/settings): Configure Claude Code behavior with settings files

300* [Claude Desktop support](https://support.claude.com/en/collections/16163169-claude-desktop): Help articles for the Chat tab and general desktop app usage

301* [Enterprise configuration](https://support.claude.com/en/articles/12622667-enterprise-configuration): Admin policies for organizational deployments

devcontainer.md +5 −1

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>

discover-plugins.md +393 −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 

359For full configuration options including `extraKnownMarketplaces` and `enabledPlugins`, see [Plugin settings](/en/settings#plugin-settings).

360 

361## Troubleshooting

362 

363### /plugin command not recognized

364 

365If you see "unknown command" or the `/plugin` command doesn't appear:

366 

3671. **Check your version**: Run `claude --version`. Plugins require version 1.0.33 or later.

3682. **Update Claude Code**:

369 * **Homebrew**: `brew upgrade claude-code`

370 * **npm**: `npm update -g @anthropic-ai/claude-code`

371 * **Native installer**: Re-run the install command from [Setup](/en/setup)

3723. **Restart Claude Code**: After updating, restart your terminal and run `claude` again.

373 

374### Common issues

375 

376* **Marketplace not loading**: Verify the URL is accessible and that `.claude-plugin/marketplace.json` exists at the path

377* **Plugin installation failures**: Check that plugin source URLs are accessible and repositories are public (or you have access)

378* **Files not found after installation**: Plugins are copied to a cache, so paths referencing files outside the plugin directory won't work

379* **Plugin skills not appearing**: Clear the cache with `rm -rf ~/.claude/plugins/cache`, restart Claude Code, and reinstall the plugin.

380 

381For 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).

382 

383### Code intelligence issues

384 

385* **Language server not starting**: verify the binary is installed and available in your `$PATH`. Check the `/plugin` Errors tab for details.

386* **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.

387* **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.

388 

389## Next steps

390 

391* **Build your own plugins**: See [Plugins](/en/plugins) to create skills, agents, and hooks

392* **Create a marketplace**: See [Create a plugin marketplace](/en/plugin-marketplaces) to distribute plugins to your team or community

393* **Technical reference**: See [Plugins reference](/en/plugins-reference) for complete specifications

features-overview.md +247 −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* **[Hooks](/en/hooks)** run outside the loop entirely as deterministic scripts

26* **[Plugins](/en/plugins)** and **[marketplaces](/en/plugin-marketplaces)** package and distribute these features

27 

28[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.

29 

30## Match features to your goal

31 

32Features 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.

33 

34| Feature | What it does | When to use it | Example |

35| ------------- | ---------------------------------------------------------- | ------------------------------------------------------ | -------------------------------------------------------------------------------- |

36| **CLAUDE.md** | Persistent context loaded every conversation | Project conventions, "always do X" rules | "Use pnpm, not npm. Run tests before committing." |

37| **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 |

38| **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 |

39| **MCP** | Connect to external services | External data or actions | Query your database, post to Slack, control a browser |

40| **Hook** | Deterministic script that runs on events | Predictable automation, no LLM involved | Run ESLint after every file edit |

41 

42**[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)**.

43 

44### Compare similar features

45 

46Some features can seem similar. Here's how to tell them apart.

47 

48<Tabs>

49 <Tab title="Skill vs Subagent">

50 Skills and subagents solve different problems:

51 

52 * **Skills** are reusable content you can load into any context

53 * **Subagents** are isolated workers that run separately from your main conversation

54 

55 | Aspect | Skill | Subagent |

56 | --------------- | ---------------------------------------------- | ---------------------------------------------------------------- |

57 | **What it is** | Reusable instructions, knowledge, or workflows | Isolated worker with its own context |

58 | **Key benefit** | Share content across contexts | Context isolation. Work happens separately, only summary returns |

59 | **Best for** | Reference material, invocable workflows | Tasks that read many files, parallel work, specialized workers |

60 

61 **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).

62 

63 **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.

64 

65 **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.

66 </Tab>

67 

68 <Tab title="CLAUDE.md vs Skill">

69 Both store instructions, but they load differently and serve different purposes.

70 

71 | Aspect | CLAUDE.md | Skill |

72 | ------------------------- | ---------------------------- | --------------------------------------- |

73 | **Loads** | Every session, automatically | On demand |

74 | **Can include files** | Yes, with `@path` imports | Yes, with `@path` imports |

75 | **Can trigger workflows** | No | Yes, with `/<name>` |

76 | **Best for** | "Always do X" rules | Reference material, invocable workflows |

77 

78 **Put it in CLAUDE.md** if Claude should always know it: coding conventions, build commands, project structure, "never do X" rules.

79 

80 **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).

81 

82 **Rule of thumb:** Keep CLAUDE.md under \~500 lines. If it's growing, move reference content to skills.

83 </Tab>

84 

85 <Tab title="MCP vs Skill">

86 MCP connects Claude to external services. Skills extend what Claude knows, including how to use those services effectively.

87 

88 | Aspect | MCP | Skill |

89 | -------------- | ---------------------------------------------------- | ------------------------------------------------------- |

90 | **What it is** | Protocol for connecting to external services | Knowledge, workflows, and reference material |

91 | **Provides** | Tools and data access | Knowledge, workflows, reference material |

92 | **Examples** | Slack integration, database queries, browser control | Code review checklist, deploy workflow, API style guide |

93 

94 These solve different problems and work well together:

95 

96 **MCP** gives Claude the ability to interact with external systems. Without MCP, Claude can't query your database or post to Slack.

97 

98 **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.

99 

100 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.

101 </Tab>

102</Tabs>

103 

104### Understand how features layer

105 

106Features 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:

107 

108* **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).

109* **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).

110* **MCP servers** override by name: local > project > user. See [MCP scope](/en/mcp#scope-hierarchy-and-precedence).

111* **Hooks** merge: all registered hooks fire for their matching events regardless of source. See [hooks](/en/hooks).

112 

113### Combine features

114 

115Each 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.

116 

117For 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.

118 

119| Pattern | How it works | Example |

120| ---------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |

121| **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 |

122| **Skill + Subagent** | A skill spawns subagents for parallel work | `/review` skill kicks off security, performance, and style subagents that work in isolated context |

123| **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 |

124| **Hook + MCP** | A hook triggers external actions through MCP | Post-edit hook sends a Slack notification when Claude modifies critical files |

125 

126## Understand context costs

127 

128Every 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.

129 

130### Context cost by feature

131 

132Each feature has a different loading strategy and context cost:

133 

134| Feature | When it loads | What loads | Context cost |

135| --------------- | ------------------------- | --------------------------------------------- | -------------------------------------------- |

136| **CLAUDE.md** | Session start | Full content | Every request |

137| **Skills** | Session start + when used | Descriptions at start, full content when used | Low (descriptions every request)\* |

138| **MCP servers** | Session start | All tool definitions and schemas | Every request |

139| **Subagents** | When spawned | Fresh context with specified skills | Isolated from main session |

140| **Hooks** | On trigger | Nothing (runs externally) | Zero, unless hook returns additional context |

141 

142\*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.

143 

144### Understand how features load

145 

146Each feature loads at different points in your session. The tabs below explain when each one loads and what goes into context.

147 

148<img src="https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/context-loading.svg?fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=bd2e24b8e6a99b31ecfffb63f5b23bf5" 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/ELkJZG54dIaeldDC/images/context-loading.svg?w=280&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=aebaadd1f484f285dd9cb4e0ea6d49b9 280w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/context-loading.svg?w=560&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=030c9b46126d750de315612560082727 560w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/context-loading.svg?w=840&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=6c73f8b0389da4f3190843140c810fe9 840w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/context-loading.svg?w=1100&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=9844c55d08d2c386672447f2e8518669 1100w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/context-loading.svg?w=1650&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=21a9522d0e4bd10ced146aab850ede76 1650w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/context-loading.svg?w=2500&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=d318525915aee1a1a6a4215cfaa61fb9 2500w" />

149 

150<Tabs>

151 <Tab title="CLAUDE.md">

152 **When:** Session start

153 

154 **What loads:** Full content of all CLAUDE.md files (managed, user, and project levels).

155 

156 **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.

157 

158 <Tip>Keep CLAUDE.md under \~500 lines. Move reference material to skills, which load on-demand.</Tip>

159 </Tab>

160 

161 <Tab title="Skills">

162 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.

163 

164 **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.

165 

166 **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.

167 

168 **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.

169 

170 **Context cost:** Low until used. User-only skills have zero cost until invoked.

171 

172 **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.

173 

174 <Tip>Use `disable-model-invocation: true` for skills with side effects. This saves context and ensures only you trigger them.</Tip>

175 </Tab>

176 

177 <Tab title="MCP servers">

178 **When:** Session start.

179 

180 **What loads:** All tool definitions and JSON schemas from connected servers.

181 

182 **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.

183 

184 **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`.

185 

186 <Tip>Run `/mcp` to see token costs per server. Disconnect servers you're not actively using.</Tip>

187 </Tab>

188 

189 <Tab title="Subagents">

190 **When:** On demand, when you or Claude spawns one for a task.

191 

192 **What loads:** Fresh, isolated context containing:

193 

194 * The system prompt (shared with parent for cache efficiency)

195 * Full content of skills listed in the agent's `skills:` field

196 * CLAUDE.md and git status (inherited from parent)

197 * Whatever context the lead agent passes in the prompt

198 

199 **Context cost:** Isolated from main session. Subagents don't inherit your conversation history or invoked skills.

200 

201 <Tip>Use subagents for work that doesn't need your full conversation context. Their isolation prevents bloating your main session.</Tip>

202 </Tab>

203 

204 <Tab title="Hooks">

205 **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.

206 

207 **What loads:** Nothing by default. Hooks run as external scripts.

208 

209 **Context cost:** Zero, unless the hook returns output that gets added as messages to your conversation.

210 

211 <Tip>Hooks are ideal for side effects (linting, logging) that don't need to affect Claude's context.</Tip>

212 </Tab>

213</Tabs>

214 

215## Learn more

216 

217Each feature has its own guide with setup instructions, examples, and configuration options.

218 

219<CardGroup cols={2}>

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

221 Store project context, conventions, and instructions

222 </Card>

223 

224 <Card title="Skills" icon="brain" href="/en/skills">

225 Give Claude domain expertise and reusable workflows

226 </Card>

227 

228 <Card title="Subagents" icon="users" href="/en/sub-agents">

229 Offload work to isolated context

230 </Card>

231 

232 <Card title="MCP" icon="plug" href="/en/mcp">

233 Connect Claude to external services

234 </Card>

235 

236 <Card title="Hooks" icon="bolt" href="/en/hooks-guide">

237 Automate workflows with hooks

238 </Card>

239 

240 <Card title="Plugins" icon="puzzle-piece" href="/en/plugins">

241 Bundle and share feature sets

242 </Card>

243 

244 <Card title="Marketplaces" icon="store" href="/en/plugin-marketplaces">

245 Host and distribute plugin collections

246 </Card>

247</CardGroup>

github-actions.md +18 −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# 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](https://docs.claude.com/en/docs/agent-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>


673. **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/`

68 72 

69<Tip>73<Tip>

70 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.

71 tagging `@claude` in an issue or PR comment!

72</Tip>75</Tip>

73 76 

74## Upgrading from Beta77## Upgrading from Beta


91### Breaking Changes Reference94### Breaking Changes Reference

92 95 

93| Old Beta Input | New v1.0 Input |96| Old Beta Input | New v1.0 Input |

94| --------------------- | -------------------------------- |97| --------------------- | ------------------------------------- |

95| `mode` | *(Removed - auto-detected)* |98| `mode` | *(Removed - auto-detected)* |

96| `direct_prompt` | `prompt` |99| `direct_prompt` | `prompt` |

97| `override_prompt` | `prompt` with GitHub variables |100| `override_prompt` | `prompt` with GitHub variables |

98| `custom_instructions` | `claude_args: --system-prompt` |101| `custom_instructions` | `claude_args: --append-system-prompt` |

99| `max_turns` | `claude_args: --max-turns` |102| `max_turns` | `claude_args: --max-turns` |

100| `model` | `claude_args: --model` |103| `model` | `claude_args: --model` |

101| `allowed_tools` | `claude_args: --allowedTools` |104| `allowed_tools` | `claude_args: --allowedTools` |


125 prompt: "Review this PR for security issues"128 prompt: "Review this PR for security issues"

126 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}129 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}

127 claude_args: |130 claude_args: |

128 --system-prompt "Follow our coding standards"131 --append-system-prompt "Follow our coding standards"

129 --max-turns 10132 --max-turns 10

130 --model claude-sonnet-4-5-20250929133 --model claude-sonnet-4-5-20250929

131```134```


157 # Responds to @claude mentions in comments160 # Responds to @claude mentions in comments

158```161```

159 162 

160### Using slash commands163### Using skills

161 164 

162```yaml theme={null}165```yaml theme={null}

163name: Code Review166name: Code Review


213 216 

214### Security considerations217### Security considerations

215 218 

216<Warning>Never commit API keys directly to your repository!</Warning>219<Warning>Never commit API keys directly to your repository.</Warning>

217 220 

218For 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).

219 222 


224* Limit action permissions to only what's necessary227* Limit action permissions to only what's necessary

225* Review Claude's suggestions before merging228* Review Claude's suggestions before merging

226 229 

227Always 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.

228 231 

229### Optimizing performance232### Optimizing performance

230 233 


267Key features:270Key features:

268 271 

269* **Unified prompt interface** - Use `prompt` for all instructions272* **Unified prompt interface** - Use `prompt` for all instructions

270* **Slash commands** - Pre-built prompts like `/review` or `/fix`273* **Commands** - Prebuilt prompts like `/review` or `/fix`

271* **CLI passthrough** - Any Claude Code CLI argument via `claude_args`274* **CLI passthrough** - Any Claude Code CLI argument via `claude_args`

272* **Flexible triggers** - Works with any GitHub event275* **Flexible triggers** - Works with any GitHub event

273 276 


625The Claude Code Action v1 uses a simplified configuration:628The Claude Code Action v1 uses a simplified configuration:

626 629 

627| Parameter | Description | Required |630| Parameter | Description | Required |

628| ------------------- | ----------------------------------------------- | -------- |631| ------------------- | ------------------------------------------------------ | -------- |

629| `prompt` | Instructions for Claude (text or slash command) | No\* |632| `prompt` | Instructions for Claude (text or skill like `/review`) | No\* |

630| `claude_args` | CLI arguments passed to Claude Code | No |633| `claude_args` | CLI arguments passed to Claude Code | No |

631| `anthropic_api_key` | Claude API key | Yes\*\* |634| `anthropic_api_key` | Claude API key | Yes\*\* |

632| `github_token` | GitHub token for API access | No |635| `github_token` | GitHub token for API access | No |


637\*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\

638\*\*Required for direct Claude API, not for Bedrock/Vertex641\*\*Required for direct Claude API, not for Bedrock/Vertex

639 642 

640#### Using claude\_args643#### Pass CLI arguments

641 644 

642The `claude_args` parameter accepts any Claude Code CLI arguments:645The `claude_args` parameter accepts any Claude Code CLI arguments:

643 646 


648Common arguments:651Common arguments:

649 652 

650* `--max-turns`: Maximum conversation turns (default: 10)653* `--max-turns`: Maximum conversation turns (default: 10)

651* `--model`: Model to use (e.g., `claude-sonnet-4-5-20250929`)654* `--model`: Model to use (for example, `claude-sonnet-4-5-20250929`)

652* `--mcp-config`: Path to MCP configuration655* `--mcp-config`: Path to MCP configuration

653* `--allowed-tools`: Comma-separated list of allowed tools656* `--allowed-tools`: Comma-separated list of allowed tools

654* `--debug`: Enable debug output657* `--debug`: Enable debug output

gitlab-ci-cd.md +16 −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# 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](https://docs.claude.com/en/docs/agent-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"


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](https://docs.claude.com/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.5)

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 


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.5)

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


82```86```

83 87 

84<Note>88<Note>

85 [Prompt caching](https://docs.claude.com/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.89 [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.

86</Note>90</Note>

87 91 

88<Note>92<Note>


99| Small/fast model | `claude-haiku-4-5@20251001` |103| Small/fast model | `claude-haiku-4-5@20251001` |

100 104 

101<Note>105<Note>

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`).106 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 (for example, `claude-haiku-4-5@20251001`).

103</Note>107</Note>

104 108 

105To customize models:109To customize models:


127 131 

128## 1M token context window132## 1M token context window

129 133 

130Claude Sonnet 4 and Sonnet 4.5 support the [1M token context window](https://docs.claude.com/en/docs/build-with-claude/context-windows#1m-token-context-window) on Vertex AI.134Claude Sonnet 4 and Sonnet 4.5 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 135 

132<Note>136<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.137 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/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/cli-reference) - Complete CLI documentation168 <Card title="GitLab CI/CD" icon="gitlab" href="/en/gitlab-ci-cd">

204* [Common workflows](/en/common-workflows) - Step-by-step guides for common use cases169 Use the Agent SDK in GitLab pipelines

170 </Card>

171</CardGroup>

hooks.md +1037 −711

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/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/settings):19<div style={{maxWidth: "500px", margin: "0 auto"}}>

20 <Frame>

21 <img src="https://mintcdn.com/claude-code/z2YM37Ycg6eMbID3/images/hooks-lifecycle.png?fit=max&auto=format&n=z2YM37Ycg6eMbID3&q=85&s=5c25fedbc3db6f8882af50c3cc478c32" alt="Hook lifecycle diagram showing the sequence of hooks from SessionStart through the agentic loop to SessionEnd" data-og-width="8876" width="8876" data-og-height="12492" height="12492" data-path="images/hooks-lifecycle.png" data-optimize="true" data-opv="3" srcset="https://mintcdn.com/claude-code/z2YM37Ycg6eMbID3/images/hooks-lifecycle.png?w=280&fit=max&auto=format&n=z2YM37Ycg6eMbID3&q=85&s=62406fcd5d4a189cc8842ee1bd946b84 280w, https://mintcdn.com/claude-code/z2YM37Ycg6eMbID3/images/hooks-lifecycle.png?w=560&fit=max&auto=format&n=z2YM37Ycg6eMbID3&q=85&s=fa3049022a6973c5f974e0f95b28169d 560w, https://mintcdn.com/claude-code/z2YM37Ycg6eMbID3/images/hooks-lifecycle.png?w=840&fit=max&auto=format&n=z2YM37Ycg6eMbID3&q=85&s=bd2890897db61a03160b93d4f972ff8e 840w, https://mintcdn.com/claude-code/z2YM37Ycg6eMbID3/images/hooks-lifecycle.png?w=1100&fit=max&auto=format&n=z2YM37Ycg6eMbID3&q=85&s=7ae8e098340479347135e39df4a13454 1100w, https://mintcdn.com/claude-code/z2YM37Ycg6eMbID3/images/hooks-lifecycle.png?w=1650&fit=max&auto=format&n=z2YM37Ycg6eMbID3&q=85&s=848a8606aab22c2ccaa16b6a18431e32 1650w, https://mintcdn.com/claude-code/z2YM37Ycg6eMbID3/images/hooks-lifecycle.png?w=2500&fit=max&auto=format&n=z2YM37Ycg6eMbID3&q=85&s=f3a9ef7feb61fa8fe362005aa185efbc 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| `PreCompact` | Before context compaction |

40| `SessionEnd` | When a session terminates |

19 41 

20Hooks are organized by matchers, where each matcher can have multiple hooks:42### How a hook resolves

43 

44To 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 45 

22```json theme={null}46```json theme={null}

23{47{

24 "hooks": {48 "hooks": {

25 "EventName": [49 "PreToolUse": [

26 {50 {

27 "matcher": "ToolPattern",51 "matcher": "Bash",

28 "hooks": [52 "hooks": [

29 {53 {

30 "type": "command",54 "type": "command",

31 "command": "your-command-here"55 "command": ".claude/hooks/block-rm.sh"

32 }56 }

33 ]57 ]

34 }58 }


37}61}

38```62```

39 63 

40* **matcher**: Pattern to match tool names, case-sensitive (only applicable for64The script reads the JSON input from stdin, extracts the command, and returns a `permissionDecision` of `"deny"` if it contains `rm -rf`:

41 `PreToolUse`, `PermissionRequest`, and `PostToolUse`)

42 * Simple strings match exactly: `Write` matches only the Write tool

43 * Supports regex: `Edit|Write` or `Notebook.*`

44 * Use `*` to match all tools. You can also use empty string (`""`) or leave

45 `matcher` blank.

46* **hooks**: Array of hooks to execute when the pattern matches

47 * `type`: Hook execution type - `"command"` for bash commands or `"prompt"` for LLM-based evaluation

48 * `command`: (For `type: "command"`) The bash command to execute (can use `$CLAUDE_PROJECT_DIR` environment variable)

49 * `prompt`: (For `type: "prompt"`) The prompt to send to the LLM for evaluation

50 * `timeout`: (Optional) How long a hook should run, in seconds, before canceling that specific hook

51 

52For events like `UserPromptSubmit`, `Stop`, and `SubagentStop`

53that don't use matchers, you can omit the matcher field:

54 65 

55```json theme={null}66```bash theme={null}

56{67#!/bin/bash

57 "hooks": {68# .claude/hooks/block-rm.sh

58 "UserPromptSubmit": [69COMMAND=$(jq -r '.tool_input.command')

59 {70 

60 "hooks": [71if echo "$COMMAND" | grep -q 'rm -rf'; then

61 {72 jq -n '{

62 "type": "command",73 hookSpecificOutput: {

63 "command": "/path/to/prompt-validator.py"74 hookEventName: "PreToolUse",

64 }75 permissionDecision: "deny",

65 ]76 permissionDecisionReason: "Destructive command blocked by hook"

66 }

67 ]

68 }77 }

69}78 }'

79else

80 exit 0 # allow the command

81fi

70```82```

71 83 

72### Project-Specific Hook Scripts84Now suppose Claude Code decides to run `Bash "rm -rf /tmp/build"`. Here's what happens:

73 85 

74You can use the environment variable `CLAUDE_PROJECT_DIR` (only available when86<Frame>

75Claude Code spawns the hook command) to reference scripts stored in your project,87 <img src="https://mintcdn.com/claude-code/s7NM0vfd_wres2nf/images/hook-resolution.svg?fit=max&auto=format&n=s7NM0vfd_wres2nf&q=85&s=7c13f51ffcbc37d22a593b27e2f2de72" 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/s7NM0vfd_wres2nf/images/hook-resolution.svg?w=280&fit=max&auto=format&n=s7NM0vfd_wres2nf&q=85&s=36a39a07e8bc1995dcb4639e09846905 280w, https://mintcdn.com/claude-code/s7NM0vfd_wres2nf/images/hook-resolution.svg?w=560&fit=max&auto=format&n=s7NM0vfd_wres2nf&q=85&s=6568d90c596c7605bbac2c325b0a0c86 560w, https://mintcdn.com/claude-code/s7NM0vfd_wres2nf/images/hook-resolution.svg?w=840&fit=max&auto=format&n=s7NM0vfd_wres2nf&q=85&s=255a6f68b9475a0e41dbde7b88002dad 840w, https://mintcdn.com/claude-code/s7NM0vfd_wres2nf/images/hook-resolution.svg?w=1100&fit=max&auto=format&n=s7NM0vfd_wres2nf&q=85&s=dcecf8d5edc88cd2bc49deb006d5760d 1100w, https://mintcdn.com/claude-code/s7NM0vfd_wres2nf/images/hook-resolution.svg?w=1650&fit=max&auto=format&n=s7NM0vfd_wres2nf&q=85&s=04fe51bf69ae375e9fd517f18674e35f 1650w, https://mintcdn.com/claude-code/s7NM0vfd_wres2nf/images/hook-resolution.svg?w=2500&fit=max&auto=format&n=s7NM0vfd_wres2nf&q=85&s=b1b76e0b77fddb5c7fa7bf302dacd80b 2500w" />

76ensuring they work regardless of Claude's current directory:88</Frame>

77 89 

78```json theme={null}90<Steps>

79{91 <Step title="Event fires">

80 "hooks": {92 The `PreToolUse` event fires. Claude Code sends the tool input as JSON on stdin to the hook:

81 "PostToolUse": [93 

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

83 "matcher": "Write|Edit",95 { "tool_name": "Bash", "tool_input": { "command": "rm -rf /tmp/build" }, ... }

84 "hooks": [96 ```

97 </Step>

98 

99 <Step title="Matcher checks">

100 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.

101 </Step>

102 

103 <Step title="Hook handler runs">

104 The script extracts `"rm -rf /tmp/build"` from the input and finds `rm -rf`, so it prints a decision to stdout:

105 

106 ```json theme={null}

85 {107 {

86 "type": "command",108 "hookSpecificOutput": {

87 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-style.sh"109 "hookEventName": "PreToolUse",

88 }110 "permissionDecision": "deny",

89 ]111 "permissionDecisionReason": "Destructive command blocked by hook"

90 }112 }

91 ]

92 }113 }

93}114 ```

94```115 

116 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.

117 </Step>

118 

119 <Step title="Claude Code acts on the result">

120 Claude Code reads the JSON decision, blocks the tool call, and shows Claude the reason.

121 </Step>

122</Steps>

123 

124The [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.

125 

126## Configuration

127 

128Hooks are defined in JSON settings files. The configuration has three levels of nesting:

129 

1301. Choose a [hook event](#hook-events) to respond to, like `PreToolUse` or `Stop`

1312. Add a [matcher group](#matcher-patterns) to filter when it fires, like "only for the Bash tool"

1323. Define one or more [hook handlers](#hook-handler-fields) to run when matched

95 133 

96### Plugin hooks134See [How a hook resolves](#how-a-hook-resolves) above for a complete walkthrough with an annotated example.

97 135 

98[Plugins](/en/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.136<Note>

137 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.

138</Note>

139 

140### Hook locations

141 

142Where you define a hook determines its scope:

143 

144| Location | Scope | Shareable |

145| :--------------------------------------------------------- | :---------------------------- | :--------------------------------- |

146| `~/.claude/settings.json` | All your projects | No, local to your machine |

147| `.claude/settings.json` | Single project | Yes, can be committed to the repo |

148| `.claude/settings.local.json` | Single project | No, gitignored |

149| Managed policy settings | Organization-wide | Yes, admin-controlled |

150| [Plugin](/en/plugins) `hooks/hooks.json` | When plugin is enabled | Yes, bundled with the plugin |

151| [Skill](/en/skills) or [agent](/en/sub-agents) frontmatter | While the component is active | Yes, defined in the component file |

152 

153For 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).

154 

155### Matcher patterns

156 

157The `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:

99 158 

100**How plugin hooks work**:159| Event | What the matcher filters | Example matcher values |

160| :--------------------------------------------------------------------- | :------------------------ | :----------------------------------------------------------------------------- |

161| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest` | tool name | `Bash`, `Edit\|Write`, `mcp__.*` |

162| `SessionStart` | how the session started | `startup`, `resume`, `clear`, `compact` |

163| `SessionEnd` | why the session ended | `clear`, `logout`, `prompt_input_exit`, `bypass_permissions_disabled`, `other` |

164| `Notification` | notification type | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog` |

165| `SubagentStart` | agent type | `Bash`, `Explore`, `Plan`, or custom agent names |

166| `PreCompact` | what triggered compaction | `manual`, `auto` |

167| `SubagentStop` | agent type | same values as `SubagentStart` |

168| `UserPromptSubmit`, `Stop` | no matcher support | always fires on every occurrence |

101 169 

102* 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.170The 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.

103* When a plugin is enabled, its hooks are merged with user and project hooks

104* Multiple hooks from different sources can respond to the same event

105* Plugin hooks use the `${CLAUDE_PLUGIN_ROOT}` environment variable to reference plugin files

106 171 

107**Example plugin hook configuration**:172This example runs a linting script only when Claude writes or edits a file:

108 173 

109```json theme={null}174```json theme={null}

110{175{

111 "description": "Automatic code formatting",

112 "hooks": {176 "hooks": {

113 "PostToolUse": [177 "PostToolUse": [

114 {178 {

115 "matcher": "Write|Edit",179 "matcher": "Edit|Write",

116 "hooks": [180 "hooks": [

117 {181 {

118 "type": "command",182 "type": "command",

119 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/format.sh",183 "command": "/path/to/lint-check.sh"

120 "timeout": 30

121 }184 }

122 ]185 ]

123 }186 }


126}189}

127```190```

128 191 

129<Note>192`UserPromptSubmit` and `Stop` don't support matchers and always fire on every occurrence. If you add a `matcher` field to these events, it is silently ignored.

130 Plugin hooks use the same format as regular hooks with an optional `description` field to explain the hook's purpose.

131</Note>

132 

133<Note>

134 Plugin hooks run alongside your custom hooks. If multiple hooks match an event, they all execute in parallel.

135</Note>

136 

137**Environment variables for plugins**:

138 193 

139* `${CLAUDE_PLUGIN_ROOT}`: Absolute path to the plugin directory194#### Match MCP tools

140* `${CLAUDE_PROJECT_DIR}`: Project root directory (same as for project hooks)

141* All standard environment variables are available

142 195 

143See the [plugin components reference](/en/plugins-reference#hooks) for details on creating plugin hooks.196[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.

144 197 

145## Prompt-Based Hooks198MCP tools follow the naming pattern `mcp__<server>__<tool>`, for example:

146 199 

147In 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. Prompt-based hooks are currently only supported for `Stop` and `SubagentStop` hooks, where they enable intelligent, context-aware decisions.200* `mcp__memory__create_entities`: Memory server's create entities tool

148 201* `mcp__filesystem__read_file`: Filesystem server's read file tool

149### How prompt-based hooks work202* `mcp__github__search_repositories`: GitHub server's search tool

150 203 

151Instead of executing a bash command, prompt-based hooks:204Use regex patterns to target specific MCP tools or groups of tools:

152 205 

1531. Send the hook input and your prompt to a fast LLM (Haiku)206* `mcp__memory__.*` matches all tools from the `memory` server

1542. The LLM responds with structured JSON containing a decision207* `mcp__.*__write.*` matches any tool containing "write" from any server

1553. Claude Code processes the decision automatically

156 208 

157### Configuration209This example logs all memory server operations and validates write operations from any MCP server:

158 210 

159```json theme={null}211```json theme={null}

160{212{

161 "hooks": {213 "hooks": {

162 "Stop": [214 "PreToolUse": [

163 {215 {

216 "matcher": "mcp__memory__.*",

164 "hooks": [217 "hooks": [

165 {218 {

166 "type": "prompt",219 "type": "command",

167 "prompt": "Evaluate if Claude should stop: $ARGUMENTS. Check if all tasks are complete."220 "command": "echo 'Memory operation initiated' >> ~/mcp-operations.log"

221 }

222 ]

223 },

224 {

225 "matcher": "mcp__.*__write.*",

226 "hooks": [

227 {

228 "type": "command",

229 "command": "/home/user/scripts/validate-mcp-write.py"

168 }230 }

169 ]231 ]

170 }232 }


173}235}

174```236```

175 237 

176**Fields:**238### Hook handler fields

177 239 

178* `type`: Must be `"prompt"`240Each 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:

179* `prompt`: The prompt text to send to the LLM

180 * Use `$ARGUMENTS` as a placeholder for the hook input JSON

181 * If `$ARGUMENTS` is not present, input JSON is appended to the prompt

182* `timeout`: (Optional) Timeout in seconds (default: 30 seconds)

183 241 

184### Response schema242* **[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.

243* **[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).

244* **[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).

185 245 

186The LLM must respond with JSON containing:246#### Common fields

187 247 

188```json theme={null}248These fields apply to all hook types:

189{

190 "decision": "approve" | "block",

191 "reason": "Explanation for the decision",

192 "continue": false, // Optional: stops Claude entirely

193 "stopReason": "Message shown to user", // Optional: custom stop message

194 "systemMessage": "Warning or context" // Optional: shown to user

195}

196```

197 249 

198**Response fields:**250| Field | Required | Description |

251| :-------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------- |

252| `type` | yes | `"command"`, `"prompt"`, or `"agent"` |

253| `timeout` | no | Seconds before canceling. Defaults: 600 for command, 30 for prompt, 60 for agent |

254| `statusMessage` | no | Custom spinner message displayed while the hook runs |

255| `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) |

199 256 

200* `decision`: `"approve"` allows the action, `"block"` prevents it257#### Command hook fields

201* `reason`: Explanation shown to Claude when decision is `"block"`

202* `continue`: (Optional) If `false`, stops Claude's execution entirely

203* `stopReason`: (Optional) Message shown when `continue` is false

204* `systemMessage`: (Optional) Additional message shown to the user

205 258 

206### Supported hook events259In addition to the [common fields](#common-fields), command hooks accept these fields:

207 260 

208Prompt-based hooks work with any hook event, but are most useful for:261| Field | Required | Description |

262| :-------- | :------- | :------------------------------------------------------------------------------------------------------------------ |

263| `command` | yes | Shell command to execute |

264| `async` | no | If `true`, runs in the background without blocking. See [Run hooks in the background](#run-hooks-in-the-background) |

209 265 

210* **Stop**: Intelligently decide if Claude should continue working266#### Prompt and agent hook fields

211* **SubagentStop**: Evaluate if a subagent has completed its task

212* **UserPromptSubmit**: Validate user prompts with LLM assistance

213* **PreToolUse**: Make context-aware permission decisions

214* **PermissionRequest**: Intelligently allow or deny permission dialogs

215 267 

216### Example: Intelligent Stop hook268In addition to the [common fields](#common-fields), prompt and agent hooks accept these fields:

217 269 

218```json theme={null}270| Field | Required | Description |

219{271| :------- | :------- | :------------------------------------------------------------------------------------------ |

272| `prompt` | yes | Prompt text to send to the model. Use `$ARGUMENTS` as a placeholder for the hook input JSON |

273| `model` | no | Model to use for evaluation. Defaults to a fast model |

274 

275All 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.

276 

277### Reference scripts by path

278 

279Use environment variables to reference hook scripts relative to the project or plugin root, regardless of the working directory when the hook runs:

280 

281* `$CLAUDE_PROJECT_DIR`: the project root. Wrap in quotes to handle paths with spaces.

282* `${CLAUDE_PLUGIN_ROOT}`: the plugin's root directory, for scripts bundled with a [plugin](/en/plugins).

283 

284<Tabs>

285 <Tab title="Project scripts">

286 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:

287 

288 ```json theme={null}

289 {

220 "hooks": {290 "hooks": {

221 "Stop": [291 "PostToolUse": [

222 {292 {

293 "matcher": "Write|Edit",

223 "hooks": [294 "hooks": [

224 {295 {

225 "type": "prompt",296 "type": "command",

226 "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: {\"decision\": \"approve\" or \"block\", \"reason\": \"your explanation\"}",297 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-style.sh"

227 "timeout": 30

228 }298 }

229 ]299 ]

230 }300 }

231 ]301 ]

232 }302 }

233}303 }

234```304 ```

305 </Tab>

235 306 

236### Example: SubagentStop with custom logic307 <Tab title="Plugin scripts">

308 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.

237 309 

238```json theme={null}310 This example runs a formatting script bundled with the plugin:

239{311 

312 ```json theme={null}

313 {

314 "description": "Automatic code formatting",

240 "hooks": {315 "hooks": {

241 "SubagentStop": [316 "PostToolUse": [

242 {317 {

318 "matcher": "Write|Edit",

243 "hooks": [319 "hooks": [

244 {320 {

245 "type": "prompt",321 "type": "command",

246 "prompt": "Evaluate if this subagent should stop. Input: $ARGUMENTS\n\nCheck if:\n- The subagent completed its assigned task\n- Any errors occurred that need fixing\n- Additional context gathering is needed\n\nReturn: {\"decision\": \"approve\" or \"block\", \"reason\": \"explanation\"}"322 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/format.sh",

323 "timeout": 30

247 }324 }

248 ]325 ]

249 }326 }

250 ]327 ]

251 }328 }

252}329 }

330 ```

331 

332 See the [plugin components reference](/en/plugins-reference#hooks) for details on creating plugin hooks.

333 </Tab>

334</Tabs>

335 

336### Hooks in skills and agents

337 

338In 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.

339 

340All hook events are supported. For subagents, `Stop` hooks are automatically converted to `SubagentStop` since that is the event that fires when a subagent completes.

341 

342Hooks use the same configuration format as settings-based hooks but are scoped to the component's lifetime and cleaned up when it finishes.

343 

344This skill defines a `PreToolUse` hook that runs a security validation script before each `Bash` command:

345 

346```yaml theme={null}

347---

348name: secure-operations

349description: Perform operations with security checks

350hooks:

351 PreToolUse:

352 - matcher: "Bash"

353 hooks:

354 - type: command

355 command: "./scripts/security-check.sh"

356---

253```357```

254 358 

255### Comparison with bash command hooks359Agents use the same format in their YAML frontmatter.

256 360 

257| Feature | Bash Command Hooks | Prompt-Based Hooks |361### The `/hooks` menu

258| --------------------- | ----------------------- | ------------------------------ |

259| **Execution** | Runs bash script | Queries LLM |

260| **Decision logic** | You implement in code | LLM evaluates context |

261| **Setup complexity** | Requires script file | Just configure prompt |

262| **Context awareness** | Limited to script logic | Natural language understanding |

263| **Performance** | Fast (local execution) | Slower (API call) |

264| **Use case** | Deterministic rules | Context-aware decisions |

265 362 

266### Best practices363Type `/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.

267 364 

268* **Be specific in prompts**: Clearly state what you want the LLM to evaluate365Each hook in the menu is labeled with a bracket prefix indicating its source:

269* **Include decision criteria**: List the factors the LLM should consider

270* **Test your prompts**: Verify the LLM makes correct decisions for your use cases

271* **Set appropriate timeouts**: Default is 30 seconds, adjust if needed

272* **Use for complex decisions**: Bash hooks are better for simple, deterministic rules

273 366 

274See the [plugin components reference](/en/plugins-reference#hooks) for details on creating plugin hooks.367* `[User]`: from `~/.claude/settings.json`

368* `[Project]`: from `.claude/settings.json`

369* `[Local]`: from `.claude/settings.local.json`

370* `[Plugin]`: from a plugin's `hooks/hooks.json`, read-only

275 371 

276## Hook Events372### Disable or remove hooks

277 373 

278### PreToolUse374To remove a hook, delete its entry from the settings JSON file, or use the `/hooks` menu and select the hook to delete it.

279 375 

280Runs after Claude creates tool parameters and before processing the tool call.376To 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.

281 377 

282**Common matchers:**378Direct 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.

283 379 

284* `Task` - Subagent tasks (see [subagents documentation](/en/sub-agents))380## Hook input and output

285* `Bash` - Shell commands

286* `Glob` - File pattern matching

287* `Grep` - Content search

288* `Read` - File reading

289* `Edit` - File editing

290* `Write` - File writing

291* `WebFetch`, `WebSearch` - Web operations

292 381 

293Use [PreToolUse decision control](#pretooluse-decision-control) to allow, deny, or ask for permission to use the tool.382Hooks 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.

294 383 

295### PermissionRequest384### Common input fields

296 385 

297Runs when the user is shown a permission dialog.386All hook events receive these fields via stdin as JSON, in addition to event-specific fields documented in each [hook event](#hook-events) section:

298Use [PermissionRequest decision control](#permissionrequest-decision-control) to allow or deny on behalf of the user.

299 387 

300Recognizes the same matcher values as PreToolUse.388| Field | Description |

389| :---------------- | :----------------------------------------------------------------------------------------------------------------------------------------- |

390| `session_id` | Current session identifier |

391| `transcript_path` | Path to conversation JSON |

392| `cwd` | Current working directory when the hook is invoked |

393| `permission_mode` | Current [permission mode](/en/permissions#permission-modes): `"default"`, `"plan"`, `"acceptEdits"`, `"dontAsk"`, or `"bypassPermissions"` |

394| `hook_event_name` | Name of the event that fired |

301 395 

302### PostToolUse396For example, a `PreToolUse` hook for a Bash command receives this on stdin:

303 397 

304Runs immediately after a tool completes successfully.398```json theme={null}

399{

400 "session_id": "abc123",

401 "transcript_path": "/home/user/.claude/projects/.../transcript.jsonl",

402 "cwd": "/home/user/my-project",

403 "permission_mode": "default",

404 "hook_event_name": "PreToolUse",

405 "tool_name": "Bash",

406 "tool_input": {

407 "command": "npm test"

408 }

409}

410```

305 411 

306Recognizes the same matcher values as PreToolUse.412The `tool_name` and `tool_input` fields are event-specific. Each [hook event](#hook-events) section documents the additional fields for that event.

307 413 

308### Notification414### Exit code output

415 

416The exit code from your hook command tells Claude Code whether the action should proceed, be blocked, or be ignored.

417 

418**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.

419 

420**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.

421 

422**Any other exit code** is a non-blocking error. stderr is shown in verbose mode (`Ctrl+O`) and execution continues.

423 

424For example, a hook command script that blocks dangerous Bash commands:

425 

426```bash theme={null}

427#!/bin/bash

428# Reads JSON input from stdin, checks the command

429command=$(jq -r '.tool_input.command' < /dev/stdin)

430 

431if [[ "$command" == rm* ]]; then

432 echo "Blocked: rm commands are not allowed" >&2

433 exit 2 # Blocking error: tool call is prevented

434fi

435 

436exit 0 # Success: tool call proceeds

437```

309 438 

310Runs when Claude Code sends notifications. Supports matchers to filter by notification type.439#### Exit code 2 behavior per event

311 440 

312**Common matchers:**441Exit 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.

313 442 

314* `permission_prompt` - Permission requests from Claude Code443| Hook event | Can block? | What happens on exit 2 |

315* `idle_prompt` - When Claude is waiting for user input (after 60+ seconds of idle time)444| :------------------- | :--------- | :-------------------------------------------------------- |

316* `auth_success` - Authentication success notifications445| `PreToolUse` | Yes | Blocks the tool call |

317* `elicitation_dialog` - When Claude Code needs input for MCP tool elicitation446| `PermissionRequest` | Yes | Denies the permission |

447| `UserPromptSubmit` | Yes | Blocks prompt processing and erases the prompt |

448| `Stop` | Yes | Prevents Claude from stopping, continues the conversation |

449| `SubagentStop` | Yes | Prevents the subagent from stopping |

450| `PostToolUse` | No | Shows stderr to Claude (tool already ran) |

451| `PostToolUseFailure` | No | Shows stderr to Claude (tool already failed) |

452| `Notification` | No | Shows stderr to user only |

453| `SubagentStart` | No | Shows stderr to user only |

454| `SessionStart` | No | Shows stderr to user only |

455| `SessionEnd` | No | Shows stderr to user only |

456| `PreCompact` | No | Shows stderr to user only |

318 457 

319You can use matchers to run different hooks for different notification types, or omit the matcher to run hooks for all notifications.458### JSON output

320 459 

321**Example: Different notifications for different types**460Exit 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.

461 

462<Note>

463 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.

464</Note>

465 

466Your 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.

467 

468The JSON object supports three kinds of fields:

469 

470* **Universal fields** like `continue` work across all events. These are listed in the table below.

471* **Top-level `decision` and `reason`** are used by some events to block or provide feedback.

472* **`hookSpecificOutput`** is a nested object for events that need richer control. It requires a `hookEventName` field set to the event name.

473 

474| Field | Default | Description |

475| :--------------- | :------ | :------------------------------------------------------------------------------------------------------------------------- |

476| `continue` | `true` | If `false`, Claude stops processing entirely after the hook runs. Takes precedence over any event-specific decision fields |

477| `stopReason` | none | Message shown to the user when `continue` is `false`. Not shown to Claude |

478| `suppressOutput` | `false` | If `true`, hides stdout from verbose mode output |

479| `systemMessage` | none | Warning message shown to the user |

480 

481To stop Claude entirely regardless of event type:

322 482 

323```json theme={null}483```json theme={null}

324{484{ "continue": false, "stopReason": "Build failed, fix errors before continuing" }

325 "hooks": {485```

326 "Notification": [486 

327 {487#### Decision control

328 "matcher": "permission_prompt",488 

329 "hooks": [489Not 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:

490 

491| Events | Decision pattern | Key fields |

492| :-------------------------------------------------------------------- | :------------------- | :---------------------------------------------------------------- |

493| UserPromptSubmit, PostToolUse, PostToolUseFailure, Stop, SubagentStop | Top-level `decision` | `decision: "block"`, `reason` |

494| PreToolUse | `hookSpecificOutput` | `permissionDecision` (allow/deny/ask), `permissionDecisionReason` |

495| PermissionRequest | `hookSpecificOutput` | `decision.behavior` (allow/deny) |

496 

497Here are examples of each pattern in action:

498 

499<Tabs>

500 <Tab title="Top-level decision">

501 Used by `UserPromptSubmit`, `PostToolUse`, `PostToolUseFailure`, `Stop`, and `SubagentStop`. The only value is `"block"` — to allow the action to proceed, omit `decision` from your JSON, or exit 0 without any JSON at all:

502 

503 ```json theme={null}

330 {504 {

331 "type": "command",505 "decision": "block",

332 "command": "/path/to/permission-alert.sh"506 "reason": "Test suite must pass before proceeding"

333 }507 }

334 ]508 ```

335 },509 </Tab>

510 

511 <Tab title="PreToolUse">

512 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.

513 

514 ```json theme={null}

336 {515 {

337 "matcher": "idle_prompt",516 "hookSpecificOutput": {

338 "hooks": [517 "hookEventName": "PreToolUse",

518 "permissionDecision": "deny",

519 "permissionDecisionReason": "Database writes are not allowed"

520 }

521 }

522 ```

523 </Tab>

524 

525 <Tab title="PermissionRequest">

526 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.

527 

528 ```json theme={null}

339 {529 {

340 "type": "command",530 "hookSpecificOutput": {

341 "command": "/path/to/idle-notification.sh"531 "hookEventName": "PermissionRequest",

532 "decision": {

533 "behavior": "allow",

534 "updatedInput": {

535 "command": "npm run lint"

342 }536 }

343 ]

344 }537 }

345 ]

346 }538 }

347}539 }

348```540 ```

541 </Tab>

542</Tabs>

349 543 

350### UserPromptSubmit544For 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).

351 545 

352Runs when the user submits a prompt, before Claude processes it. This allows you546## Hook events

353to add additional context based on the prompt/conversation, validate prompts, or

354block certain types of prompts.

355 547 

356### Stop548Each 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.

357 549 

358Runs when the main Claude Code agent has finished responding. Does not run if550### SessionStart

359the stoppage occurred due to a user interrupt.

360 551 

361### SubagentStop552Runs 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.

362 553 

363Runs when a Claude Code subagent (Task tool call) has finished responding.554SessionStart runs on every session, so keep these hooks fast.

364 555 

365### PreCompact556The matcher value corresponds to how the session was initiated:

366 557 

367Runs before Claude Code is about to run a compact operation.558| Matcher | When it fires |

559| :-------- | :------------------------------------- |

560| `startup` | New session |

561| `resume` | `--resume`, `--continue`, or `/resume` |

562| `clear` | `/clear` |

563| `compact` | Auto or manual compaction |

368 564 

369**Matchers:**565#### SessionStart input

370 566 

371* `manual` - Invoked from `/compact`567In 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.

372* `auto` - Invoked from auto-compact (due to full context window)

373 568 

374### SessionStart569```json theme={null}

570{

571 "session_id": "abc123",

572 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

573 "cwd": "/Users/...",

574 "permission_mode": "default",

575 "hook_event_name": "SessionStart",

576 "source": "startup",

577 "model": "claude-sonnet-4-5-20250929"

578}

579```

375 580 

376Runs when Claude Code starts a new session or resumes an existing session (which581#### SessionStart decision control

377currently does start a new session under the hood). Useful for loading in

378development context like existing issues or recent changes to your codebase, installing dependencies, or setting up environment variables.

379 582 

380**Matchers:**583Any 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:

381 584 

382* `startup` - Invoked from startup585| Field | Description |

383* `resume` - Invoked from `--resume`, `--continue`, or `/resume`586| :------------------ | :------------------------------------------------------------------------ |

384* `clear` - Invoked from `/clear`587| `additionalContext` | String added to Claude's context. Multiple hooks' values are concatenated |

385* `compact` - Invoked from auto or manual compact.588 

589```json theme={null}

590{

591 "hookSpecificOutput": {

592 "hookEventName": "SessionStart",

593 "additionalContext": "My additional context here"

594 }

595}

596```

386 597 

387#### Persisting environment variables598#### Persist environment variables

388 599 

389SessionStart 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.600SessionStart 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.

390 601 

391**Example: Setting individual environment variables**602To set individual environment variables, write `export` statements to `CLAUDE_ENV_FILE`. Use append (`>>`) to preserve variables set by other hooks:

392 603 

393```bash theme={null}604```bash theme={null}

394#!/bin/bash605#!/bin/bash

395 606 

396if [ -n "$CLAUDE_ENV_FILE" ]; then607if [ -n "$CLAUDE_ENV_FILE" ]; then

397 echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"608 echo 'export NODE_ENV=production' >> "$CLAUDE_ENV_FILE"

398 echo 'export API_KEY=your-api-key' >> "$CLAUDE_ENV_FILE"609 echo 'export DEBUG_LOG=true' >> "$CLAUDE_ENV_FILE"

399 echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"610 echo 'export PATH="$PATH:./node_modules/.bin"' >> "$CLAUDE_ENV_FILE"

400fi611fi

401 612 

402exit 0613exit 0

403```614```

404 615 

405**Example: Persisting all environment changes from the hook**616To capture all environment changes from setup commands, compare the exported variables before and after:

406 

407When your setup modifies the environment (e.g., `nvm use`), capture and persist all changes by diffing the environment:

408 617 

409```bash theme={null}618```bash theme={null}

410#!/bin/bash619#!/bin/bash


423exit 0632exit 0

424```633```

425 634 

426Any variables written to this file will be available in all subsequent bash commands that Claude Code executes during the session.635Any variables written to this file will be available in all subsequent Bash commands that Claude Code executes during the session.

427 636 

428<Note>637<Note>

429 `CLAUDE_ENV_FILE` is only available for SessionStart hooks. Other hook types do not have access to this variable.638 `CLAUDE_ENV_FILE` is available for SessionStart hooks. Other hook types do not have access to this variable.

430</Note>639</Note>

431 640 

432### SessionEnd641### UserPromptSubmit

433 

434Runs when a Claude Code session ends. Useful for cleanup tasks, logging session

435statistics, or saving session state.

436 

437The `reason` field in the hook input will be one of:

438 

439* `clear` - Session cleared with /clear command

440* `logout` - User logged out

441* `prompt_input_exit` - User exited while prompt input was visible

442* `other` - Other exit reasons

443 

444## Hook Input

445 

446Hooks receive JSON data via stdin containing session information and

447event-specific data:

448 642 

449```typescript theme={null}643Runs when the user submits a prompt, before Claude processes it. This allows you

450{644to add additional context based on the prompt/conversation, validate prompts, or

451 // Common fields645block certain types of prompts.

452 session_id: string

453 transcript_path: string // Path to conversation JSON

454 cwd: string // The current working directory when the hook is invoked

455 permission_mode: string // Current permission mode: "default", "plan", "acceptEdits", or "bypassPermissions"

456 

457 // Event-specific fields

458 hook_event_name: string

459 ...

460}

461```

462 646 

463### PreToolUse Input647#### UserPromptSubmit input

464 648 

465The exact schema for `tool_input` depends on the tool.649In addition to the [common input fields](#common-input-fields), UserPromptSubmit hooks receive the `prompt` field containing the text the user submitted.

466 650 

467```json theme={null}651```json theme={null}

468{652{


470 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",654 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

471 "cwd": "/Users/...",655 "cwd": "/Users/...",

472 "permission_mode": "default",656 "permission_mode": "default",

473 "hook_event_name": "PreToolUse",657 "hook_event_name": "UserPromptSubmit",

474 "tool_name": "Write",658 "prompt": "Write a function to calculate the factorial of a number"

659}

660```

661 

662#### UserPromptSubmit decision control

663 

664`UserPromptSubmit` hooks can control whether a user prompt is processed and add context. All [JSON output fields](#json-output) are available.

665 

666There are two ways to add context to the conversation on exit code 0:

667 

668* **Plain text stdout**: any non-JSON text written to stdout is added as context

669* **JSON with `additionalContext`**: use the JSON format below for more control. The `additionalContext` field is added as context

670 

671Plain stdout is shown as hook output in the transcript. The `additionalContext` field is added more discretely.

672 

673To block a prompt, return a JSON object with `decision` set to `"block"`:

674 

675| Field | Description |

676| :------------------ | :----------------------------------------------------------------------------------------------------------------- |

677| `decision` | `"block"` prevents the prompt from being processed and erases it from context. Omit to allow the prompt to proceed |

678| `reason` | Shown to the user when `decision` is `"block"`. Not added to context |

679| `additionalContext` | String added to Claude's context |

680 

681```json theme={null}

682{

683 "decision": "block",

684 "reason": "Explanation for decision",

685 "hookSpecificOutput": {

686 "hookEventName": "UserPromptSubmit",

687 "additionalContext": "My additional context here"

688 }

689}

690```

691 

692<Note>

693 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

694 block prompts or want more structured control.

695</Note>

696 

697### PreToolUse

698 

699Runs 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).

700 

701Use [PreToolUse decision control](#pretooluse-decision-control) to allow, deny, or ask for permission to use the tool.

702 

703#### PreToolUse input

704 

705In 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:

706 

707##### Bash

708 

709Executes shell commands.

710 

711| Field | Type | Example | Description |

712| :------------------ | :------ | :----------------- | :-------------------------------------------- |

713| `command` | string | `"npm test"` | The shell command to execute |

714| `description` | string | `"Run test suite"` | Optional description of what the command does |

715| `timeout` | number | `120000` | Optional timeout in milliseconds |

716| `run_in_background` | boolean | `false` | Whether to run the command in background |

717 

718##### Write

719 

720Creates or overwrites a file.

721 

722| Field | Type | Example | Description |

723| :---------- | :----- | :-------------------- | :--------------------------------- |

724| `file_path` | string | `"/path/to/file.txt"` | Absolute path to the file to write |

725| `content` | string | `"file content"` | Content to write to the file |

726 

727##### Edit

728 

729Replaces a string in an existing file.

730 

731| Field | Type | Example | Description |

732| :------------ | :------ | :-------------------- | :--------------------------------- |

733| `file_path` | string | `"/path/to/file.txt"` | Absolute path to the file to edit |

734| `old_string` | string | `"original text"` | Text to find and replace |

735| `new_string` | string | `"replacement text"` | Replacement text |

736| `replace_all` | boolean | `false` | Whether to replace all occurrences |

737 

738##### Read

739 

740Reads file contents.

741 

742| Field | Type | Example | Description |

743| :---------- | :----- | :-------------------- | :----------------------------------------- |

744| `file_path` | string | `"/path/to/file.txt"` | Absolute path to the file to read |

745| `offset` | number | `10` | Optional line number to start reading from |

746| `limit` | number | `50` | Optional number of lines to read |

747 

748##### Glob

749 

750Finds files matching a glob pattern.

751 

752| Field | Type | Example | Description |

753| :-------- | :----- | :--------------- | :--------------------------------------------------------------------- |

754| `pattern` | string | `"**/*.ts"` | Glob pattern to match files against |

755| `path` | string | `"/path/to/dir"` | Optional directory to search in. Defaults to current working directory |

756 

757##### Grep

758 

759Searches file contents with regular expressions.

760 

761| Field | Type | Example | Description |

762| :------------ | :------ | :--------------- | :------------------------------------------------------------------------------------ |

763| `pattern` | string | `"TODO.*fix"` | Regular expression pattern to search for |

764| `path` | string | `"/path/to/dir"` | Optional file or directory to search in |

765| `glob` | string | `"*.ts"` | Optional glob pattern to filter files |

766| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"`, or `"count"`. Defaults to `"files_with_matches"` |

767| `-i` | boolean | `true` | Case insensitive search |

768| `multiline` | boolean | `false` | Enable multiline matching |

769 

770##### WebFetch

771 

772Fetches and processes web content.

773 

774| Field | Type | Example | Description |

775| :------- | :----- | :---------------------------- | :----------------------------------- |

776| `url` | string | `"https://example.com/api"` | URL to fetch content from |

777| `prompt` | string | `"Extract the API endpoints"` | Prompt to run on the fetched content |

778 

779##### WebSearch

780 

781Searches the web.

782 

783| Field | Type | Example | Description |

784| :---------------- | :----- | :----------------------------- | :------------------------------------------------ |

785| `query` | string | `"react hooks best practices"` | Search query |

786| `allowed_domains` | array | `["docs.example.com"]` | Optional: only include results from these domains |

787| `blocked_domains` | array | `["spam.example.com"]` | Optional: exclude results from these domains |

788 

789##### Task

790 

791Spawns a [subagent](/en/sub-agents).

792 

793| Field | Type | Example | Description |

794| :-------------- | :----- | :------------------------- | :------------------------------------------- |

795| `prompt` | string | `"Find all API endpoints"` | The task for the agent to perform |

796| `description` | string | `"Find API endpoints"` | Short description of the task |

797| `subagent_type` | string | `"Explore"` | Type of specialized agent to use |

798| `model` | string | `"sonnet"` | Optional model alias to override the default |

799 

800#### PreToolUse decision control

801 

802`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.

803 

804| Field | Description |

805| :------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- |

806| `permissionDecision` | `"allow"` bypasses the permission system, `"deny"` prevents the tool call, `"ask"` prompts the user to confirm |

807| `permissionDecisionReason` | For `"allow"` and `"ask"`, shown to the user but not Claude. For `"deny"`, shown to Claude |

808| `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 |

809| `additionalContext` | String added to Claude's context before the tool executes |

810 

811```json theme={null}

812{

813 "hookSpecificOutput": {

814 "hookEventName": "PreToolUse",

815 "permissionDecision": "allow",

816 "permissionDecisionReason": "My reason here",

817 "updatedInput": {

818 "field_to_modify": "new value"

819 },

820 "additionalContext": "Current environment: production. Proceed with caution."

821 }

822}

823```

824 

825<Note>

826 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.

827</Note>

828 

829### PermissionRequest

830 

831Runs when the user is shown a permission dialog.

832Use [PermissionRequest decision control](#permissionrequest-decision-control) to allow or deny on behalf of the user.

833 

834Matches on tool name, same values as PreToolUse.

835 

836#### PermissionRequest input

837 

838PermissionRequest 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.

839 

840```json theme={null}

841{

842 "session_id": "abc123",

843 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

844 "cwd": "/Users/...",

845 "permission_mode": "default",

846 "hook_event_name": "PermissionRequest",

847 "tool_name": "Bash",

475 "tool_input": {848 "tool_input": {

476 "file_path": "/path/to/file.txt",849 "command": "rm -rf node_modules",

477 "content": "file content"850 "description": "Remove node_modules directory"

478 },851 },

479 "tool_use_id": "toolu_01ABC123..."852 "permission_suggestions": [

853 { "type": "toolAlwaysAllow", "tool": "Bash" }

854 ]

480}855}

481```856```

482 857 

483### PostToolUse Input858#### PermissionRequest decision control

484 859 

485The exact schema for `tool_input` and `tool_response` depends on the tool.860`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:

861 

862| Field | Description |

863| :------------------- | :------------------------------------------------------------------------------------------------------------- |

864| `behavior` | `"allow"` grants the permission, `"deny"` denies it |

865| `updatedInput` | For `"allow"` only: modifies the tool's input parameters before execution |

866| `updatedPermissions` | For `"allow"` only: applies permission rule updates, equivalent to the user selecting an "always allow" option |

867| `message` | For `"deny"` only: tells Claude why the permission was denied |

868| `interrupt` | For `"deny"` only: if `true`, stops Claude |

869 

870```json theme={null}

871{

872 "hookSpecificOutput": {

873 "hookEventName": "PermissionRequest",

874 "decision": {

875 "behavior": "allow",

876 "updatedInput": {

877 "command": "npm run lint"

878 }

879 }

880 }

881}

882```

883 

884### PostToolUse

885 

886Runs immediately after a tool completes successfully.

887 

888Matches on tool name, same values as PreToolUse.

889 

890#### PostToolUse input

891 

892`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.

486 893 

487```json theme={null}894```json theme={null}

488{895{


504}911}

505```912```

506 913 

507### Notification Input914#### PostToolUse decision control

915 

916`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:

917 

918| Field | Description |

919| :--------------------- | :----------------------------------------------------------------------------------------- |

920| `decision` | `"block"` prompts Claude with the `reason`. Omit to allow the action to proceed |

921| `reason` | Explanation shown to Claude when `decision` is `"block"` |

922| `additionalContext` | Additional context for Claude to consider |

923| `updatedMCPToolOutput` | For [MCP tools](#match-mcp-tools) only: replaces the tool's output with the provided value |

508 924 

509```json theme={null}925```json theme={null}

510{926{

511 "session_id": "abc123",927 "decision": "block",

512 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",928 "reason": "Explanation for decision",

513 "cwd": "/Users/...",929 "hookSpecificOutput": {

514 "permission_mode": "default",930 "hookEventName": "PostToolUse",

515 "hook_event_name": "Notification",931 "additionalContext": "Additional information for Claude"

516 "message": "Claude needs your permission to use Bash",932 }

517 "notification_type": "permission_prompt"

518}933}

519```934```

520 935 

521### UserPromptSubmit Input936### PostToolUseFailure

937 

938Runs 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.

939 

940Matches on tool name, same values as PreToolUse.

941 

942#### PostToolUseFailure input

943 

944PostToolUseFailure hooks receive the same `tool_name` and `tool_input` fields as PostToolUse, along with error information as top-level fields:

522 945 

523```json theme={null}946```json theme={null}

524{947{


526 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",949 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

527 "cwd": "/Users/...",950 "cwd": "/Users/...",

528 "permission_mode": "default",951 "permission_mode": "default",

529 "hook_event_name": "UserPromptSubmit",952 "hook_event_name": "PostToolUseFailure",

530 "prompt": "Write a function to calculate the factorial of a number"953 "tool_name": "Bash",

954 "tool_input": {

955 "command": "npm test",

956 "description": "Run test suite"

957 },

958 "tool_use_id": "toolu_01ABC123...",

959 "error": "Command exited with non-zero status code 1",

960 "is_interrupt": false

531}961}

532```962```

533 963 

534### Stop and SubagentStop Input964| Field | Description |

965| :------------- | :------------------------------------------------------------------------------ |

966| `error` | String describing what went wrong |

967| `is_interrupt` | Optional boolean indicating whether the failure was caused by user interruption |

535 968 

536`stop_hook_active` is true when Claude Code is already continuing as a result of969#### PostToolUseFailure decision control

537a stop hook. Check this value or process the transcript to prevent Claude Code970 

538from running indefinitely.971`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:

972 

973| Field | Description |

974| :------------------ | :------------------------------------------------------------ |

975| `additionalContext` | Additional context for Claude to consider alongside the error |

539 976 

540```json theme={null}977```json theme={null}

541{978{

542 "session_id": "abc123",979 "hookSpecificOutput": {

543 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",980 "hookEventName": "PostToolUseFailure",

544 "permission_mode": "default",981 "additionalContext": "Additional information about the failure for Claude"

545 "hook_event_name": "Stop",982 }

546 "stop_hook_active": true

547}983}

548```984```

549 985 

550### PreCompact Input986### Notification

987 

988Runs 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.

551 989 

552For `manual`, `custom_instructions` comes from what the user passes into990Use 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:

553`/compact`. For `auto`, `custom_instructions` is empty.

554 991 

555```json theme={null}992```json theme={null}

556{993{

557 "session_id": "abc123",994 "hooks": {

558 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",995 "Notification": [

559 "permission_mode": "default",996 {

560 "hook_event_name": "PreCompact",997 "matcher": "permission_prompt",

561 "trigger": "manual",998 "hooks": [

562 "custom_instructions": ""999 {

1000 "type": "command",

1001 "command": "/path/to/permission-alert.sh"

1002 }

1003 ]

1004 },

1005 {

1006 "matcher": "idle_prompt",

1007 "hooks": [

1008 {

1009 "type": "command",

1010 "command": "/path/to/idle-notification.sh"

1011 }

1012 ]

1013 }

1014 ]

1015 }

563}1016}

564```1017```

565 1018 

566### SessionStart Input1019#### Notification input

1020 

1021In 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.

567 1022 

568```json theme={null}1023```json theme={null}

569{1024{

570 "session_id": "abc123",1025 "session_id": "abc123",

571 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",1026 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

1027 "cwd": "/Users/...",

572 "permission_mode": "default",1028 "permission_mode": "default",

573 "hook_event_name": "SessionStart",1029 "hook_event_name": "Notification",

574 "source": "startup"1030 "message": "Claude needs your permission to use Bash",

1031 "title": "Permission needed",

1032 "notification_type": "permission_prompt"

575}1033}

576```1034```

577 1035 

578### SessionEnd Input1036Notification 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:

1037 

1038| Field | Description |

1039| :------------------ | :------------------------------- |

1040| `additionalContext` | String added to Claude's context |

1041 

1042### SubagentStart

1043 

1044Runs 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/`).

1045 

1046#### SubagentStart input

1047 

1048In 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).

579 1049 

580```json theme={null}1050```json theme={null}

581{1051{

582 "session_id": "abc123",1052 "session_id": "abc123",

583 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",1053 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

584 "cwd": "/Users/...",1054 "cwd": "/Users/...",

585 "permission_mode": "default",1055 "permission_mode": "default",

586 "hook_event_name": "SessionEnd",1056 "hook_event_name": "SubagentStart",

587 "reason": "exit"1057 "agent_id": "agent-abc123",

1058 "agent_type": "Explore"

588}1059}

589```1060```

590 1061 

591## Hook Output1062SubagentStart 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:

592 1063 

593There are two mutually-exclusive ways for hooks to return output back to Claude Code. The output1064| Field | Description |

594communicates whether to block and any feedback that should be shown to Claude1065| :------------------ | :------------------------------------- |

595and the user.1066| `additionalContext` | String added to the subagent's context |

596 1067 

597### Simple: Exit Code1068```json theme={null}

1069{

1070 "hookSpecificOutput": {

1071 "hookEventName": "SubagentStart",

1072 "additionalContext": "Follow security guidelines for this task"

1073 }

1074}

1075```

598 1076 

599Hooks communicate status through exit codes, stdout, and stderr:1077### SubagentStop

600 1078 

601* **Exit code 0**: Success. `stdout` is shown to the user in verbose mode1079Runs when a Claude Code subagent has finished responding. Matches on agent type, same values as SubagentStart.

602 (ctrl+o), except for `UserPromptSubmit` and `SessionStart`, where stdout is

603 added to the context. JSON output in `stdout` is parsed for structured control

604 (see [Advanced: JSON Output](#advanced-json-output)).

605* **Exit code 2**: Blocking error. Only `stderr` is used as the error message

606 and fed back to Claude. The format is `[command]: {stderr}`. JSON in `stdout`

607 is **not** processed for exit code 2. See per-hook-event behavior below.

608* **Other exit codes**: Non-blocking error. `stderr` is shown to the user in verbose mode (ctrl+o) with

609 format `Failed with non-blocking status code: {stderr}`. If `stderr` is empty,

610 it shows `No stderr output`. Execution continues.

611 1080 

612<Warning>1081#### SubagentStop input

613 Reminder: Claude Code does not see stdout if the exit code is 0, except for

614 the `UserPromptSubmit` hook where stdout is injected as context.

615</Warning>

616 1082 

617#### Exit Code 2 Behavior1083In addition to the [common input fields](#common-input-fields), SubagentStop hooks receive `stop_hook_active`, `agent_id`, `agent_type`, and `agent_transcript_path`. 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.

618 1084 

619| Hook Event | Behavior |1085```json theme={null}

620| ------------------- | ------------------------------------------------------------------ |1086{

621| `PreToolUse` | Blocks the tool call, shows stderr to Claude |1087 "session_id": "abc123",

622| `PermissionRequest` | Denies the permission, shows stderr to Claude |1088 "transcript_path": "~/.claude/projects/.../abc123.jsonl",

623| `PostToolUse` | Shows stderr to Claude (tool already ran) |1089 "cwd": "/Users/...",

624| `Notification` | N/A, shows stderr to user only |1090 "permission_mode": "default",

625| `UserPromptSubmit` | Blocks prompt processing, erases prompt, shows stderr to user only |1091 "hook_event_name": "SubagentStop",

626| `Stop` | Blocks stoppage, shows stderr to Claude |1092 "stop_hook_active": false,

627| `SubagentStop` | Blocks stoppage, shows stderr to Claude subagent |1093 "agent_id": "def456",

628| `PreCompact` | N/A, shows stderr to user only |1094 "agent_type": "Explore",

629| `SessionStart` | N/A, shows stderr to user only |1095 "agent_transcript_path": "~/.claude/projects/.../abc123/subagents/agent-def456.jsonl"

630| `SessionEnd` | N/A, shows stderr to user only |1096}

1097```

631 1098 

632### Advanced: JSON Output1099SubagentStop hooks use the same decision control format as [Stop hooks](#stop-decision-control).

633 1100 

634Hooks can return structured JSON in `stdout` for more sophisticated control.1101### Stop

635 1102 

636<Warning>1103Runs when the main Claude Code agent has finished responding. Does not run if

637 JSON output is only processed when the hook exits with code 0. If your hook1104the stoppage occurred due to a user interrupt.

638 exits with code 2 (blocking error), `stderr` text is used directly—any JSON in `stdout`

639 is ignored. For other non-zero exit codes, only `stderr` is shown to the user in verbose mode (ctrl+o).

640</Warning>

641 1105 

642#### Common JSON Fields1106#### Stop input

643 1107 

644All hook types can include these optional fields:1108In addition to the [common input fields](#common-input-fields), Stop hooks receive `stop_hook_active`. This 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.

645 1109 

646```json theme={null}1110```json theme={null}

647{1111{

648 "continue": true, // Whether Claude should continue after hook execution (default: true)1112 "session_id": "abc123",

649 "stopReason": "string", // Message shown when continue is false1113 "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

650 1114 "cwd": "/Users/...",

651 "suppressOutput": true, // Hide stdout from transcript mode (default: false)1115 "permission_mode": "default",

652 "systemMessage": "string" // Optional warning message shown to the user1116 "hook_event_name": "Stop",

1117 "stop_hook_active": true

653}1118}

654```1119```

655 1120 

656If `continue` is false, Claude stops processing after the hooks run.1121#### Stop decision control

657 

658* For `PreToolUse`, this is different from `"permissionDecision": "deny"`, which

659 only blocks a specific tool call and provides automatic feedback to Claude.

660* For `PostToolUse`, this is different from `"decision": "block"`, which

661 provides automated feedback to Claude.

662* For `UserPromptSubmit`, this prevents the prompt from being processed.

663* For `Stop` and `SubagentStop`, this takes precedence over any

664 `"decision": "block"` output.

665* In all cases, `"continue" = false` takes precedence over any

666 `"decision": "block"` output.

667 

668`stopReason` accompanies `continue` with a reason shown to the user, not shown

669to Claude.

670 

671#### `PreToolUse` Decision Control

672 

673`PreToolUse` hooks can control whether a tool call proceeds.

674 1122 

675* `"allow"` bypasses the permission system. `permissionDecisionReason` is shown1123`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:

676 to the user but not to Claude.

677* `"deny"` prevents the tool call from executing. `permissionDecisionReason` is

678 shown to Claude.

679* `"ask"` asks the user to confirm the tool call in the UI.

680 `permissionDecisionReason` is shown to the user but not to Claude.

681 1124 

682Additionally, hooks can modify tool inputs before execution using `updatedInput`:1125| Field | Description |

683 1126| :--------- | :------------------------------------------------------------------------- |

684* `updatedInput` allows you to modify the tool's input parameters before the tool executes.1127| `decision` | `"block"` prevents Claude from stopping. Omit to allow Claude to stop |

685* This is most useful with `"permissionDecision": "allow"` to modify and approve tool calls.1128| `reason` | Required when `decision` is `"block"`. Tells Claude why it should continue |

686 1129 

687```json theme={null}1130```json theme={null}

688{1131{

689 "hookSpecificOutput": {1132 "decision": "block",

690 "hookEventName": "PreToolUse",1133 "reason": "Must be provided when Claude is blocked from stopping"

691 "permissionDecision": "allow"

692 "permissionDecisionReason": "My reason here",

693 "updatedInput": {

694 "field_to_modify": "new value"

695 }

696 }

697}1134}

698```1135```

699 1136 

700<Note>1137### PreCompact

701 The `decision` and `reason` fields are deprecated for PreToolUse hooks.1138 

702 Use `hookSpecificOutput.permissionDecision` and1139Runs before Claude Code is about to run a compact operation.

703 `hookSpecificOutput.permissionDecisionReason` instead. The deprecated fields

704 `"approve"` and `"block"` map to `"allow"` and `"deny"` respectively.

705</Note>

706 1140 

707#### `PermissionRequest` Decision Control1141The matcher value indicates whether compaction was triggered manually or automatically:

708 1142 

709`PermissionRequest` hooks can allow or deny permission requests shown to the user.1143| Matcher | When it fires |

1144| :------- | :------------------------------------------- |

1145| `manual` | `/compact` |

1146| `auto` | Auto-compact when the context window is full |

710 1147 

711* For `"behavior": "allow"` you can also optionally pass in an `"updatedInput"` that modifies the tool's input parameters before the tool executes.1148#### PreCompact input

712* For `"behavior": "deny"` you can also optionally pass in a `"message"` string that tells the model why the permission was denied, and a boolean `"interrupt"` which will stop Claude.1149 

1150In 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.

713 1151 

714```json theme={null}1152```json theme={null}

715{1153{

716 "hookSpecificOutput": {1154 "session_id": "abc123",

717 "hookEventName": "PermissionRequest",1155 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

718 "decision": {1156 "cwd": "/Users/...",

719 "behavior": "allow",1157 "permission_mode": "default",

720 "updatedInput": {1158 "hook_event_name": "PreCompact",

721 "command": "npm run lint"1159 "trigger": "manual",

722 }1160 "custom_instructions": ""

723 }

724 }

725}1161}

726```1162```

727 1163 

728#### `PostToolUse` Decision Control1164### SessionEnd

1165 

1166Runs when a Claude Code session ends. Useful for cleanup tasks, logging session

1167statistics, or saving session state. Supports matchers to filter by exit reason.

1168 

1169The `reason` field in the hook input indicates why the session ended:

729 1170 

730`PostToolUse` hooks can provide feedback to Claude after tool execution.1171| Reason | Description |

1172| :---------------------------- | :----------------------------------------- |

1173| `clear` | Session cleared with `/clear` command |

1174| `logout` | User logged out |

1175| `prompt_input_exit` | User exited while prompt input was visible |

1176| `bypass_permissions_disabled` | Bypass permissions mode was disabled |

1177| `other` | Other exit reasons |

731 1178 

732* `"block"` automatically prompts Claude with `reason`.1179#### SessionEnd input

733* `undefined` does nothing. `reason` is ignored.1180 

734* `"hookSpecificOutput.additionalContext"` adds context for Claude to consider.1181In 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.

735 1182 

736```json theme={null}1183```json theme={null}

737{1184{

738 "decision": "block" | undefined,1185 "session_id": "abc123",

739 "reason": "Explanation for decision",1186 "transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",

740 "hookSpecificOutput": {1187 "cwd": "/Users/...",

741 "hookEventName": "PostToolUse",1188 "permission_mode": "default",

742 "additionalContext": "Additional information for Claude"1189 "hook_event_name": "SessionEnd",

743 }1190 "reason": "other"

744}1191}

745```1192```

746 1193 

747#### `UserPromptSubmit` Decision Control1194SessionEnd hooks have no decision control. They cannot block session termination but can perform cleanup tasks.

1195 

1196## Prompt-based hooks

748 1197 

749`UserPromptSubmit` hooks can control whether a user prompt is processed and add context.1198In 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. Prompt-based hooks work with the following events: `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest`, `UserPromptSubmit`, `Stop`, and `SubagentStop`.

750 1199 

751**Adding context (exit code 0):**1200### How prompt-based hooks work

752There are two ways to add context to the conversation:

753 1201 

7541. **Plain text stdout** (simpler): Any non-JSON text written to stdout is added1202Instead of executing a Bash command, prompt-based hooks:

755 as context. This is the easiest way to inject information.

756 1203 

7572. **JSON with `additionalContext`** (structured): Use the JSON format below for12041. Send the hook input and your prompt to a Claude model, Haiku by default

758 more control. The `additionalContext` field is added as context.12052. The LLM responds with structured JSON containing a decision

12063. Claude Code processes the decision automatically

759 1207 

760Both methods work with exit code 0. Plain stdout is shown as hook output in1208### Prompt hook configuration

761the transcript; `additionalContext` is added more discretely.

762 1209 

763**Blocking prompts:**1210Set `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.

764 1211 

765* `"decision": "block"` prevents the prompt from being processed. The submitted1212This `Stop` hook asks the LLM to evaluate whether all tasks are complete before allowing Claude to finish:

766 prompt is erased from context. `"reason"` is shown to the user but not added

767 to context.

768* `"decision": undefined` (or omitted) allows the prompt to proceed normally.

769 1213 

770```json theme={null}1214```json theme={null}

771{1215{

772 "decision": "block" | undefined,1216 "hooks": {

773 "reason": "Explanation for decision",1217 "Stop": [

774 "hookSpecificOutput": {1218 {

775 "hookEventName": "UserPromptSubmit",1219 "hooks": [

776 "additionalContext": "My additional context here"1220 {

1221 "type": "prompt",

1222 "prompt": "Evaluate if Claude should stop: $ARGUMENTS. Check if all tasks are complete."

1223 }

1224 ]

1225 }

1226 ]

777 }1227 }

778}1228}

779```1229```

780 1230 

781<Note>1231| Field | Required | Description |

782 The JSON format is not required for simple use cases. To add context, you can1232| :-------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

783 just print plain text to stdout with exit code 0. Use JSON when you need to1233| `type` | yes | Must be `"prompt"` |

784 block prompts or want more structured control.1234| `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 |

785</Note>1235| `model` | no | Model to use for evaluation. Defaults to a fast model |

1236| `timeout` | no | Timeout in seconds. Default: 30 |

786 1237 

787#### `Stop`/`SubagentStop` Decision Control1238### Response schema

788 

789`Stop` and `SubagentStop` hooks can control whether Claude must continue.

790 1239 

791* `"block"` prevents Claude from stopping. You must populate `reason` for Claude1240The LLM must respond with JSON containing:

792 to know how to proceed.

793* `undefined` allows Claude to stop. `reason` is ignored.

794 1241 

795```json theme={null}1242```json theme={null}

796{1243{

797 "decision": "block" | undefined,1244 "ok": true | false,

798 "reason": "Must be provided when Claude is blocked from stopping"1245 "reason": "Explanation for the decision"

799}1246}

800```1247```

801 1248 

802#### `SessionStart` Decision Control1249| Field | Description |

1250| :------- | :--------------------------------------------------------- |

1251| `ok` | `true` allows the action, `false` prevents it |

1252| `reason` | Required when `ok` is `false`. Explanation shown to Claude |

803 1253 

804`SessionStart` hooks allow you to load in context at the start of a session.1254### Example: Multi-criteria Stop hook

805 1255 

806* `"hookSpecificOutput.additionalContext"` adds the string to the context.1256This `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:

807* Multiple hooks' `additionalContext` values are concatenated.

808 1257 

809```json theme={null}1258```json theme={null}

810{1259{

811 "hookSpecificOutput": {1260 "hooks": {

812 "hookEventName": "SessionStart",1261 "Stop": [

813 "additionalContext": "My additional context here"1262 {

1263 "hooks": [

1264 {

1265 "type": "prompt",

1266 "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.",

1267 "timeout": 30

1268 }

1269 ]

1270 }

1271 ]

814 }1272 }

815}1273}

816```1274```

817 1275 

818#### `SessionEnd` Decision Control1276## Agent-based hooks

819 

820`SessionEnd` hooks run when a session ends. They cannot block session termination

821but can perform cleanup tasks.

822 

823#### Exit Code Example: Bash Command Validation

824 

825```python theme={null}

826#!/usr/bin/env python3

827import json

828import re

829import sys

830 

831# Define validation rules as a list of (regex pattern, message) tuples

832VALIDATION_RULES = [

833 (

834 r"\bgrep\b(?!.*\|)",

835 "Use 'rg' (ripgrep) instead of 'grep' for better performance and features",

836 ),

837 (

838 r"\bfind\s+\S+\s+-name\b",

839 "Use 'rg --files | rg pattern' or 'rg --files -g pattern' instead of 'find -name' for better performance",

840 ),

841]

842 

843 

844def validate_command(command: str) -> list[str]:

845 issues = []

846 for pattern, message in VALIDATION_RULES:

847 if re.search(pattern, command):

848 issues.append(message)

849 return issues

850 

851 

852try:

853 input_data = json.load(sys.stdin)

854except json.JSONDecodeError as e:

855 print(f"Error: Invalid JSON input: {e}", file=sys.stderr)

856 sys.exit(1)

857 

858tool_name = input_data.get("tool_name", "")

859tool_input = input_data.get("tool_input", {})

860command = tool_input.get("command", "")

861 

862if tool_name != "Bash" or not command:

863 sys.exit(1)

864 

865# Validate the command

866issues = validate_command(command)

867 

868if issues:

869 for message in issues:

870 print(f"• {message}", file=sys.stderr)

871 # Exit code 2 blocks tool call and shows stderr to Claude

872 sys.exit(2)

873```

874 

875#### JSON Output Example: UserPromptSubmit to Add Context and Validation

876 1277 

877<Note>1278Agent-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.

878 For `UserPromptSubmit` hooks, you can inject context using either method:

879 1279 

880 * **Plain text stdout** with exit code 0: Simplest approach—just print text1280### How agent hooks work

881 * **JSON output** with exit code 0: Use `"decision": "block"` to reject prompts,

882 or `additionalContext` for structured context injection

883 1281 

884 Remember: Exit code 2 only uses `stderr` for the error message. To block using1282When an agent hook fires:

885 JSON (with a custom reason), use `"decision": "block"` with exit code 0.

886</Note>

887 1283 

888```python theme={null}12841. Claude Code spawns a subagent with your prompt and the hook's JSON input

889#!/usr/bin/env python312852. The subagent can use tools like Read, Grep, and Glob to investigate

890import json12863. After up to 50 turns, the subagent returns a structured `{ "ok": true/false }` decision

891import sys12874. Claude Code processes the decision the same way as a prompt hook

892import re

893import datetime

894 

895# Load input from stdin

896try:

897 input_data = json.load(sys.stdin)

898except json.JSONDecodeError as e:

899 print(f"Error: Invalid JSON input: {e}", file=sys.stderr)

900 sys.exit(1)

901 

902prompt = input_data.get("prompt", "")

903 

904# Check for sensitive patterns

905sensitive_patterns = [

906 (r"(?i)\b(password|secret|key|token)\s*[:=]", "Prompt contains potential secrets"),

907]

908 

909for pattern, message in sensitive_patterns:

910 if re.search(pattern, prompt):

911 # Use JSON output to block with a specific reason

912 output = {

913 "decision": "block",

914 "reason": f"Security policy violation: {message}. Please rephrase your request without sensitive information."

915 }

916 print(json.dumps(output))

917 sys.exit(0)

918 1288 

919# Add current time to context1289Agent hooks are useful when verification requires inspecting actual files or test output, not just evaluating the hook input data alone.

920context = f"Current time: {datetime.datetime.now()}"

921print(context)

922 1290 

923"""1291### Agent hook configuration

924The following is also equivalent:

925print(json.dumps({

926 "hookSpecificOutput": {

927 "hookEventName": "UserPromptSubmit",

928 "additionalContext": context,

929 },

930}))

931"""

932 1292 

933# Allow the prompt to proceed with the additional context1293Set `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:

934sys.exit(0)

935```

936 1294 

937#### JSON Output Example: PreToolUse with Approval1295| Field | Required | Description |

938 1296| :-------- | :------- | :------------------------------------------------------------------------------------------ |

939```python theme={null}1297| `type` | yes | Must be `"agent"` |

940#!/usr/bin/env python31298| `prompt` | yes | Prompt describing what to verify. Use `$ARGUMENTS` as a placeholder for the hook input JSON |

941import json1299| `model` | no | Model to use. Defaults to a fast model |

942import sys1300| `timeout` | no | Timeout in seconds. Default: 60 |

943 

944# Load input from stdin

945try:

946 input_data = json.load(sys.stdin)

947except json.JSONDecodeError as e:

948 print(f"Error: Invalid JSON input: {e}", file=sys.stderr)

949 sys.exit(1)

950 

951tool_name = input_data.get("tool_name", "")

952tool_input = input_data.get("tool_input", {})

953 

954# Example: Auto-approve file reads for documentation files

955if tool_name == "Read":

956 file_path = tool_input.get("file_path", "")

957 if file_path.endswith((".md", ".mdx", ".txt", ".json")):

958 # Use JSON output to auto-approve the tool call

959 output = {

960 "decision": "approve",

961 "reason": "Documentation file auto-approved",

962 "suppressOutput": True # Don't show in verbose mode

963 }

964 print(json.dumps(output))

965 sys.exit(0)

966 1301 

967# For other cases, let the normal permission flow proceed1302The response schema is the same as prompt hooks: `{ "ok": true }` to allow or `{ "ok": false, "reason": "..." }` to block.

968sys.exit(0)

969```

970 1303 

971## Working with MCP Tools1304This `Stop` hook verifies that all unit tests pass before allowing Claude to finish:

972 1305 

973Claude Code hooks work seamlessly with1306```json theme={null}

974[Model Context Protocol (MCP) tools](/en/mcp). When MCP servers1307{

975provide tools, they appear with a special naming pattern that you can match in1308 "hooks": {

976your hooks.1309 "Stop": [

1310 {

1311 "hooks": [

1312 {

1313 "type": "agent",

1314 "prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",

1315 "timeout": 120

1316 }

1317 ]

1318 }

1319 ]

1320 }

1321}

1322```

977 1323 

978### MCP Tool Naming1324## Run hooks in the background

979 1325 

980MCP tools follow the pattern `mcp__<server>__<tool>`, for example:1326By 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.

981 1327 

982* `mcp__memory__create_entities` - Memory server's create entities tool1328### Configure an async hook

983* `mcp__filesystem__read_file` - Filesystem server's read file tool

984* `mcp__github__search_repositories` - GitHub server's search tool

985 1329 

986### Configuring Hooks for MCP Tools1330Add `"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.

987 1331 

988You can target specific MCP tools or entire MCP servers:1332This 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:

989 1333 

990```json theme={null}1334```json theme={null}

991{1335{

992 "hooks": {1336 "hooks": {

993 "PreToolUse": [1337 "PostToolUse": [

994 {

995 "matcher": "mcp__memory__.*",

996 "hooks": [

997 {

998 "type": "command",

999 "command": "echo 'Memory operation initiated' >> ~/mcp-operations.log"

1000 }

1001 ]

1002 },

1003 {1338 {

1004 "matcher": "mcp__.*__write.*",1339 "matcher": "Write",

1005 "hooks": [1340 "hooks": [

1006 {1341 {

1007 "type": "command",1342 "type": "command",

1008 "command": "/home/user/scripts/validate-mcp-write.py"1343 "command": "/path/to/run-tests.sh",

1344 "async": true,

1345 "timeout": 120

1009 }1346 }

1010 ]1347 ]

1011 }1348 }


1014}1351}

1015```1352```

1016 1353 

1017## Examples1354The `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.

1018 1355 

1019<Tip>1356### How async hooks execute

1020 For practical examples including code formatting, notifications, and file protection, see [More Examples](/en/hooks-guide#more-examples) in the get started guide.

1021</Tip>

1022 

1023## Security Considerations

1024 1357 

1025### Disclaimer1358When 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.

1026 

1027**USE AT YOUR OWN RISK**: Claude Code hooks execute arbitrary shell commands on

1028your system automatically. By using hooks, you acknowledge that:

1029 1359 

1030* You are solely responsible for the commands you configure1360After 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.

1031* Hooks can modify, delete, or access any files your user account can access

1032* Malicious or poorly written hooks can cause data loss or system damage

1033* Anthropic provides no warranty and assumes no liability for any damages

1034 resulting from hook usage

1035* You should thoroughly test hooks in a safe environment before production use

1036 1361 

1037Always review and understand any hook commands before adding them to your1362### Example: run tests after file changes

1038configuration.

1039 1363 

1040### Security Best Practices1364This 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`:

1041 1365 

1042Here are some key practices for writing more secure hooks:1366```bash theme={null}

1367#!/bin/bash

1368# run-tests-async.sh

1043 1369 

10441. **Validate and sanitize inputs** - Never trust input data blindly1370# Read hook input from stdin

10452. **Always quote shell variables** - Use `"$VAR"` not `$VAR`1371INPUT=$(cat)

10463. **Block path traversal** - Check for `..` in file paths1372FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

10474. **Use absolute paths** - Specify full paths for scripts (use

1048 "\$CLAUDE\_PROJECT\_DIR" for the project path)

10495. **Skip sensitive files** - Avoid `.env`, `.git/`, keys, etc.

1050 1373 

1051### Configuration Safety1374# Only run tests for source files

1375if [[ "$FILE_PATH" != *.ts && "$FILE_PATH" != *.js ]]; then

1376 exit 0

1377fi

1052 1378 

1053Direct edits to hooks in settings files don't take effect immediately. Claude1379# Run tests and report results via systemMessage

1054Code:1380RESULT=$(npm test 2>&1)

1381EXIT_CODE=$?

1055 1382 

10561. Captures a snapshot of hooks at startup1383if [ $EXIT_CODE -eq 0 ]; then

10572. Uses this snapshot throughout the session1384 echo "{\"systemMessage\": \"Tests passed after editing $FILE_PATH\"}"

10583. Warns if hooks are modified externally1385else

10594. Requires review in `/hooks` menu for changes to apply1386 echo "{\"systemMessage\": \"Tests failed after editing $FILE_PATH: $RESULT\"}"

1387fi

1388```

1060 1389 

1061This prevents malicious hook modifications from affecting your current session.1390Then add this configuration to `.claude/settings.json` in your project root. The `async: true` flag lets Claude keep working while tests run:

1062 1391 

1063## Hook Execution Details1392```json theme={null}

1393{

1394 "hooks": {

1395 "PostToolUse": [

1396 {

1397 "matcher": "Write|Edit",

1398 "hooks": [

1399 {

1400 "type": "command",

1401 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/run-tests-async.sh",

1402 "async": true,

1403 "timeout": 300

1404 }

1405 ]

1406 }

1407 ]

1408 }

1409}

1410```

1064 1411 

1065* **Timeout**: 60-second execution limit by default, configurable per command.1412### Limitations

1066 * A timeout for an individual command does not affect the other commands.

1067* **Parallelization**: All matching hooks run in parallel

1068* **Deduplication**: Multiple identical hook commands are deduplicated automatically

1069* **Environment**: Runs in current directory with Claude Code's environment

1070 * The `CLAUDE_PROJECT_DIR` environment variable is available and contains the

1071 absolute path to the project root directory (where Claude Code was started)

1072 * 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.

1073* **Input**: JSON via stdin

1074* **Output**:

1075 * PreToolUse/PermissionRequest/PostToolUse/Stop/SubagentStop: Progress shown in verbose mode (ctrl+o)

1076 * Notification/SessionEnd: Logged to debug only (`--debug`)

1077 * UserPromptSubmit/SessionStart: stdout added as context for Claude

1078 1413 

1079## Debugging1414Async hooks have several constraints compared to synchronous hooks:

1080 1415 

1081### Basic Troubleshooting1416* Only `type: "command"` hooks support `async`. Prompt-based hooks cannot run asynchronously.

1417* Async hooks cannot block tool calls or return decisions. By the time the hook completes, the triggering action has already proceeded.

1418* Hook output is delivered on the next conversation turn. If the session is idle, the response waits until the next user interaction.

1419* Each execution creates a separate background process. There is no deduplication across multiple firings of the same async hook.

1082 1420 

1083If your hooks aren't working:1421## Security considerations

1084 1422 

10851. **Check configuration** - Run `/hooks` to see if your hook is registered1423### Disclaimer

10862. **Verify syntax** - Ensure your JSON settings are valid

10873. **Test commands** - Run hook commands manually first

10884. **Check permissions** - Make sure scripts are executable

10895. **Review logs** - Use `claude --debug` to see hook execution details

1090 1424 

1091Common issues:1425Hooks run with your system user's full permissions.

1092 1426 

1093* **Quotes not escaped** - Use `\"` inside JSON strings1427<Warning>

1094* **Wrong matcher** - Check tool names match exactly (case-sensitive)1428 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.

1095* **Command not found** - Use full paths for scripts1429</Warning>

1096 1430 

1097### Advanced Debugging1431### Security best practices

1098 1432 

1099For complex hook issues:1433Keep these practices in mind when writing hooks:

1100 1434 

11011. **Inspect hook execution** - Use `claude --debug` to see detailed hook1435* **Validate and sanitize inputs**: never trust input data blindly

1102 execution1436* **Always quote shell variables**: use `"$VAR"` not `$VAR`

11032. **Validate JSON schemas** - Test hook input/output with external tools1437* **Block path traversal**: check for `..` in file paths

11043. **Check environment variables** - Verify Claude Code's environment is correct1438* **Use absolute paths**: specify full paths for scripts, using `"$CLAUDE_PROJECT_DIR"` for the project root

11054. **Test edge cases** - Try hooks with unusual file paths or inputs1439* **Skip sensitive files**: avoid `.env`, `.git/`, keys, etc.

11065. **Monitor system resources** - Check for resource exhaustion during hook

1107 execution

11086. **Use structured logging** - Implement logging in your hook scripts

1109 1440 

1110### Debug Output Example1441## Debug hooks

1111 1442 

1112Use `claude --debug` to see hook execution details:1443Run `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.

1113 1444 

1114```1445```

1115[DEBUG] Executing hooks for PostToolUse:Write1446[DEBUG] Executing hooks for PostToolUse:Write


1117[DEBUG] Found 1 hook matchers in settings1448[DEBUG] Found 1 hook matchers in settings

1118[DEBUG] Matched 1 hooks for query "Write"1449[DEBUG] Matched 1 hooks for query "Write"

1119[DEBUG] Found 1 hook commands to execute1450[DEBUG] Found 1 hook commands to execute

1120[DEBUG] Executing hook command: <Your command> with timeout 60000ms1451[DEBUG] Executing hook command: <Your command> with timeout 600000ms

1121[DEBUG] Hook command completed with status 0: <Your stdout>1452[DEBUG] Hook command completed with status 0: <Your stdout>

1122```1453```

1123 1454 

1124Progress messages appear in verbose mode (ctrl+o) showing:1455For 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.

1125 

1126* Which hook is running

1127* Command being executed

1128* Success/failure status

1129* Output or error messages

hooks-guide.md +502 −204

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/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

15 20 

16* **Notifications**: Customize how you get notified when Claude Code is awaiting21The 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.

17 your input or permission to run something.

18* **Automatic formatting**: Run `prettier` on .ts files, `gofmt` on .go files,

19 etc. after every file edit.

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 22 

27By encoding these rules as hooks rather than prompting instructions, you turn23<Steps>

28suggestions into app-level code that executes every time it is expected to run.24 <Step title="Open the hooks menu">

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.

26 </Step>

29 27 

30<Warning>28 <Step title="Configure the matcher">

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.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`.

32 For example, malicious hooks code can exfiltrate your data. Always review your hooks implementation before registering them.30 </Step>

33 31 

34 For full security best practices, see [Security Considerations](/en/hooks#security-considerations) in the hooks reference documentation.32 <Step title="Add your command">

35</Warning>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:

36 34 

37## Hook Events Overview35 <Tabs>

36 <Tab title="macOS">

37 Uses [`osascript`](https://ss64.com/mac/osascript.html) to trigger a native macOS notification through AppleScript:

38 38 

39Claude Code provides several hook events that run at different points in the39 ```

40workflow:40 osascript -e 'display notification "Claude Code needs your attention" with title "Claude Code"'

41 ```

42 </Tab>

41 43 

42* **PreToolUse**: Runs before tool calls (can block them)44 <Tab title="Linux">

43* **PermissionRequest**: Runs when a permission dialog is shown (can allow or deny)45 Uses `notify-send`, which is pre-installed on most Linux desktops with a notification daemon:

44* **PostToolUse**: Runs after tool calls complete

45* **UserPromptSubmit**: Runs when the user submits a prompt, before Claude processes it

46* **Notification**: Runs when Claude Code sends notifications

47* **Stop**: Runs when Claude Code finishes responding

48* **SubagentStop**: Runs when subagent tasks complete

49* **PreCompact**: Runs before Claude Code is about to run a compact operation

50* **SessionStart**: Runs when Claude Code starts a new session or resumes an existing session

51* **SessionEnd**: Runs when Claude Code session ends

52 46 

53Each event receives different data and can control Claude's behavior in47 ```

54different ways.48 notify-send 'Claude Code' 'Claude Code needs your attention'

49 ```

50 </Tab>

55 51 

56## Quickstart52 <Tab title="Windows (PowerShell)">

53 Uses PowerShell to show a native message box through .NET's Windows Forms:

57 54 

58In this quickstart, you'll add a hook that logs the shell commands that Claude55 ```

59Code runs.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>

60 61 

61### Prerequisites62 <Step title="Choose a storage location">

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>

62 65 

63Install `jq` for JSON processing in the command line.66 <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>

64 70 

65### Step 1: Open hooks configuration71## What you can automate

66 72 

67Run the `/hooks` [slash command](/en/slash-commands) and select73Hooks 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).

68the `PreToolUse` hook event.

69 74 

70`PreToolUse` hooks run before tool calls and can block them while providing75Each example includes a ready-to-use configuration block that you add to a [settings file](#configure-hook-location). The most common patterns:

71Claude feedback on what to do differently.

72 76 

73### Step 2: Add a matcher77* [Get notified when Claude needs input](#get-notified-when-claude-needs-input)

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)

74 81 

75Select `+ Add new matcher…` to run your hook only on Bash tool calls.82### Get notified when Claude needs input

76 83 

77Type `Bash` for the matcher.84Get a desktop notification whenever Claude finishes working and needs your input, so you can switch to other tasks without checking the terminal.

78 85 

79<Note>You can use `*` to match all tools.</Note>86This 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`:

80 87 

81### Step 3: Add the hook88<Tabs>

89 <Tab title="macOS">

90 ```json theme={null}

91 {

92 "hooks": {

93 "Notification": [

94 {

95 "matcher": "",

96 "hooks": [

97 {

98 "type": "command",

99 "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"

100 }

101 ]

102 }

103 ]

104 }

105 }

106 ```

107 </Tab>

82 108 

83Select `+ Add new hook…` and enter this command:109 <Tab title="Linux">

110 ```json theme={null}

111 {

112 "hooks": {

113 "Notification": [

114 {

115 "matcher": "",

116 "hooks": [

117 {

118 "type": "command",

119 "command": "notify-send 'Claude Code' 'Claude Code needs your attention'"

120 }

121 ]

122 }

123 ]

124 }

125 }

126 ```

127 </Tab>

84 128 

85```bash theme={null}129 <Tab title="Windows (PowerShell)">

86jq -r '"\(.tool_input.command) - \(.tool_input.description // "No description")"' >> ~/.claude/bash-command-log.txt130 ```json theme={null}

131 {

132 "hooks": {

133 "Notification": [

134 {

135 "matcher": "",

136 "hooks": [

137 {

138 "type": "command",

139 "command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')\""

140 }

141 ]

142 }

143 ]

144 }

145 }

146 ```

147 </Tab>

148</Tabs>

149 

150### Auto-format code after edits

151 

152Automatically run [Prettier](https://prettier.io/) on every file Claude edits, so formatting stays consistent without manual intervention.

153 

154This 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:

155 

156```json theme={null}

157{

158 "hooks": {

159 "PostToolUse": [

160 {

161 "matcher": "Edit|Write",

162 "hooks": [

163 {

164 "type": "command",

165 "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"

166 }

167 ]

168 }

169 ]

170 }

171}

87```172```

88 173 

89### Step 4: Save your configuration174<Note>

175 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/).

176</Note>

177 

178### Block edits to protected files

179 

180Prevent 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.

90 181 

91For storage location, select `User settings` since you're logging to your home182This 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.

92directory. This hook will then apply to all projects, not just your current

93project.

94 183 

95Then press Esc until you return to the REPL. Your hook is now registered!184<Steps>

185 <Step title="Create the hook script">

186 Save this to `.claude/hooks/protect-files.sh`:

96 187 

97### Step 5: Verify your hook188 ```bash theme={null}

189 #!/bin/bash

190 # protect-files.sh

98 191 

99Run `/hooks` again or check `~/.claude/settings.json` to see your configuration:192 INPUT=$(cat)

193 FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

194 

195 PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/")

196 

197 for pattern in "${PROTECTED_PATTERNS[@]}"; do

198 if [[ "$FILE_PATH" == *"$pattern"* ]]; then

199 echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2

200 exit 2

201 fi

202 done

203 

204 exit 0

205 ```

206 </Step>

207 

208 <Step title="Make the script executable (macOS/Linux)">

209 Hook scripts must be executable for Claude Code to run them:

210 

211 ```bash theme={null}

212 chmod +x .claude/hooks/protect-files.sh

213 ```

214 </Step>

215 

216 <Step title="Register the hook">

217 Add a `PreToolUse` hook to `.claude/settings.json` that runs the script before any `Edit` or `Write` tool call:

218 

219 ```json theme={null}

220 {

221 "hooks": {

222 "PreToolUse": [

223 {

224 "matcher": "Edit|Write",

225 "hooks": [

226 {

227 "type": "command",

228 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"

229 }

230 ]

231 }

232 ]

233 }

234 }

235 ```

236 </Step>

237</Steps>

238 

239### Re-inject context after compaction

240 

241When 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.

242 

243Any 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:

100 244 

101```json theme={null}245```json theme={null}

102{246{

103 "hooks": {247 "hooks": {

104 "PreToolUse": [248 "SessionStart": [

105 {249 {

106 "matcher": "Bash",250 "matcher": "compact",

107 "hooks": [251 "hooks": [

108 {252 {

109 "type": "command",253 "type": "command",

110 "command": "jq -r '\"\\(.tool_input.command) - \\(.tool_input.description // \"No description\")\"' >> ~/.claude/bash-command-log.txt"254 "command": "echo 'Reminder: use Bun, not npm. Run bun test before committing. Current sprint: auth refactor.'"

111 }255 }

112 ]256 ]

113 }257 }


116}260}

117```261```

118 262 

119### Step 6: Test your hook263You 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.

120 264 

121Ask Claude to run a simple command like `ls` and check your log file:265## How hooks work

122 266 

123```bash theme={null}267Hook 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:

124cat ~/.claude/bash-command-log.txt

125```

126 268 

127You should see entries like:269| Event | When it fires |

270| :------------------- | :--------------------------------------------------- |

271| `SessionStart` | When a session begins or resumes |

272| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |

273| `PreToolUse` | Before a tool call executes. Can block it |

274| `PermissionRequest` | When a permission dialog appears |

275| `PostToolUse` | After a tool call succeeds |

276| `PostToolUseFailure` | After a tool call fails |

277| `Notification` | When Claude Code sends a notification |

278| `SubagentStart` | When a subagent is spawned |

279| `SubagentStop` | When a subagent finishes |

280| `Stop` | When Claude finishes responding |

281| `PreCompact` | Before context compaction |

282| `SessionEnd` | When a session terminates |

128 283 

284Each 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.

285 

286### Read input and return output

287 

288Hooks 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.

289 

290#### Hook input

291 

292Every 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:

293 

294```json theme={null}

295{

296 "session_id": "abc123", // unique ID for this session

297 "cwd": "/Users/sarah/myproject", // working directory when the event fired

298 "hook_event_name": "PreToolUse", // which event triggered this hook

299 "tool_name": "Bash", // the tool Claude is about to use

300 "tool_input": { // the arguments Claude passed to the tool

301 "command": "npm test" // for Bash, this is the shell command

302 }

303}

129```304```

130ls - Lists files and directories305 

306Your 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, 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.

307 

308#### Hook output

309 

310Your 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:

311 

312```bash theme={null}

313#!/bin/bash

314INPUT=$(cat)

315COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')

316 

317if echo "$COMMAND" | grep -q "drop table"; then

318 echo "Blocked: dropping tables is not allowed" >&2 # stderr becomes Claude's feedback

319 exit 2 # exit 2 = block the action

320fi

321 

322exit 0 # exit 0 = let it proceed

131```323```

132 324 

133## More Examples325The exit code determines what happens next:

326 

327* **Exit 0**: the action proceeds. For `UserPromptSubmit` and `SessionStart` hooks, anything you write to stdout is added to Claude's context.

328* **Exit 2**: the action is blocked. Write a reason to stderr, and Claude receives it as feedback so it can adjust.

329* **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.

330 

331#### Structured JSON output

332 

333Exit codes give you two options: allow or block. For more control, exit 0 and print a JSON object to stdout instead.

134 334 

135<Note>335<Note>

136 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.336 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.

137</Note>337</Note>

138 338 

139### Code Formatting Hook339For example, a `PreToolUse` hook can deny a tool call and tell Claude why, or escalate it to the user for approval:

340 

341```json theme={null}

342{

343 "hookSpecificOutput": {

344 "hookEventName": "PreToolUse",

345 "permissionDecision": "deny",

346 "permissionDecisionReason": "Use rg instead of grep for better performance"

347 }

348}

349```

350 

351Claude Code reads `permissionDecision` and cancels the tool call, then feeds `permissionDecisionReason` back to Claude as feedback. These three options are specific to `PreToolUse`:

352 

353* `"allow"`: proceed without showing a permission prompt

354* `"deny"`: cancel the tool call and send the reason to Claude

355* `"ask"`: show the permission prompt to the user as normal

140 356 

141Automatically format TypeScript files after editing:357Other 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.

358 

359For `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).

360 

361### Filter hooks with matchers

362 

363Without 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:

142 364 

143```json theme={null}365```json theme={null}

144{366{


147 {369 {

148 "matcher": "Edit|Write",370 "matcher": "Edit|Write",

149 "hooks": [371 "hooks": [

150 {372 { "type": "command", "command": "prettier --write ..." }

151 "type": "command",

152 "command": "jq -r '.tool_input.file_path' | { read file_path; if echo \"$file_path\" | grep -q '\\.ts$'; then npx prettier --write \"$file_path\"; fi; }"

153 }

154 ]373 ]

155 }374 }

156 ]375 ]


158}377}

159```378```

160 379 

161### Markdown Formatting Hook380The `"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.

162 381 

163Automatically fix missing language tags and formatting issues in markdown files:382Each event type matches on a specific field. Matchers support exact strings and regex patterns:

164 383 

165```json theme={null}384| Event | What the matcher filters | Example matcher values |

166{385| :--------------------------------------------------------------------- | :------------------------ | :----------------------------------------------------------------------- |

386| `PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PermissionRequest` | tool name | `Bash`, `Edit\|Write`, `mcp__.*` |

387| `SessionStart` | how the session started | `startup`, `resume`, `clear`, `compact` |

388| `SessionEnd` | why the session ended | `clear`, `logout`, `prompt_input_exit`, `other` |

389| `Notification` | notification type | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog` |

390| `SubagentStart` | agent type | `Bash`, `Explore`, `Plan`, or custom agent names |

391| `PreCompact` | what triggered compaction | `manual`, `auto` |

392| `UserPromptSubmit`, `Stop` | no matcher support | always fires on every occurrence |

393| `SubagentStop` | agent type | same values as `SubagentStart` |

394 

395A few more examples showing matchers on different event types:

396 

397<Tabs>

398 <Tab title="Log every Bash command">

399 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:

400 

401 ```json theme={null}

402 {

167 "hooks": {403 "hooks": {

168 "PostToolUse": [404 "PostToolUse": [

169 {405 {

170 "matcher": "Edit|Write",406 "matcher": "Bash",

171 "hooks": [407 "hooks": [

172 {408 {

173 "type": "command",409 "type": "command",

174 "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/markdown_formatter.py"410 "command": "jq -r '.tool_input.command' >> ~/.claude/command-log.txt"

175 }411 }

176 ]412 ]

177 }413 }

178 ]414 ]

179 }415 }

180}416 }

181```417 ```

418 </Tab>

182 419 

183Create `.claude/hooks/markdown_formatter.py` with this content:420 <Tab title="Match MCP tools">

184 421 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.

185````python theme={null}

186#!/usr/bin/env python3

187"""

188Markdown formatter for Claude Code output.

189Fixes missing language tags and spacing issues while preserving code content.

190"""

191import json

192import sys

193import re

194import os

195 

196def detect_language(code):

197 """Best-effort language detection from code content."""

198 s = code.strip()

199

200 # JSON detection

201 if re.search(r'^\s*[{\[]', s):

202 try:

203 json.loads(s)

204 return 'json'

205 except:

206 pass

207

208 # Python detection

209 if re.search(r'^\s*def\s+\w+\s*\(', s, re.M) or \

210 re.search(r'^\s*(import|from)\s+\w+', s, re.M):

211 return 'python'

212

213 # JavaScript detection

214 if re.search(r'\b(function\s+\w+\s*\(|const\s+\w+\s*=)', s) or \

215 re.search(r'=>|console\.(log|error)', s):

216 return 'javascript'

217

218 # Bash detection

219 if re.search(r'^#!.*\b(bash|sh)\b', s, re.M) or \

220 re.search(r'\b(if|then|fi|for|in|do|done)\b', s):

221 return 'bash'

222

223 # SQL detection

224 if re.search(r'\b(SELECT|INSERT|UPDATE|DELETE|CREATE)\s+', s, re.I):

225 return 'sql'

226

227 return 'text'

228 

229def format_markdown(content):

230 """Format markdown content with language detection."""

231 # Fix unlabeled code fences

232 def add_lang_to_fence(match):

233 indent, info, body, closing = match.groups()

234 if not info.strip():

235 lang = detect_language(body)

236 return f"{indent}```{lang}\n{body}{closing}\n"

237 return match.group(0)

238

239 fence_pattern = r'(?ms)^([ \t]{0,3})```([^\n]*)\n(.*?)(\n\1```)\s*$'

240 content = re.sub(fence_pattern, add_lang_to_fence, content)

241

242 # Fix excessive blank lines (only outside code fences)

243 content = re.sub(r'\n{3,}', '\n\n', content)

244

245 return content.rstrip() + '\n'

246 

247# Main execution

248try:

249 input_data = json.load(sys.stdin)

250 file_path = input_data.get('tool_input', {}).get('file_path', '')

251

252 if not file_path.endswith(('.md', '.mdx')):

253 sys.exit(0) # Not a markdown file

254

255 if os.path.exists(file_path):

256 with open(file_path, 'r', encoding='utf-8') as f:

257 content = f.read()

258

259 formatted = format_markdown(content)

260

261 if formatted != content:

262 with open(file_path, 'w', encoding='utf-8') as f:

263 f.write(formatted)

264 print(f"✓ Fixed markdown formatting in {file_path}")

265

266except Exception as e:

267 print(f"Error formatting markdown: {e}", file=sys.stderr)

268 sys.exit(1)

269````

270 

271Make the script executable:

272 422 

273```bash theme={null}423 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`):

274chmod +x .claude/hooks/markdown_formatter.py424 

275```425 ```json theme={null}

426 {

427 "hooks": {

428 "PreToolUse": [

429 {

430 "matcher": "mcp__github__.*",

431 "hooks": [

432 {

433 "type": "command",

434 "command": "echo \"GitHub tool called: $(jq -r '.tool_name')\" >&2"

435 }

436 ]

437 }

438 ]

439 }

440 }

441 ```

442 </Tab>

443 

444 <Tab title="Clean up on session end">

445 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:

446 

447 ```json theme={null}

448 {

449 "hooks": {

450 "SessionEnd": [

451 {

452 "matcher": "clear",

453 "hooks": [

454 {

455 "type": "command",

456 "command": "rm -f /tmp/claude-scratch-*.txt"

457 }

458 ]

459 }

460 ]

461 }

462 }

463 ```

464 </Tab>

465</Tabs>

466 

467For full matcher syntax, see the [Hooks reference](/en/hooks#configuration).

276 468 

277This hook automatically:469### Configure hook location

278 470 

279* Detects programming languages in unlabeled code blocks471Where you add a hook determines its scope:

280* Adds appropriate language tags for syntax highlighting

281* Fixes excessive blank lines while preserving code content

282* Only processes markdown files (`.md`, `.mdx`)

283 472 

284### Custom Notification Hook473| Location | Scope | Shareable |

474| :--------------------------------------------------------- | :--------------------------------- | :--------------------------------- |

475| `~/.claude/settings.json` | All your projects | No, local to your machine |

476| `.claude/settings.json` | Single project | Yes, can be committed to the repo |

477| `.claude/settings.local.json` | Single project | No, gitignored |

478| Managed policy settings | Organization-wide | Yes, admin-controlled |

479| [Plugin](/en/plugins) `hooks/hooks.json` | When plugin is enabled | Yes, bundled with the plugin |

480| [Skill](/en/skills) or [agent](/en/sub-agents) frontmatter | While the skill or agent is active | Yes, defined in the component file |

285 481 

286Get desktop notifications when Claude needs input:482You 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.

483 

484Hooks 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.

485 

486## Prompt-based hooks

487 

488For 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.

489 

490The model's only job is to return a yes/no decision as JSON:

491 

492* `"ok": true`: the action proceeds

493* `"ok": false`: the action is blocked. The model's `"reason"` is fed back to Claude so it can adjust.

494 

495This 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:

287 496 

288```json theme={null}497```json theme={null}

289{498{

290 "hooks": {499 "hooks": {

291 "Notification": [500 "Stop": [

292 {501 {

293 "matcher": "",

294 "hooks": [502 "hooks": [

295 {503 {

296 "type": "command",504 "type": "prompt",

297 "command": "notify-send 'Claude Code' 'Awaiting your input'"505 "prompt": "Check if all tasks are complete. If not, respond with {\"ok\": false, \"reason\": \"what remains to be done\"}."

298 }506 }

299 ]507 ]

300 }508 }


303}511}

304```512```

305 513 

306### File Protection Hook514For full configuration options, see [Prompt-based hooks](/en/hooks#prompt-based-hooks) in the reference.

515 

516## Agent-based hooks

517 

518When 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.

307 519 

308Block edits to sensitive files:520Agent 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.

521 

522This example verifies that tests pass before allowing Claude to stop:

309 523 

310```json theme={null}524```json theme={null}

311{525{

312 "hooks": {526 "hooks": {

313 "PreToolUse": [527 "Stop": [

314 {528 {

315 "matcher": "Edit|Write",

316 "hooks": [529 "hooks": [

317 {530 {

318 "type": "command",531 "type": "agent",

319 "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)\""532 "prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",

533 "timeout": 120

320 }534 }

321 ]535 ]

322 }536 }


325}539}

326```540```

327 541 

542Use 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.

543 

544For full configuration options, see [Agent-based hooks](/en/hooks#agent-based-hooks) in the reference.

545 

546## Limitations and troubleshooting

547 

548### Limitations

549 

550* Hooks communicate through stdout, stderr, and exit codes only. They cannot trigger slash commands or tool calls directly.

551* Hook timeout is 10 minutes by default, configurable per hook with the `timeout` field (in seconds).

552* `PostToolUse` hooks cannot undo actions since the tool has already executed.

553* `PermissionRequest` hooks do not fire in [non-interactive mode](/en/headless) (`-p`). Use `PreToolUse` hooks for automated permission decisions.

554* `Stop` hooks fire whenever Claude finishes responding, not only at task completion. They do not fire on user interrupts.

555 

556### Hook not firing

557 

558The hook is configured but never executes.

559 

560* Run `/hooks` and confirm the hook appears under the correct event

561* Check that the matcher pattern matches the tool name exactly (matchers are case-sensitive)

562* Verify you're triggering the right event type (e.g., `PreToolUse` fires before tool execution, `PostToolUse` fires after)

563* If using `PermissionRequest` hooks in non-interactive mode (`-p`), switch to `PreToolUse` instead

564 

565### Hook error in output

566 

567You see a message like "PreToolUse hook error: ..." in the transcript.

568 

569* Your script exited with a non-zero code unexpectedly. Test it manually by piping sample JSON:

570 ```bash theme={null}

571 echo '{"tool_name":"Bash","tool_input":{"command":"ls"}}' | ./my-hook.sh

572 echo $? # Check the exit code

573 ```

574* If you see "command not found", use absolute paths or `$CLAUDE_PROJECT_DIR` to reference scripts

575* If you see "jq: command not found", install `jq` or use Python/Node.js for JSON parsing

576* If the script isn't running at all, make it executable: `chmod +x ./my-hook.sh`

577 

578### `/hooks` shows no hooks configured

579 

580You edited a settings file but the hooks don't appear in the menu.

581 

582* Restart your session or open `/hooks` to reload. Hooks added through the `/hooks` menu take effect immediately, but manual file edits require a reload.

583* Verify your JSON is valid (trailing commas and comments are not allowed)

584* Confirm the settings file is in the correct location: `.claude/settings.json` for project hooks, `~/.claude/settings.json` for global hooks

585 

586### Stop hook runs forever

587 

588Claude keeps working in an infinite loop instead of stopping.

589 

590Your 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`:

591 

592```bash theme={null}

593#!/bin/bash

594INPUT=$(cat)

595if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then

596 exit 0 # Allow Claude to stop

597fi

598# ... rest of your hook logic

599```

600 

601### JSON validation failed

602 

603Claude Code shows a JSON parsing error even though your hook script outputs valid JSON.

604 

605When 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:

606 

607```

608Shell ready on arm64

609{"decision": "block", "reason": "Not allowed"}

610```

611 

612Claude 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:

613 

614```bash theme={null}

615# In ~/.zshrc or ~/.bashrc

616if [[ $- == *i* ]]; then

617 echo "Shell ready"

618fi

619```

620 

621The `$-` variable contains shell flags, and `i` means interactive. Hooks run in non-interactive shells, so the echo is skipped.

622 

623### Debug techniques

624 

625Toggle 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.

626 

328## Learn more627## Learn more

329 628 

330* For reference documentation on hooks, see [Hooks reference](/en/hooks).629* [Hooks reference](/en/hooks): full event schemas, JSON output format, async hooks, and MCP tool hooks

331* For comprehensive security best practices and safety guidelines, see [Security Considerations](/en/hooks#security-considerations) in the hooks reference documentation.630* [Security considerations](/en/hooks#security-considerations): review before deploying hooks in shared or production environments

332* For troubleshooting steps and debugging techniques, see [Debugging](/en/hooks#debugging) in the hooks reference631* [Bash command validator example](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py): complete reference implementation

333 documentation.

how-claude-code-works.md +239 −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/ELkJZG54dIaeldDC/images/agentic-loop.svg?fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=e30acfc80d6ff01ec877dd19c7af58b2" 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/ELkJZG54dIaeldDC/images/agentic-loop.svg?w=280&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=8620f6ebce761a1e8bbf7f0a0255cc15 280w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/agentic-loop.svg?w=560&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=7b46b5ff4454aa4a03725eee625b39a0 560w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/agentic-loop.svg?w=840&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=7fa0397bc37d147e3bf3bb6296c6477f 840w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/agentic-loop.svg?w=1100&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=73b2a7040c4c93821c4d5bbee9f4a2d4 1100w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/agentic-loop.svg?w=1650&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=17703cbeb6f59b40a00ab24f56d5f8f9 1650w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/agentic-loop.svg?w=2500&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=20dedb60b95d45a1bd60a0cccaf3e1ff 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 four 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 

64This guide focuses on the terminal. Claude Code also runs in [VS Code, JetBrains IDEs, and other environments](/en/ide-integrations).

65 

66When you run `claude` in a directory, Claude Code gains access to:

67 

68* **Your project.** Files in your directory and subdirectories, plus files elsewhere with your permission.

69* **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.

70* **Your git state.** Current branch, uncommitted changes, and recent commit history.

71* **Your [CLAUDE.md](/en/memory).** A markdown file where you store project-specific instructions, conventions, and context that Claude should know every session.

72* **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.

73 

74Because 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.

75 

76## Work with sessions

77 

78Claude 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.

79 

80**Sessions are ephemeral.** Unlike claude.ai, Claude Code has no persistent memory between sessions. Each new session starts fresh. Claude doesn't "learn" your preferences over time or remember what you worked on last week. If you want Claude to know something across sessions, put it in your [CLAUDE.md](/en/memory).

81 

82### Work across branches

83 

84Each Claude Code conversation is a session tied to your current directory. When you resume, you only see sessions from that directory.

85 

86Claude 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.

87 

88Since 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.

89 

90### Resume or fork sessions

91 

92When 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.

93 

94<img src="https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/session-continuity.svg?fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=f671b603cc856119c95475b9084ebfef" 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/ELkJZG54dIaeldDC/images/session-continuity.svg?w=280&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=bddf1f33d419a27d7427acdf06058804 280w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/session-continuity.svg?w=560&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=417478eb9b86003b8eebaac058a8618a 560w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/session-continuity.svg?w=840&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=1d89d26e2c0487f067d187c3fa5f7170 840w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/session-continuity.svg?w=1100&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=8ea739a1f7860e4edbbcf74d444e37b2 1100w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/session-continuity.svg?w=1650&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=9cb5095d6a8920f04c3b78d31a69c809 1650w, https://mintcdn.com/claude-code/ELkJZG54dIaeldDC/images/session-continuity.svg?w=2500&fit=max&auto=format&n=ELkJZG54dIaeldDC&q=85&s=d67e1744e4878813d20c6c3f39d9459d 2500w" />

95 

96To branch off and try a different approach without affecting the original session, use the `--fork-session` flag:

97 

98```bash theme={null}

99claude --continue --fork-session

100```

101 

102This 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.

103 

104**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.

105 

106### The context window

107 

108Claude'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.

109 

110#### When context fills up

111 

112Claude 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.

113 

114To 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`).

115 

116Run `/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.

117 

118#### Manage context with skills and subagents

119 

120Beyond compaction, you can use other features to control what loads into context.

121 

122[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.

123 

124[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.

125 

126See [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.

127 

128## Stay safe with checkpoints and permissions

129 

130Claude has two safety mechanisms: checkpoints let you undo file changes, and permissions control what Claude can do without asking.

131 

132### Undo changes with checkpoints

133 

134**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.

135 

136Checkpoints 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.

137 

138### Control what Claude can do

139 

140Press `Shift+Tab` to cycle through permission modes:

141 

142* **Default**: Claude asks before file edits and shell commands

143* **Auto-accept edits**: Claude edits files without asking, still asks for commands

144* **Plan mode**: Claude uses read-only tools only, creating a plan you can approve before execution

145 

146You 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.

147 

148***

149 

150## Work effectively with Claude Code

151 

152These tips help you get better results from Claude Code.

153 

154### Ask Claude Code for help

155 

156Claude 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.

157 

158Built-in commands also guide you through setup:

159 

160* `/init` walks you through creating a CLAUDE.md for your project

161* `/agents` helps you configure custom subagents

162* `/doctor` diagnoses common issues with your installation

163 

164### It's a conversation

165 

166Claude Code is conversational. You don't need perfect prompts. Start with what you want, then refine:

167 

168```

169> Fix the login bug

170 

171[Claude investigates, tries something]

172 

173> That's not quite right. The issue is in the session handling.

174 

175[Claude adjusts approach]

176```

177 

178When the first attempt isn't right, you don't start over. You iterate.

179 

180#### Interrupt and steer

181 

182You 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.

183 

184### Be specific upfront

185 

186The more precise your initial prompt, the fewer corrections you'll need. Reference specific files, mention constraints, and point to example patterns.

187 

188```

189> The checkout flow is broken for users with expired cards.

190> Check src/payments/ for the issue, especially token refresh.

191> Write a failing test first, then fix it.

192```

193 

194Vague 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.

195 

196### Give Claude something to verify against

197 

198Claude performs better when it can check its own work. Include test cases, paste screenshots of expected UI, or define the output you want.

199 

200```

201> Implement validateEmail. Test cases: 'user@example.com' → true,

202> 'invalid' → false, 'user@.com' → false. Run the tests after.

203```

204 

205For visual work, paste a screenshot of the design and ask Claude to compare its implementation against it.

206 

207### Explore before implementing

208 

209For complex problems, separate research from coding. Use plan mode (`Shift+Tab` twice) to analyze the codebase first:

210 

211```

212> Read src/auth/ and understand how we handle sessions.

213> Then create a plan for adding OAuth support.

214```

215 

216Review the plan, refine it through conversation, then let Claude implement. This two-phase approach produces better results than jumping straight to code.

217 

218### Delegate, don't dictate

219 

220Think of delegating to a capable colleague. Give context and direction, then trust Claude to figure out the details:

221 

222```

223> The checkout flow is broken for users with expired cards.

224> The relevant code is in src/payments/. Can you investigate and fix it?

225```

226 

227You don't need to specify which files to read or what commands to run. Claude figures that out.

228 

229## What's next

230 

231<CardGroup cols={2}>

232 <Card title="Extend with features" icon="puzzle-piece" href="/en/features-overview">

233 Add Skills, MCP connections, and custom commands

234 </Card>

235 

236 <Card title="Common workflows" icon="graduation-cap" href="/en/common-workflows">

237 Step-by-step guides for typical tasks

238 </Card>

239</CardGroup>

iam.md +0 −201 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 four ways:

8 

9* Claude API via the Claude Console

10* Amazon Bedrock

11* Microsoft Foundry

12* Google Vertex AI

13 

14### Claude API authentication

15 

16**To set up Claude Code access for your team via Claude API:**

17 

181. Use your existing Claude Console account or create a new Claude Console account

192. You can add users through either method below:

20 * Bulk invite users from within the Console (Console -> Settings -> Members -> Invite)

21 * [Set up SSO](https://support.claude.com/en/articles/10280258-setting-up-single-sign-on-on-the-api-console)

223. When inviting users, they need one of the following roles:

23 * "Claude Code" role means users can only create Claude Code API keys

24 * "Developer" role means users can create any kind of API key

254. Each invited user needs to complete these steps:

26 * Accept the Console invite

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

28 * [Install Claude Code](/en/setup#installation)

29 * Login with Console account credentials

30 

31### Cloud provider authentication

32 

33**To set up Claude Code access for your team via Bedrock, Vertex, or Azure:**

34 

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

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

373. Users can [install Claude Code](/en/setup#installation)

38 

39## Access control and permissions

40 

41We 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.

42 

43### Permission system

44 

45Claude Code uses a tiered permission system to balance power and safety:

46 

47| Tool Type | Example | Approval Required | "Yes, don't ask again" Behavior |

48| :---------------- | :------------------- | :---------------- | :-------------------------------------------- |

49| Read-only | File reads, LS, Grep | No | N/A |

50| Bash Commands | Shell execution | Yes | Permanently per project directory and command |

51| File Modification | Edit/write files | Yes | Until session end |

52 

53### Configuring permissions

54 

55You 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.

56 

57* **Allow** rules will allow Claude Code to use the specified tool without further manual approval.

58* **Ask** rules will ask the user for confirmation whenever Claude Code tries to use the specified tool. Ask rules take precedence over allow rules.

59* **Deny** rules will prevent Claude Code from using the specified tool. Deny rules take precedence over allow and ask rules.

60* **Additional directories** extend Claude's file access to directories beyond the initial working directory.

61* **Default mode** controls Claude's permission behavior when encountering new requests.

62 

63Permission rules use the format: `Tool` or `Tool(optional-specifier)`

64 

65A 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.

66 

67#### Permission modes

68 

69Claude Code supports several permission modes that can be set as the `defaultMode` in [settings files](/en/settings#settings-files):

70 

71| Mode | Description |

72| :------------------ | :--------------------------------------------------------------------------- |

73| `default` | Standard behavior - prompts for permission on first use of each tool |

74| `acceptEdits` | Automatically accepts file edit permissions for the session |

75| `plan` | Plan Mode - Claude can analyze but not modify files or execute commands |

76| `bypassPermissions` | Skips all permission prompts (requires safe environment - see warning below) |

77 

78#### Working directories

79 

80By default, Claude has access to files in the directory where it was launched. You can extend this access:

81 

82* **During startup**: Use `--add-dir <path>` CLI argument

83* **During session**: Use `/add-dir` slash command

84* **Persistent configuration**: Add to `additionalDirectories` in [settings files](/en/settings#settings-files)

85 

86Files 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.

87 

88#### Tool-specific permission rules

89 

90Some tools support more fine-grained permission controls:

91 

92**Bash**

93 

94* `Bash(npm run build)` Matches the exact Bash command `npm run build`

95* `Bash(npm run test:*)` Matches Bash commands starting with `npm run test`

96* `Bash(curl http://site.com/:*)` Matches curl commands that start with exactly `curl http://site.com/`

97 

98<Tip>

99 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`

100</Tip>

101 

102<Warning>

103 Important limitations of Bash permission patterns:

104 

105 1. This tool uses **prefix matches**, not regex or glob patterns

106 2. The wildcard `:*` only works at the end of a pattern to match any continuation

107 3. Patterns like `Bash(curl http://github.com/:*)` can be bypassed in many ways:

108 * Options before URL: `curl -X GET http://github.com/...` won't match

109 * Different protocol: `curl https://github.com/...` won't match

110 * Redirects: `curl -L http://bit.ly/xyz` (redirects to github)

111 * Variables: `URL=http://github.com && curl $URL` won't match

112 * Extra spaces: `curl http://github.com` won't match

113 

114 For more reliable URL filtering, consider:

115 

116 * Using the WebFetch tool with `WebFetch(domain:github.com)` permission

117 * Instructing Claude Code about your allowed curl patterns via CLAUDE.md

118 * Using hooks for custom permission validation

119</Warning>

120 

121**Read & Edit**

122 

123`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.

124 

125Read & Edit rules both follow the [gitignore](https://git-scm.com/docs/gitignore) specification with four distinct pattern types:

126 

127| Pattern | Meaning | Example | Matches |

128| ------------------ | -------------------------------------- | -------------------------------- | ---------------------------------- |

129| `//path` | **Absolute** path from filesystem root | `Read(//Users/alice/secrets/**)` | `/Users/alice/secrets/**` |

130| `~/path` | Path from **home** directory | `Read(~/Documents/*.pdf)` | `/Users/alice/Documents/*.pdf` |

131| `/path` | Path **relative to settings file** | `Edit(/src/**/*.ts)` | `<settings file path>/src/**/*.ts` |

132| `path` or `./path` | Path **relative to current directory** | `Read(*.env)` | `<cwd>/*.env` |

133 

134<Warning>

135 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.

136</Warning>

137 

138* `Edit(/docs/**)` - Edits in `<project>/docs/` (NOT `/docs/`!)

139* `Read(~/.zshrc)` - Reads your home directory's `.zshrc`

140* `Edit(//tmp/scratch.txt)` - Edits the absolute path `/tmp/scratch.txt`

141* `Read(src/**)` - Reads from `<current-directory>/src/`

142 

143**WebFetch**

144 

145* `WebFetch(domain:example.com)` Matches fetch requests to example.com

146 

147**MCP**

148 

149* `mcp__puppeteer` Matches any tool provided by the `puppeteer` server (name configured in Claude Code)

150* `mcp__puppeteer__puppeteer_navigate` Matches the `puppeteer_navigate` tool provided by the `puppeteer` server

151 

152<Warning>

153 Unlike other permission types, MCP permissions do NOT support wildcards (`*`).

154 

155 To approve all tools from an MCP server:

156 

157 * ✅ Use: `mcp__github` (approves ALL GitHub tools)

158 * ❌ Don't use: `mcp__github__*` (wildcards are not supported)

159 

160 To approve specific tools only, list each one:

161 

162 * ✅ Use: `mcp__github__get_issue`

163 * ✅ Use: `mcp__github__list_issues`

164</Warning>

165 

166### Additional permission control with hooks

167 

168[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 runs, and the hook output can determine whether to approve or deny the tool call in place of the permission system.

169 

170### Enterprise managed policy settings

171 

172For 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.

173 

174System administrators can deploy policies to:

175 

176* macOS: `/Library/Application Support/ClaudeCode/managed-settings.json`

177* Linux and WSL: `/etc/claude-code/managed-settings.json`

178* Windows: `C:\ProgramData\ClaudeCode\managed-settings.json`

179 

180These policy files follow the same format as regular [settings files](/en/settings#settings-files) but cannot be overridden by user or project settings. This ensures consistent security policies across your organization.

181 

182### Settings precedence

183 

184When multiple settings sources exist, they are applied in the following order (highest to lowest precedence):

185 

1861. Enterprise policies

1872. Command line arguments

1883. Local project settings (`.claude/settings.local.json`)

1894. Shared project settings (`.claude/settings.json`)

1905. User settings (`~/.claude/settings.json`)

191 

192This hierarchy ensures that organizational policies are always enforced while still allowing flexibility at the project and user levels where appropriate.

193 

194## Credential management

195 

196Claude Code securely manages your authentication credentials:

197 

198* **Storage location**: On macOS, API keys, OAuth tokens, and other credentials are stored in the encrypted macOS Keychain.

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

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

201* **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 +167 −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# 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 |

16| `Ctrl+D` | Exit Claude Code session | EOF signal |28| `Ctrl+D` | Exit Claude Code session | EOF signal |

29| `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 |30| `Ctrl+L` | Clear terminal screen | Keeps conversation history |

18| `Ctrl+O` | Toggle verbose output | Shows detailed tool usage and execution |31| `Ctrl+O` | Toggle verbose output | Shows detailed tool usage and execution |

19| `Ctrl+R` | Reverse search command history | Search through previous commands interactively |32| `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 |33| `Ctrl+V` or `Cmd+V` (iTerm2) or `Alt+V` (Windows) | Paste image from clipboard | Pastes an image or path to an image file |

34| `Ctrl+B` | Background running tasks | Backgrounds bash commands and agents. Tmux users press twice |

35| `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 |36| `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 |37| `Esc` + `Esc` | Rewind the code/conversation | Restore the code and/or conversation to a previous point |

23| `Tab` | Toggle [extended thinking](https://docs.claude.com/en/docs/build-with-claude/extended-thinking) | Switch between Thinking on and Thinking off |

24| `Shift+Tab` or `Alt+M` (some configurations) | Toggle permission modes | Switch between Auto-Accept Mode, Plan Mode, and normal mode |38| `Shift+Tab` or `Alt+M` (some configurations) | Toggle permission modes | Switch between Auto-Accept Mode, Plan Mode, and normal mode |

39| `Option+P` (macOS) or `Alt+P` (Windows/Linux) | Switch model | Switch models without clearing your prompt |

40| `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 |

41 

42### Text editing

43 

44| Shortcut | Description | Context |

45| :----------------------- | :--------------------------- | :------------------------------------------------------------------------------------------------------------ |

46| `Ctrl+K` | Delete to end of line | Stores deleted text for pasting |

47| `Ctrl+U` | Delete entire line | Stores deleted text for pasting |

48| `Ctrl+Y` | Paste deleted text | Paste text deleted with `Ctrl+K` or `Ctrl+U` |

49| `Alt+Y` (after `Ctrl+Y`) | Cycle paste history | After pasting, cycle through previously deleted text. Requires [Option as Meta](#keyboard-shortcuts) on macOS |

50| `Alt+B` | Move cursor back one word | Word navigation. Requires [Option as Meta](#keyboard-shortcuts) on macOS |

51| `Alt+F` | Move cursor forward one word | Word navigation. Requires [Option as Meta](#keyboard-shortcuts) on macOS |

52 

53### Theme and display

54 

55| Shortcut | Description | Context |

56| :------- | :----------------------------------------- | :----------------------------------------------------------------------------------------------------------- |

57| `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 |

58 

59<Note>

60 Syntax highlighting is only available in the native build of Claude Code.

61</Note>

25 62 

26### Multiline input63### Multiline input

27 64 

28| Method | Shortcut | Context |65| Method | Shortcut | Context |

29| :--------------- | :------------- | :-------------------------------- |66| :--------------- | :------------- | :------------------------------------------------------ |

30| Quick escape | `\` + `Enter` | Works in all terminals |67| Quick escape | `\` + `Enter` | Works in all terminals |

31| macOS default | `Option+Enter` | Default on macOS |68| macOS default | `Option+Enter` | Default on macOS |

32| Terminal setup | `Shift+Enter` | After `/terminal-setup` |69| Shift+Enter | `Shift+Enter` | Works out of the box in iTerm2, WezTerm, Ghostty, Kitty |

33| Control sequence | `Ctrl+J` | Line feed character for multiline |70| Control sequence | `Ctrl+J` | Line feed character for multiline |

34| Paste mode | Paste directly | For code blocks, logs |71| Paste mode | Paste directly | For code blocks, logs |

35 72 

36<Tip>73<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.74 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>75</Tip>

39 76 

40### Quick commands77### Quick commands

41 78 

42| Shortcut | Description | Notes |79| Shortcut | Description | Notes |

43| :----------- | :--------------------------------- | :------------------------------------------------------------ |80| :----------- | :---------------- | :------------------------------------------------------------------- |

44| `#` at start | Memory shortcut - add to CLAUDE.md | Prompts for file selection |81| `/` 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/slash-commands) |

46| `!` at start | Bash mode | Run commands directly and add execution output to the session |82| `!` at start | Bash mode | Run commands directly and add execution output to the session |

47| `@` | File path mention | Trigger file path autocomplete |83| `@` | File path mention | Trigger file path autocomplete |

48 84 

85## Built-in commands

86 

87Built-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.

88 

89To create your own commands you can invoke with `/`, see [skills](/en/skills).

90 

91| Command | Purpose |

92| :------------------------ | :-------------------------------------------------------------------------------------------------------------------------- |

93| `/clear` | Clear conversation history |

94| `/compact [instructions]` | Compact conversation with optional focus instructions |

95| `/config` | Open the Settings interface (Config tab) |

96| `/context` | Visualize current context usage as a colored grid |

97| `/cost` | Show token usage statistics. See [cost tracking guide](/en/costs#using-the-cost-command) for subscription-specific details. |

98| `/doctor` | Checks the health of your Claude Code installation |

99| `/exit` | Exit the REPL |

100| `/export [filename]` | Export the current conversation to a file or clipboard |

101| `/help` | Get usage help |

102| `/init` | Initialize project with `CLAUDE.md` guide |

103| `/mcp` | Manage MCP server connections and OAuth authentication |

104| `/memory` | Edit `CLAUDE.md` memory files |

105| `/model` | Select or change the AI model |

106| `/permissions` | View or update [permissions](/en/permissions#manage-permissions) |

107| `/plan` | Enter plan mode directly from the prompt |

108| `/rename <name>` | Rename the current session for easier identification |

109| `/resume [session]` | Resume a conversation by ID or name, or open the session picker |

110| `/rewind` | Rewind the conversation and/or code |

111| `/stats` | Visualize daily usage, session history, streaks, and model preferences |

112| `/status` | Open the Settings interface (Status tab) showing version, model, account, and connectivity |

113| `/statusline` | Set up Claude Code's status line UI |

114| `/copy` | Copy the last assistant response to clipboard |

115| `/tasks` | List and manage background tasks |

116| `/teleport` | Resume a remote session from claude.ai (subscribers only) |

117| `/theme` | Change the color theme |

118| `/todos` | List current TODO items |

119| `/usage` | For subscription plans only: show plan usage limits and rate limit status |

120 

121### MCP prompts

122 

123MCP 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.

124 

49## Vim editor mode125## Vim editor mode

50 126 

51Enable vim-style editing with `/vim` command or configure permanently via `/config`.127Enable vim-style editing with `/vim` command or configure permanently via `/config`.


65### Navigation (NORMAL mode)141### Navigation (NORMAL mode)

66 142 

67| Command | Action |143| Command | Action |

68| :-------------- | :------------------------ |144| :-------------- | :-------------------------------------------------- |

69| `h`/`j`/`k`/`l` | Move left/down/up/right |145| `h`/`j`/`k`/`l` | Move left/down/up/right |

70| `w` | Next word |146| `w` | Next word |

71| `e` | End of word |147| `e` | End of word |


75| `^` | First non-blank character |151| `^` | First non-blank character |

76| `gg` | Beginning of input |152| `gg` | Beginning of input |

77| `G` | End of input |153| `G` | End of input |

154| `f{char}` | Jump to next occurrence of character |

155| `F{char}` | Jump to previous occurrence of character |

156| `t{char}` | Jump to just before next occurrence of character |

157| `T{char}` | Jump to just after previous occurrence of character |

158| `;` | Repeat last f/F/t/T motion |

159| `,` | Repeat last f/F/t/T motion in reverse |

160 

161<Note>

162 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.

163</Note>

78 164 

79### Editing (NORMAL mode)165### Editing (NORMAL mode)

80 166 


87| `cc` | Change line |173| `cc` | Change line |

88| `C` | Change to end of line |174| `C` | Change to end of line |

89| `cw`/`ce`/`cb` | Change word/to end/back |175| `cw`/`ce`/`cb` | Change word/to end/back |

176| `yy`/`Y` | Yank (copy) line |

177| `yw`/`ye`/`yb` | Yank word/to end/back |

178| `p` | Paste after cursor |

179| `P` | Paste before cursor |

180| `>>` | Indent line |

181| `<<` | Dedent line |

182| `J` | Join lines |

90| `.` | Repeat last change |183| `.` | Repeat last change |

91 184 

185### Text objects (NORMAL mode)

186 

187Text objects work with operators like `d`, `c`, and `y`:

188 

189| Command | Action |

190| :-------- | :--------------------------------------- |

191| `iw`/`aw` | Inner/around word |

192| `iW`/`aW` | Inner/around WORD (whitespace-delimited) |

193| `i"`/`a"` | Inner/around double quotes |

194| `i'`/`a'` | Inner/around single quotes |

195| `i(`/`a(` | Inner/around parentheses |

196| `i[`/`a[` | Inner/around brackets |

197| `i{`/`a{` | Inner/around braces |

198 

92## Command history199## Command history

93 200 

94Claude Code maintains command history for the current session:201Claude Code maintains command history for the current session:


129 236 

130**Key features:**237**Key features:**

131 238 

132* Output is buffered and Claude can retrieve it using the BashOutput tool239* Output is buffered and Claude can retrieve it using the TaskOutput tool

133* Background tasks have unique IDs for tracking and output retrieval240* Background tasks have unique IDs for tracking and output retrieval

134* Background tasks are automatically cleaned up when Claude Code exits241* Background tasks are automatically cleaned up when Claude Code exits

135 242 

243To 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.

244 

136**Common backgrounded commands:**245**Common backgrounded commands:**

137 246 

138* Build tools (webpack, vite, make)247* Build tools (webpack, vite, make)


157* Shows real-time progress and output266* Shows real-time progress and output

158* Supports the same `Ctrl+B` backgrounding for long-running commands267* Supports the same `Ctrl+B` backgrounding for long-running commands

159* Does not require Claude to interpret or approve the command268* Does not require Claude to interpret or approve the command

269* Supports history-based autocomplete: type a partial command and press **Tab** to complete from previous `!` commands in the current project

160 270 

161This is useful for quick shell operations while maintaining conversation context.271This is useful for quick shell operations while maintaining conversation context.

162 272 

273## Prompt suggestions

274 

275When 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.

276 

277After 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.

278 

279* Press **Tab** to accept the suggestion, or press **Enter** to accept and submit

280* Start typing to dismiss it

281 

282The 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.

283 

284Suggestions are automatically skipped after the first turn of a conversation, in non-interactive mode, and in plan mode.

285 

286To disable prompt suggestions entirely, set the environment variable or toggle the setting in `/config`:

287 

288```bash theme={null}

289export CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=false

290```

291 

292## Task list

293 

294When 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.

295 

296* Press `Ctrl+T` to toggle the task list view. The display shows up to 10 tasks at a time

297* To see all tasks or clear them, ask Claude directly: "show me all tasks" or "clear all tasks"

298* Tasks persist across context compactions, helping Claude stay organized on larger projects

299* 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`

300* To revert to the previous TODO list, set `CLAUDE_CODE_ENABLE_TASKS=false`.

301 

302## PR review status

303 

304When 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:

305 

306* Green: approved

307* Yellow: pending review

308* Red: changes requested

309* Gray: draft

310* Purple: merged

311 

312`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.

313 

314<Note>

315 PR status requires the `gh` CLI to be installed and authenticated (`gh auth login`).

316</Note>

317 

163## See also318## See also

164 319 

165* [Slash commands](/en/slash-commands) - Interactive session commands320* [Skills](/en/skills) - Custom prompts and workflows

166* [Checkpointing](/en/checkpointing) - Rewind Claude's edits and restore previous states321* [Checkpointing](/en/checkpointing) - Rewind Claude's edits and restore previous states

167* [CLI reference](/en/cli-reference) - Command-line flags and options322* [CLI reference](/en/cli-reference) - Command-line flags and options

168* [Settings](/en/settings) - Configuration options323* [Settings](/en/settings) - Configuration options

jetbrains.md +8 −6

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)

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 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 +4 −0

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 to work with LLM gateway solutions. Covers gateway requirements, authentication configuration, model selection, and provider-specific endpoint setup.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.

mcp.md +263 −40

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 

5Claude 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.9 

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.

6 11 

7## What you can do with MCP12## What you can do with MCP

8 13 


10 15 

11* **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."

12* **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."

13* **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."

14* **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"

15* **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."

16 21 


76 81 

77```bash theme={null}82```bash theme={null}

78# Basic syntax83# Basic syntax

79claude mcp add --transport stdio <name> <command> [args...]84claude mcp add [options] <name> -- <command> [args...]

80 85 

81# Real example: Add Airtable server86# Real example: Add Airtable server

82claude mcp add --transport stdio airtable --env AIRTABLE_API_KEY=YOUR_KEY \87claude mcp add --transport stdio --env AIRTABLE_API_KEY=YOUR_KEY airtable \

83 -- npx -y airtable-mcp-server88 -- npx -y airtable-mcp-server

84```89```

85 90 

86<Note>91<Note>

87 **Understanding the "--" parameter:**92 **Important: Option ordering**

88 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.

89 95 

90 For example:96 For example:

91 97 

92 * `claude mcp add --transport stdio myserver -- npx server` → runs `npx server`98 * `claude mcp add --transport stdio myserver -- npx server` → runs `npx server`

93 * `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

94 100 

95 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.

96</Note>102</Note>


113/mcp119/mcp

114```120```

115 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 

116<Tip>126<Tip>

117 Tips:127 Tips:

118 128 


120 * `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)

121 * `project`: Shared with everyone in the project via `.mcp.json` file131 * `project`: Shared with everyone in the project via `.mcp.json` file

122 * `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)

123 * Set environment variables with `--env` flags (e.g., `--env KEY=value`)133 * Set environment variables with `--env` flags (for example, `--env KEY=value`)

124 * 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)

125 * 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`)

126 * 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

127</Tip>137</Tip>

128 138 


208 218 

209### Local scope219### Local scope

210 220 

211Local-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>

212 226 

213```bash theme={null}227```bash theme={null}

214# Add a local-scoped server (default)228# Add a local-scoped server (default)


245 259 

246### User scope260### User scope

247 261 

248User-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.

249 263 

250```bash theme={null}264```bash theme={null}

251# Add a user server265# Add a user server


258 272 

259* **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

260* **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

261* **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>

262 284 

263### Scope hierarchy and precedence285### Scope hierarchy and precedence

264 286 


454 * It reads the Claude Desktop configuration file from its standard location on those platforms476 * It reads the Claude Desktop configuration file from its standard location on those platforms

455 * Use the `--scope user` flag to add servers to your user configuration477 * Use the `--scope user` flag to add servers to your user configuration

456 * Imported servers will have the same names as in Claude Desktop478 * Imported servers will have the same names as in Claude Desktop

457 * If servers with the same names already exist, they will get a numerical suffix (e.g., `server_1`)479 * If servers with the same names already exist, they will get a numerical suffix (for example, `server_1`)

458</Tip>480</Tip>

459 481 

460## Use Claude Code as an MCP server482## Use Claude Code as an MCP server


513 535 

514 * The server provides access to Claude's tools like View, Edit, LS, etc.536 * The server provides access to Claude's tools like View, Edit, LS, etc.

515 * In Claude Desktop, try asking Claude to read files in a directory, make edits, and more.537 * In Claude Desktop, try asking Claude to read files in a directory, make edits, and more.

516 * 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.538 * 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.

517</Tip>539</Tip>

518 540 

519## MCP output limits and warnings541## MCP output limits and warnings


583 * Resources can contain any type of content that the MCP server provides (text, JSON, structured data, etc.)605 * Resources can contain any type of content that the MCP server provides (text, JSON, structured data, etc.)

584</Tip>606</Tip>

585 607 

586## Use MCP prompts as slash commands608## Scale with MCP Tool Search

609 

610When 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.

611 

612### How it works

587 613 

588MCP servers can expose prompts that become available as slash commands in Claude Code.614Claude 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:

615 

6161. MCP tools are deferred rather than loaded into context upfront

6172. Claude uses a search tool to discover relevant MCP tools when needed

6183. Only the tools Claude actually needs are loaded into context

6194. MCP tools continue to work exactly as before from your perspective

620 

621### For MCP server authors

622 

623If 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.

624 

625Add clear, descriptive server instructions that explain:

626 

627* What category of tasks your tools handle

628* When Claude should search for your tools

629* Key capabilities your server provides

630 

631### Configure tool search

632 

633Tool 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.

634 

635Control tool search behavior with the `ENABLE_TOOL_SEARCH` environment variable:

636 

637| Value | Behavior |

638| :--------- | :--------------------------------------------------------------------------------- |

639| `auto` | Activates when MCP tools exceed 10% of context (default) |

640| `auto:<N>` | Activates at custom threshold, where `<N>` is a percentage (e.g., `auto:5` for 5%) |

641| `true` | Always enabled |

642| `false` | Disabled, all MCP tools loaded upfront |

643 

644```bash theme={null}

645# Use a custom 5% threshold

646ENABLE_TOOL_SEARCH=auto:5 claude

647 

648# Disable tool search entirely

649ENABLE_TOOL_SEARCH=false claude

650```

651 

652Or set the value in your [settings.json `env` field](/en/settings#available-settings).

653 

654You can also disable the MCPSearch tool specifically using the `disallowedTools` setting:

655 

656```json theme={null}

657{

658 "permissions": {

659 "deny": ["MCPSearch"]

660 }

661}

662```

663 

664## Use MCP prompts as commands

665 

666MCP servers can expose prompts that become available as commands in Claude Code.

589 667 

590### Execute MCP prompts668### Execute MCP prompts

591 669 


622 * Server and prompt names are normalized (spaces become underscores)700 * Server and prompt names are normalized (spaces become underscores)

623</Tip>701</Tip>

624 702 

625## Enterprise MCP configuration703## Managed MCP configuration

626 704 

627For organizations that need centralized control over MCP servers, Claude Code supports enterprise-managed MCP configurations. This allows IT administrators to:705For organizations that need centralized control over MCP servers, Claude Code supports two configuration options:

706 

7071. **Exclusive control with `managed-mcp.json`**: Deploy a fixed set of MCP servers that users cannot modify or extend

7082. **Policy-based control with allowlists/denylists**: Allow users to add their own servers, but restrict which ones are permitted

709 

710These options allow IT administrators to:

628 711 

629* **Control which MCP servers employees can access**: Deploy a standardized set of approved MCP servers across the organization712* **Control which MCP servers employees can access**: Deploy a standardized set of approved MCP servers across the organization

630* **Prevent unauthorized MCP servers**: Optionally restrict users from adding their own MCP servers713* **Prevent unauthorized MCP servers**: Restrict users from adding unapproved MCP servers

631* **Disable MCP entirely**: Remove MCP functionality completely if needed714* **Disable MCP entirely**: Remove MCP functionality completely if needed

632 715 

633### Setting up enterprise MCP configuration716### Option 1: Exclusive control with managed-mcp.json

717 

718When 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.

634 719 

635System administrators can deploy an enterprise MCP configuration file alongside the managed settings file:720System administrators deploy the configuration file to a system-wide directory:

636 721 

637* **macOS**: `/Library/Application Support/ClaudeCode/managed-mcp.json`722* macOS: `/Library/Application Support/ClaudeCode/managed-mcp.json`

638* **Windows**: `C:\ProgramData\ClaudeCode\managed-mcp.json`723* Linux and WSL: `/etc/claude-code/managed-mcp.json`

639* **Linux**: `/etc/claude-code/managed-mcp.json`724* Windows: `C:\Program Files\ClaudeCode\managed-mcp.json`

725 

726<Note>

727 These are system-wide paths (not user home directories like `~/Library/...`) that require administrator privileges. They are designed to be deployed by IT administrators.

728</Note>

640 729 

641The `managed-mcp.json` file uses the same format as a standard `.mcp.json` file:730The `managed-mcp.json` file uses the same format as a standard `.mcp.json` file:

642 731 


663}752}

664```753```

665 754 

666### Restricting MCP servers with allowlists and denylists755### Option 2: Policy-based control with allowlists and denylists

756 

757Instead 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).

758 

759<Note>

760 **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.

761</Note>

667 762 

668In 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:763#### Restriction options

669 764 

670* **macOS**: `/Library/Application Support/ClaudeCode/managed-settings.json`765Each entry in the allowlist or denylist can restrict servers in three ways:

671* **Windows**: `C:\ProgramData\ClaudeCode\managed-settings.json`766 

672* **Linux**: `/etc/claude-code/managed-settings.json`7671. **By server name** (`serverName`): Matches the configured name of the server

7682. **By command** (`serverCommand`): Matches the exact command and arguments used to start stdio servers

7693. **By URL pattern** (`serverUrl`): Matches remote server URLs with wildcard support

770 

771**Important**: Each entry must have exactly one of `serverName`, `serverCommand`, or `serverUrl`.

772 

773#### Example configuration

673 774 

674```json theme={null}775```json theme={null}

675{776{

676 "allowedMcpServers": [777 "allowedMcpServers": [

778 // Allow by server name

677 { "serverName": "github" },779 { "serverName": "github" },

678 { "serverName": "sentry" },780 { "serverName": "sentry" },

679 { "serverName": "company-internal" }781 

782 // Allow by exact command (for stdio servers)

783 { "serverCommand": ["npx", "-y", "@modelcontextprotocol/server-filesystem"] },

784 { "serverCommand": ["python", "/usr/local/bin/approved-server.py"] },

785 

786 // Allow by URL pattern (for remote servers)

787 { "serverUrl": "https://mcp.company.com/*" },

788 { "serverUrl": "https://*.internal.corp/*" }

680 ],789 ],

681 "deniedMcpServers": [790 "deniedMcpServers": [

682 { "serverName": "filesystem" }791 // Block by server name

792 { "serverName": "dangerous-server" },

793 

794 // Block by exact command (for stdio servers)

795 { "serverCommand": ["npx", "-y", "unapproved-package"] },

796 

797 // Block by URL pattern (for remote servers)

798 { "serverUrl": "https://*.untrusted.com/*" }

683 ]799 ]

684}800}

685```801```

686 802 

687**Allowlist behavior (`allowedMcpServers`)**:803#### How command-based restrictions work

804 

805**Exact matching**:

806 

807* Command arrays must match **exactly** - both the command and all arguments in the correct order

808* Example: `["npx", "-y", "server"]` will NOT match `["npx", "server"]` or `["npx", "-y", "server", "--flag"]`

809 

810**Stdio server behavior**:

811 

812* When the allowlist contains **any** `serverCommand` entries, stdio servers **must** match one of those commands

813* Stdio servers cannot pass by name alone when command restrictions are present

814* This ensures administrators can enforce which commands are allowed to run

815 

816**Non-stdio server behavior**:

817 

818* Remote servers (HTTP, SSE, WebSocket) use URL-based matching when `serverUrl` entries exist in the allowlist

819* If no URL entries exist, remote servers fall back to name-based matching

820* Command restrictions do not apply to remote servers

821 

822#### How URL-based restrictions work

823 

824URL patterns support wildcards using `*` to match any sequence of characters. This is useful for allowing entire domains or subdomains.

825 

826**Wildcard examples**:

827 

828* `https://mcp.company.com/*` - Allow all paths on a specific domain

829* `https://*.example.com/*` - Allow any subdomain of example.com

830* `http://localhost:*/*` - Allow any port on localhost

831 

832**Remote server behavior**:

833 

834* When the allowlist contains **any** `serverUrl` entries, remote servers **must** match one of those URL patterns

835* Remote servers cannot pass by name alone when URL restrictions are present

836* This ensures administrators can enforce which remote endpoints are allowed

837 

838<Accordion title="Example: URL-only allowlist">

839 ```json theme={null}

840 {

841 "allowedMcpServers": [

842 { "serverUrl": "https://mcp.company.com/*" },

843 { "serverUrl": "https://*.internal.corp/*" }

844 ]

845 }

846 ```

847 

848 **Result**:

849 

850 * HTTP server at `https://mcp.company.com/api`: ✅ Allowed (matches URL pattern)

851 * HTTP server at `https://api.internal.corp/mcp`: ✅ Allowed (matches wildcard subdomain)

852 * HTTP server at `https://external.com/mcp`: ❌ Blocked (doesn't match any URL pattern)

853 * Stdio server with any command: ❌ Blocked (no name or command entries to match)

854</Accordion>

855 

856<Accordion title="Example: Command-only allowlist">

857 ```json theme={null}

858 {

859 "allowedMcpServers": [

860 { "serverCommand": ["npx", "-y", "approved-package"] }

861 ]

862 }

863 ```

864 

865 **Result**:

866 

867 * Stdio server with `["npx", "-y", "approved-package"]`: ✅ Allowed (matches command)

868 * Stdio server with `["node", "server.js"]`: ❌ Blocked (doesn't match command)

869 * HTTP server named "my-api": ❌ Blocked (no name entries to match)

870</Accordion>

871 

872<Accordion title="Example: Mixed name and command allowlist">

873 ```json theme={null}

874 {

875 "allowedMcpServers": [

876 { "serverName": "github" },

877 { "serverCommand": ["npx", "-y", "approved-package"] }

878 ]

879 }

880 ```

881 

882 **Result**:

883 

884 * Stdio server named "local-tool" with `["npx", "-y", "approved-package"]`: ✅ Allowed (matches command)

885 * Stdio server named "local-tool" with `["node", "server.js"]`: ❌ Blocked (command entries exist but doesn't match)

886 * Stdio server named "github" with `["node", "server.js"]`: ❌ Blocked (stdio servers must match commands when command entries exist)

887 * HTTP server named "github": ✅ Allowed (matches name)

888 * HTTP server named "other-api": ❌ Blocked (name doesn't match)

889</Accordion>

890 

891<Accordion title="Example: Name-only allowlist">

892 ```json theme={null}

893 {

894 "allowedMcpServers": [

895 { "serverName": "github" },

896 { "serverName": "internal-tool" }

897 ]

898 }

899 ```

900 

901 **Result**:

902 

903 * Stdio server named "github" with any command: ✅ Allowed (no command restrictions)

904 * Stdio server named "internal-tool" with any command: ✅ Allowed (no command restrictions)

905 * HTTP server named "github": ✅ Allowed (matches name)

906 * Any server named "other": ❌ Blocked (name doesn't match)

907</Accordion>

908 

909#### Allowlist behavior (`allowedMcpServers`)

688 910 

689* `undefined` (default): No restrictions - users can configure any MCP server911* `undefined` (default): No restrictions - users can configure any MCP server

690* Empty array `[]`: Complete lockdown - users cannot configure any MCP servers912* Empty array `[]`: Complete lockdown - users cannot configure any MCP servers

691* List of server names: Users can only configure the specified servers913* List of entries: Users can only configure servers that match by name, command, or URL pattern

692 914 

693**Denylist behavior (`deniedMcpServers`)**:915#### Denylist behavior (`deniedMcpServers`)

694 916 

695* `undefined` (default): No servers are blocked917* `undefined` (default): No servers are blocked

696* Empty array `[]`: No servers are blocked918* Empty array `[]`: No servers are blocked

697* List of server names: Specified servers are explicitly blocked across all scopes919* List of entries: Specified servers are explicitly blocked across all scopes

698 920 

699**Important notes**:921#### Important notes

700 922 

701* These restrictions apply to all scopes: user, project, local, and even enterprise servers from `managed-mcp.json`923* **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.

702* **Denylist takes absolute precedence**: If a server appears in both lists, it will be blocked924* **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

925* 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)

703 926 

704<Note>927<Note>

705 **Enterprise configuration precedence**: The enterprise MCP configuration has the highest precedence and cannot be overridden by user, local, or project configurations.928 **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.

706</Note>929</Note>

memory.md +155 −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# 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.


9Claude Code offers four memory locations in a hierarchical structure, each serving a different purpose:13Claude Code offers four memory locations in a hierarchical structure, each serving a different purpose:

10 14 

11| Memory Type | Location | Purpose | Use Case Examples | Shared With |15| Memory Type | Location | Purpose | Use Case Examples | Shared With |

12| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------- |16| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------- | ------------------------------- |

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 |17| **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 |18| **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 |

19| **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) |20| **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) |21| **Project memory (local)** | `./CLAUDE.local.md` | Personal project-specific preferences | Your sandbox URLs, preferred test data | Just you (current project) |

17 22 

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.23All 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.

19 24 

25<Note>

26 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.

27</Note>

28 

20## CLAUDE.md imports29## CLAUDE.md imports

21 30 

22CLAUDE.md files can import additional files using `@path/to/import` syntax. The following example imports 3 files:31CLAUDE.md files can import additional files using `@path/to/import` syntax. The following example imports 3 files:


28- git workflow @docs/git-instructions.md37- git workflow @docs/git-instructions.md

29```38```

30 39 

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.40Both 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`.

41 

42If 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 43 

33```44```

34# Individual Preferences45# Individual Preferences

35- @~/.claude/my-project-instructions.md46- @~/.claude/my-project-instructions.md

36```47```

37 48 

49<Warning>

50 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.

51</Warning>

52 

38To avoid potential collisions, imports are not evaluated inside markdown code spans and code blocks.53To avoid potential collisions, imports are not evaluated inside markdown code spans and code blocks.

39 54 

40```55```


49 64 

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.65Claude 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 66 

52## Quickly add memories with the `#` shortcut67### Load memory from additional directories

53 68 

54The fastest way to add a memory is to start your input with the `#` character:69The `--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 70 

56```71To 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 72 

60You'll be prompted to select which memory file to store this in.73```bash theme={null}

74CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 claude --add-dir ../shared-config

75```

61 76 

62## Directly edit memories with `/memory`77## Directly edit memories with `/memory`

63 78 

64Use the `/memory` slash command during a session to open any memory file in your system editor for more extensive additions or organization.79Use the `/memory` command during a session to open any memory file in your system editor for more extensive additions or organization.

65 80 

66## Set up project memory81## Set up project memory

67 82 


82 * CLAUDE.md memories can be used for both instructions shared with your team and for your individual preferences.97 * CLAUDE.md memories can be used for both instructions shared with your team and for your individual preferences.

83</Tip>98</Tip>

84 99 

100## Modular rules with `.claude/rules/`

101 

102For 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.

103 

104### Basic structure

105 

106Place markdown files in your project's `.claude/rules/` directory:

107 

108```

109your-project/

110├── .claude/

111│ ├── CLAUDE.md # Main project instructions

112│ └── rules/

113│ ├── code-style.md # Code style guidelines

114│ ├── testing.md # Testing conventions

115│ └── security.md # Security requirements

116```

117 

118All `.md` files in `.claude/rules/` are automatically loaded as project memory, with the same priority as `.claude/CLAUDE.md`.

119 

120### Path-specific rules

121 

122Rules 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.

123 

124```markdown theme={null}

125---

126paths:

127 - "src/api/**/*.ts"

128---

129 

130# API Development Rules

131 

132- All API endpoints must include input validation

133- Use the standard error response format

134- Include OpenAPI documentation comments

135```

136 

137Rules without a `paths` field are loaded unconditionally and apply to all files.

138 

139### Glob patterns

140 

141The `paths` field supports standard glob patterns:

142 

143| Pattern | Matches |

144| ---------------------- | ---------------------------------------- |

145| `**/*.ts` | All TypeScript files in any directory |

146| `src/**/*` | All files under `src/` directory |

147| `*.md` | Markdown files in the project root |

148| `src/components/*.tsx` | React components in a specific directory |

149 

150You can specify multiple patterns:

151 

152```markdown theme={null}

153---

154paths:

155 - "src/**/*.ts"

156 - "lib/**/*.ts"

157 - "tests/**/*.test.ts"

158---

159```

160 

161Brace expansion is supported for matching multiple extensions or directories:

162 

163```markdown theme={null}

164---

165paths:

166 - "src/**/*.{ts,tsx}"

167 - "{src,lib}/**/*.ts"

168---

169 

170# TypeScript/React Rules

171```

172 

173This expands `src/**/*.{ts,tsx}` to match both `.ts` and `.tsx` files.

174 

175### Subdirectories

176 

177Rules can be organized into subdirectories for better structure:

178 

179```

180.claude/rules/

181├── frontend/

182│ ├── react.md

183│ └── styles.md

184├── backend/

185│ ├── api.md

186│ └── database.md

187└── general.md

188```

189 

190All `.md` files are discovered recursively.

191 

192### Symlinks

193 

194The `.claude/rules/` directory supports symlinks, allowing you to share common rules across multiple projects:

195 

196```bash theme={null}

197# Symlink a shared rules directory

198ln -s ~/shared-claude-rules .claude/rules/shared

199 

200# Symlink individual rule files

201ln -s ~/company-standards/security.md .claude/rules/security.md

202```

203 

204Symlinks are resolved and their contents are loaded normally. Circular symlinks are detected and handled gracefully.

205 

206### User-level rules

207 

208You can create personal rules that apply to all your projects in `~/.claude/rules/`:

209 

210```

211~/.claude/rules/

212├── preferences.md # Your personal coding preferences

213└── workflows.md # Your preferred workflows

214```

215 

216User-level rules are loaded before project rules, giving project rules higher priority.

217 

218<Tip>

219 Best practices for `.claude/rules/`:

220 

221 * **Keep rules focused**: Each file should cover one topic (e.g., `testing.md`, `api-design.md`)

222 * **Use descriptive filenames**: The filename should indicate what the rules cover

223 * **Use conditional rules sparingly**: Only add `paths` frontmatter when rules truly apply to specific file types

224 * **Organize with subdirectories**: Group related rules (e.g., `frontend/`, `backend/`)

225</Tip>

226 

85## Organization-level memory management227## Organization-level memory management

86 228 

87Enterprise organizations can deploy centrally managed CLAUDE.md files that apply to all users.229Organizations can deploy centrally managed CLAUDE.md files that apply to all users.

88 230 

89To set up organization-level memory management:231To set up organization-level memory management:

90 232 

911. Create the enterprise memory file in the appropriate location for your operating system:2331. 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 234 

972. Deploy via your configuration management system (MDM, Group Policy, Ansible, etc.) to ensure consistent distribution across all developer machines.2352. Deploy via your configuration management system (MDM, Group Policy, Ansible, etc.) to ensure consistent distribution across all developer machines.

98 236 

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 Microsoft Foundry5# Claude Code on Microsoft Foundry

2 6 

3> Learn about configuring Claude Code through Microsoft Foundry, including setup, configuration, and troubleshooting.7> Learn about configuring Claude Code through Microsoft Foundry, including setup, configuration, and troubleshooting.


64# Azure resource name (replace {resource} with your resource name)68# Azure resource name (replace {resource} with your resource name)

65export ANTHROPIC_FOUNDRY_RESOURCE={resource}69export ANTHROPIC_FOUNDRY_RESOURCE={resource}

66# Or provide the full base URL:70# Or provide the full base URL:

67# export ANTHROPIC_FOUNDRY_BASE_URL=https://{resource}.services.ai.azure.com71# export ANTHROPIC_FOUNDRY_BASE_URL=https://{resource}.services.ai.azure.com/anthropic

68 72 

69# Set models to your resource's deployment names73# Set models to your resource's deployment names

70export ANTHROPIC_DEFAULT_SONNET_MODEL='claude-sonnet-4-5'74export ANTHROPIC_DEFAULT_SONNET_MODEL='claude-sonnet-4-5'

model-config.md +6 −2

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`


105You can use the following environment variables, which must be full **model109You can use the following environment variables, which must be full **model

106names** (or equivalent for your API provider), to control the model names that the aliases map to.110names** (or equivalent for your API provider), to control the model names that the aliases map to.

107 111 

108| Env var | Description |112| Environment variable | Description |

109| -------------------------------- | --------------------------------------------------------------------------------------------- |113| -------------------------------- | --------------------------------------------------------------------------------------------- |

110| `ANTHROPIC_DEFAULT_OPUS_MODEL` | The model to use for `opus`, or for `opusplan` when Plan Mode is active. |114| `ANTHROPIC_DEFAULT_OPUS_MODEL` | The model to use for `opus`, or for `opusplan` when Plan Mode is active. |

111| `ANTHROPIC_DEFAULT_SONNET_MODEL` | The model to use for `sonnet`, or for `opusplan` when Plan Mode is not active. |115| `ANTHROPIC_DEFAULT_SONNET_MODEL` | The model to use for `sonnet`, or for `opusplan` when Plan Mode is not active. |


119 123 

120Claude Code automatically uses [prompt caching](https://docs.claude.com/en/docs/build-with-claude/prompt-caching) to optimize performance and reduce costs. You can disable prompt caching globally or for specific model tiers:124Claude Code automatically uses [prompt caching](https://docs.claude.com/en/docs/build-with-claude/prompt-caching) to optimize performance and reduce costs. You can disable prompt caching globally or for specific model tiers:

121 125 

122| Env var | Description |126| Environment variable | Description |

123| ------------------------------- | ---------------------------------------------------------------------------------------------- |127| ------------------------------- | ---------------------------------------------------------------------------------------------- |

124| `DISABLE_PROMPT_CACHING` | Set to `1` to disable prompt caching for all models (takes precedence over per-model settings) |128| `DISABLE_PROMPT_CACHING` | Set to `1` to disable prompt caching for all models (takes precedence over per-model settings) |

125| `DISABLE_PROMPT_CACHING_HAIKU` | Set to `1` to disable prompt caching for Haiku models only |129| `DISABLE_PROMPT_CACHING_HAIKU` | Set to `1` to disable prompt caching for Haiku models only |

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.


6 10 

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.11All 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 12 

9## Quick Start13## Quick start

10 14 

11Configure OpenTelemetry using environment variables:15Configure OpenTelemetry using environment variables:

12 16 


39 43 

40For full configuration options, see the [OpenTelemetry specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options).44For full configuration options, see the [OpenTelemetry specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options).

41 45 

42## Administrator Configuration46## Administrator configuration

43 

44Administrators 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/settings#settings-precedence) for more information about how settings are applied.

45 47 

46The managed settings file is located at:48Administrators 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.

47 

48* macOS: `/Library/Application Support/ClaudeCode/managed-settings.json`

49* Linux and WSL: `/etc/claude-code/managed-settings.json`

50* Windows: `C:\ProgramData\ClaudeCode\managed-settings.json`

51 49 

52Example managed settings configuration:50Example managed settings configuration:

53 51 


68 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.66 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.

69</Note>67</Note>

70 68 

71## Configuration Details69## Configuration details

72 70 

73### Common Configuration Variables71### Common configuration variables

74 72 

75| Environment Variable | Description | Example Values |73| Environment Variable | Description | Example Values |

76| ----------------------------------------------- | --------------------------------------------------------- | ------------------------------------ |74| ----------------------------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------ |

77| `CLAUDE_CODE_ENABLE_TELEMETRY` | Enables telemetry collection (required) | `1` |75| `CLAUDE_CODE_ENABLE_TELEMETRY` | Enables telemetry collection (required) | `1` |

78| `OTEL_METRICS_EXPORTER` | Metrics exporter type(s) (comma-separated) | `console`, `otlp`, `prometheus` |76| `OTEL_METRICS_EXPORTER` | Metrics exporter type(s) (comma-separated) | `console`, `otlp`, `prometheus` |

79| `OTEL_LOGS_EXPORTER` | Logs/events exporter type(s) (comma-separated) | `console`, `otlp` |77| `OTEL_LOGS_EXPORTER` | Logs/events exporter type(s) (comma-separated) | `console`, `otlp` |


89| `OTEL_METRIC_EXPORT_INTERVAL` | Export interval in milliseconds (default: 60000) | `5000`, `60000` |87| `OTEL_METRIC_EXPORT_INTERVAL` | Export interval in milliseconds (default: 60000) | `5000`, `60000` |

90| `OTEL_LOGS_EXPORT_INTERVAL` | Logs export interval in milliseconds (default: 5000) | `1000`, `10000` |88| `OTEL_LOGS_EXPORT_INTERVAL` | Logs export interval in milliseconds (default: 5000) | `1000`, `10000` |

91| `OTEL_LOG_USER_PROMPTS` | Enable logging of user prompt content (default: disabled) | `1` to enable |89| `OTEL_LOG_USER_PROMPTS` | Enable logging of user prompt content (default: disabled) | `1` to enable |

90| `OTEL_LOG_TOOL_DETAILS` | Enable logging of MCP server/tool names and skill names in tool events (default: disabled) | `1` to enable |

91| `CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS` | Interval for refreshing dynamic headers (default: 1740000ms / 29 minutes) | `900000` |

92 92 

93### Metrics Cardinality Control93### Metrics cardinality control

94 94 

95The following environment variables control which attributes are included in metrics to manage cardinality:95The following environment variables control which attributes are included in metrics to manage cardinality:

96 96 


102 102 

103These 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.103These 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.

104 104 

105### Dynamic Headers105### Dynamic headers

106 106 

107For enterprise environments that require dynamic authentication, you can configure a script to generate headers dynamically:107For enterprise environments that require dynamic authentication, you can configure a script to generate headers dynamically:

108 108 

109#### Settings Configuration109#### Settings configuration

110 110 

111Add to your `.claude/settings.json`:111Add to your `.claude/settings.json`:

112 112 


116}116}

117```117```

118 118 

119#### Script Requirements119#### Script requirements

120 120 

121The script must output valid JSON with string key-value pairs representing HTTP headers:121The script must output valid JSON with string key-value pairs representing HTTP headers:

122 122 


126echo "{\"Authorization\": \"Bearer $(get-token.sh)\", \"X-API-Key\": \"$(get-api-key.sh)\"}"126echo "{\"Authorization\": \"Bearer $(get-token.sh)\", \"X-API-Key\": \"$(get-api-key.sh)\"}"

127```127```

128 128 

129#### Important Limitations129#### Refresh behavior

130 

131**Headers are fetched only at startup, not during runtime.** This is due to OpenTelemetry exporter architecture limitations.

132 130 

133For scenarios requiring frequent token refresh, use an OpenTelemetry Collector as a proxy that can refresh its own headers.131The 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.

134 132 

135### Multi-Team Organization Support133### Multi-team organization support

136 134 

137Organizations with multiple teams or departments can add custom attributes to distinguish between different groups using the `OTEL_RESOURCE_ATTRIBUTES` environment variable:135Organizations with multiple teams or departments can add custom attributes to distinguish between different groups using the `OTEL_RESOURCE_ATTRIBUTES` environment variable:

138 136 


172 export OTEL_RESOURCE_ATTRIBUTES="org.name=John%27s%20Organization"170 export OTEL_RESOURCE_ATTRIBUTES="org.name=John%27s%20Organization"

173 ```171 ```

174 172 

175 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.173 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`.

176</Warning>174</Warning>

177 175 

178### Example Configurations176### Example configurations

179 177 

180```bash theme={null}178```bash theme={null}

181# Console debugging (1-second intervals)179# Console debugging (1-second intervals)


220export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317218export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

221```219```

222 220 

223## Available Metrics and Events221## Available metrics and events

224 222 

225### Standard Attributes223### Standard attributes

226 224 

227All metrics and events share these standard attributes:225All metrics and events share these standard attributes:

228 226 

229| Attribute | Description | Controlled By |227| Attribute | Description | Controlled By |

230| ------------------- | ------------------------------------------------------------- | --------------------------------------------------- |228| ------------------- | -------------------------------------------------------------------- | --------------------------------------------------- |

231| `session.id` | Unique session identifier | `OTEL_METRICS_INCLUDE_SESSION_ID` (default: true) |229| `session.id` | Unique session identifier | `OTEL_METRICS_INCLUDE_SESSION_ID` (default: true) |

232| `app.version` | Current Claude Code version | `OTEL_METRICS_INCLUDE_VERSION` (default: false) |230| `app.version` | Current Claude Code version | `OTEL_METRICS_INCLUDE_VERSION` (default: false) |

233| `organization.id` | Organization UUID (when authenticated) | Always included when available |231| `organization.id` | Organization UUID (when authenticated) | Always included when available |

234| `user.account_uuid` | Account UUID (when authenticated) | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID` (default: true) |232| `user.account_uuid` | Account UUID (when authenticated) | `OTEL_METRICS_INCLUDE_ACCOUNT_UUID` (default: true) |

235| `terminal.type` | Terminal type (e.g., `iTerm.app`, `vscode`, `cursor`, `tmux`) | Always included when detected |233| `terminal.type` | Terminal type (for example, `iTerm.app`, `vscode`, `cursor`, `tmux`) | Always included when detected |

236 234 

237### Metrics235### Metrics

238 236 


249| `claude_code.code_edit_tool.decision` | Count of code editing tool permission decisions | count |247| `claude_code.code_edit_tool.decision` | Count of code editing tool permission decisions | count |

250| `claude_code.active_time.total` | Total active time in seconds | s |248| `claude_code.active_time.total` | Total active time in seconds | s |

251 249 

252### Metric Details250### Metric details

253 251 

254#### Session Counter252#### Session counter

255 253 

256Incremented at the start of each session.254Incremented at the start of each session.

257 255 


259 257 

260* All [standard attributes](#standard-attributes)258* All [standard attributes](#standard-attributes)

261 259 

262#### Lines of Code Counter260#### Lines of code counter

263 261 

264Incremented when code is added or removed.262Incremented when code is added or removed.

265 263 


268* All [standard attributes](#standard-attributes)266* All [standard attributes](#standard-attributes)

269* `type`: (`"added"`, `"removed"`)267* `type`: (`"added"`, `"removed"`)

270 268 

271#### Pull Request Counter269#### Pull request counter

272 270 

273Incremented when creating pull requests via Claude Code.271Incremented when creating pull requests via Claude Code.

274 272 


276 274 

277* All [standard attributes](#standard-attributes)275* All [standard attributes](#standard-attributes)

278 276 

279#### Commit Counter277#### Commit counter

280 278 

281Incremented when creating git commits via Claude Code.279Incremented when creating git commits via Claude Code.

282 280 


284 282 

285* All [standard attributes](#standard-attributes)283* All [standard attributes](#standard-attributes)

286 284 

287#### Cost Counter285#### Cost counter

288 286 

289Incremented after each API request.287Incremented after each API request.

290 288 

291**Attributes**:289**Attributes**:

292 290 

293* All [standard attributes](#standard-attributes)291* All [standard attributes](#standard-attributes)

294* `model`: Model identifier (e.g., "claude-sonnet-4-5-20250929")292* `model`: Model identifier (for example, "claude-sonnet-4-5-20250929")

295 293 

296#### Token Counter294#### Token counter

297 295 

298Incremented after each API request.296Incremented after each API request.

299 297 


301 299 

302* All [standard attributes](#standard-attributes)300* All [standard attributes](#standard-attributes)

303* `type`: (`"input"`, `"output"`, `"cacheRead"`, `"cacheCreation"`)301* `type`: (`"input"`, `"output"`, `"cacheRead"`, `"cacheCreation"`)

304* `model`: Model identifier (e.g., "claude-sonnet-4-5-20250929")302* `model`: Model identifier (for example, "claude-sonnet-4-5-20250929")

305 303 

306#### Code Edit Tool Decision Counter304#### Code edit tool decision counter

307 305 

308Incremented when user accepts or rejects Edit, Write, or NotebookEdit tool usage.306Incremented when user accepts or rejects Edit, Write, or NotebookEdit tool usage.

309 307 


312* All [standard attributes](#standard-attributes)310* All [standard attributes](#standard-attributes)

313* `tool`: Tool name (`"Edit"`, `"Write"`, `"NotebookEdit"`)311* `tool`: Tool name (`"Edit"`, `"Write"`, `"NotebookEdit"`)

314* `decision`: User decision (`"accept"`, `"reject"`)312* `decision`: User decision (`"accept"`, `"reject"`)

315* `language`: Programming language of the edited file (e.g., `"TypeScript"`, `"Python"`, `"JavaScript"`, `"Markdown"`). Returns `"unknown"` for unrecognized file extensions.313* `language`: Programming language of the edited file (for example, `"TypeScript"`, `"Python"`, `"JavaScript"`, `"Markdown"`). Returns `"unknown"` for unrecognized file extensions.

316 314 

317#### Active Time Counter315#### Active time counter

318 316 

319Tracks actual time spent actively using Claude Code (not idle time). This metric is incremented during user interactions such as typing prompts or receiving responses.317Tracks actual time spent actively using Claude Code (not idle time). This metric is incremented during user interactions such as typing prompts or receiving responses.

320 318 


326 324 

327Claude Code exports the following events via OpenTelemetry logs/events (when `OTEL_LOGS_EXPORTER` is configured):325Claude Code exports the following events via OpenTelemetry logs/events (when `OTEL_LOGS_EXPORTER` is configured):

328 326 

329#### User Prompt Event327#### User prompt event

330 328 

331Logged when a user submits a prompt.329Logged when a user submits a prompt.

332 330 


337* All [standard attributes](#standard-attributes)335* All [standard attributes](#standard-attributes)

338* `event.name`: `"user_prompt"`336* `event.name`: `"user_prompt"`

339* `event.timestamp`: ISO 8601 timestamp337* `event.timestamp`: ISO 8601 timestamp

338* `event.sequence`: monotonically increasing counter for ordering events within a session

340* `prompt_length`: Length of the prompt339* `prompt_length`: Length of the prompt

341* `prompt`: Prompt content (redacted by default, enable with `OTEL_LOG_USER_PROMPTS=1`)340* `prompt`: Prompt content (redacted by default, enable with `OTEL_LOG_USER_PROMPTS=1`)

342 341 

343#### Tool Result Event342#### Tool result event

344 343 

345Logged when a tool completes execution.344Logged when a tool completes execution.

346 345 


351* All [standard attributes](#standard-attributes)350* All [standard attributes](#standard-attributes)

352* `event.name`: `"tool_result"`351* `event.name`: `"tool_result"`

353* `event.timestamp`: ISO 8601 timestamp352* `event.timestamp`: ISO 8601 timestamp

353* `event.sequence`: monotonically increasing counter for ordering events within a session

354* `tool_name`: Name of the tool354* `tool_name`: Name of the tool

355* `success`: `"true"` or `"false"`355* `success`: `"true"` or `"false"`

356* `duration_ms`: Execution time in milliseconds356* `duration_ms`: Execution time in milliseconds


359* `source`: Decision source - `"config"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`359* `source`: Decision source - `"config"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`

360* `tool_parameters`: JSON string containing tool-specific parameters (when available)360* `tool_parameters`: JSON string containing tool-specific parameters (when available)

361 * For Bash tool: includes `bash_command`, `full_command`, `timeout`, `description`, `sandbox`361 * For Bash tool: includes `bash_command`, `full_command`, `timeout`, `description`, `sandbox`

362 * For MCP tools (when `OTEL_LOG_TOOL_DETAILS=1`): includes `mcp_server_name`, `mcp_tool_name`

363 * For Skill tool (when `OTEL_LOG_TOOL_DETAILS=1`): includes `skill_name`

362 364 

363#### API Request Event365#### API request event

364 366 

365Logged for each API request to Claude.367Logged for each API request to Claude.

366 368 


371* All [standard attributes](#standard-attributes)373* All [standard attributes](#standard-attributes)

372* `event.name`: `"api_request"`374* `event.name`: `"api_request"`

373* `event.timestamp`: ISO 8601 timestamp375* `event.timestamp`: ISO 8601 timestamp

374* `model`: Model used (e.g., "claude-sonnet-4-5-20250929")376* `event.sequence`: monotonically increasing counter for ordering events within a session

377* `model`: Model used (for example, "claude-sonnet-4-5-20250929")

375* `cost_usd`: Estimated cost in USD378* `cost_usd`: Estimated cost in USD

376* `duration_ms`: Request duration in milliseconds379* `duration_ms`: Request duration in milliseconds

377* `input_tokens`: Number of input tokens380* `input_tokens`: Number of input tokens


379* `cache_read_tokens`: Number of tokens read from cache382* `cache_read_tokens`: Number of tokens read from cache

380* `cache_creation_tokens`: Number of tokens used for cache creation383* `cache_creation_tokens`: Number of tokens used for cache creation

381 384 

382#### API Error Event385#### API error event

383 386 

384Logged when an API request to Claude fails.387Logged when an API request to Claude fails.

385 388 


390* All [standard attributes](#standard-attributes)393* All [standard attributes](#standard-attributes)

391* `event.name`: `"api_error"`394* `event.name`: `"api_error"`

392* `event.timestamp`: ISO 8601 timestamp395* `event.timestamp`: ISO 8601 timestamp

393* `model`: Model used (e.g., "claude-sonnet-4-5-20250929")396* `event.sequence`: monotonically increasing counter for ordering events within a session

397* `model`: Model used (for example, "claude-sonnet-4-5-20250929")

394* `error`: Error message398* `error`: Error message

395* `status_code`: HTTP status code (if applicable)399* `status_code`: HTTP status code (if applicable)

396* `duration_ms`: Request duration in milliseconds400* `duration_ms`: Request duration in milliseconds

397* `attempt`: Attempt number (for retried requests)401* `attempt`: Attempt number (for retried requests)

398 402 

399#### Tool Decision Event403#### Tool decision event

400 404 

401Logged when a tool permission decision is made (accept/reject).405Logged when a tool permission decision is made (accept/reject).

402 406 


407* All [standard attributes](#standard-attributes)411* All [standard attributes](#standard-attributes)

408* `event.name`: `"tool_decision"`412* `event.name`: `"tool_decision"`

409* `event.timestamp`: ISO 8601 timestamp413* `event.timestamp`: ISO 8601 timestamp

410* `tool_name`: Name of the tool (e.g., "Read", "Edit", "Write", "NotebookEdit", etc.)414* `event.sequence`: monotonically increasing counter for ordering events within a session

415* `tool_name`: Name of the tool (for example, "Read", "Edit", "Write", "NotebookEdit")

411* `decision`: Either `"accept"` or `"reject"`416* `decision`: Either `"accept"` or `"reject"`

412* `source`: Decision source - `"config"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`417* `source`: Decision source - `"config"`, `"user_permanent"`, `"user_temporary"`, `"user_abort"`, or `"user_reject"`

413 418 

414## Interpreting Metrics and Events Data419## Interpreting metrics and events data

415 420 

416The metrics exported by Claude Code provide valuable insights into usage patterns and productivity. Here are some common visualizations and analyses you can create:421The metrics exported by Claude Code provide valuable insights into usage patterns and productivity. Here are some common visualizations and analyses you can create:

417 422 

418### Usage Monitoring423### Usage monitoring

419 424 

420| Metric | Analysis Opportunity |425| Metric | Analysis Opportunity |

421| ------------------------------------------------------------- | --------------------------------------------------------- |426| ------------------------------------------------------------- | --------------------------------------------------------- |


424| `claude_code.lines_of_code.count` | Measure productivity by tracking code additions/removals |429| `claude_code.lines_of_code.count` | Measure productivity by tracking code additions/removals |

425| `claude_code.commit.count` & `claude_code.pull_request.count` | Understand impact on development workflows |430| `claude_code.commit.count` & `claude_code.pull_request.count` | Understand impact on development workflows |

426 431 

427### Cost Monitoring432### Cost monitoring

428 433 

429The `claude_code.cost.usage` metric helps with:434The `claude_code.cost.usage` metric helps with:

430 435 


435 Cost metrics are approximations. For official billing data, refer to your API provider (Claude Console, AWS Bedrock, or Google Cloud Vertex).440 Cost metrics are approximations. For official billing data, refer to your API provider (Claude Console, AWS Bedrock, or Google Cloud Vertex).

436</Note>441</Note>

437 442 

438### Alerting and Segmentation443### Alerting and segmentation

439 444 

440Common alerts to consider:445Common alerts to consider:

441 446 


445 450 

446All metrics can be segmented by `user.account_uuid`, `organization.id`, `session.id`, `model`, and `app.version`.451All metrics can be segmented by `user.account_uuid`, `organization.id`, `session.id`, `model`, and `app.version`.

447 452 

448### Event Analysis453### Event analysis

449 454 

450The event data provides detailed insights into Claude Code interactions:455The event data provides detailed insights into Claude Code interactions:

451 456 

452**Tool Usage Patterns**: Analyze tool result events to identify:457**Tool Usage Patterns**: analyze tool result events to identify:

453 458 

454* Most frequently used tools459* Most frequently used tools

455* Tool success rates460* Tool success rates

456* Average tool execution times461* Average tool execution times

457* Error patterns by tool type462* Error patterns by tool type

458 463 

459**Performance Monitoring**: Track API request durations and tool execution times to identify performance bottlenecks.464**Performance Monitoring**: track API request durations and tool execution times to identify performance bottlenecks.

460 465 

461## Backend Considerations466## Backend considerations

462 467 

463Your choice of metrics and logs backends will determine the types of analyses you can perform:468Your choice of metrics and logs backends determines the types of analyses you can perform:

464 469 

465### For Metrics:470### For metrics

466 471 

467* **Time series databases (e.g., Prometheus)**: Rate calculations, aggregated metrics472* **Time series databases (for example, Prometheus)**: Rate calculations, aggregated metrics

468* **Columnar stores (e.g., ClickHouse)**: Complex queries, unique user analysis473* **Columnar stores (for example, ClickHouse)**: Complex queries, unique user analysis

469* **Full-featured observability platforms (e.g., Honeycomb, Datadog)**: Advanced querying, visualization, alerting474* **Full-featured observability platforms (for example, Honeycomb, Datadog)**: Advanced querying, visualization, alerting

470 475 

471### For Events/Logs:476### For events/logs

472 477 

473* **Log aggregation systems (e.g., Elasticsearch, Loki)**: Full-text search, log analysis478* **Log aggregation systems (for example, Elasticsearch, Loki)**: Full-text search, log analysis

474* **Columnar stores (e.g., ClickHouse)**: Structured event analysis479* **Columnar stores (for example, ClickHouse)**: Structured event analysis

475* **Full-featured observability platforms (e.g., Honeycomb, Datadog)**: Correlation between metrics and events480* **Full-featured observability platforms (for example, Honeycomb, Datadog)**: Correlation between metrics and events

476 481 

477For organizations requiring Daily/Weekly/Monthly Active User (DAU/WAU/MAU) metrics, consider backends that support efficient unique value queries.482For organizations requiring Daily/Weekly/Monthly Active User (DAU/WAU/MAU) metrics, consider backends that support efficient unique value queries.

478 483 

479## Service Information484## Service information

480 485 

481All metrics and events are exported with the following resource attributes:486All metrics and events are exported with the following resource attributes:

482 487 

483* `service.name`: `claude-code`488* `service.name`: `claude-code`

484* `service.version`: Current Claude Code version489* `service.version`: Current Claude Code version

485* `os.type`: Operating system type (e.g., `linux`, `darwin`, `windows`)490* `os.type`: Operating system type (for example, `linux`, `darwin`, `windows`)

486* `os.version`: Operating system version string491* `os.version`: Operating system version string

487* `host.arch`: Host architecture (e.g., `amd64`, `arm64`)492* `host.arch`: Host architecture (for example, `amd64`, `arm64`)

488* `wsl.version`: WSL version number (only present when running on Windows Subsystem for Linux)493* `wsl.version`: WSL version number (only present when running on Windows Subsystem for Linux)

489* Meter Name: `com.anthropic.claude_code`494* Meter Name: `com.anthropic.claude_code`

490 495 

491## ROI Measurement Resources496## ROI measurement resources

492 497 

493For 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.498For 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.

494 499 

495## Security/Privacy Considerations500## Security/privacy considerations

496 501 

497* Telemetry is opt-in and requires explicit configuration502* Telemetry is opt-in and requires explicit configuration

498* Sensitive information like API keys or file contents are never included in metrics or events503* Sensitive information like API keys or file contents are never included in metrics or events

499* User prompt content is redacted by default - only prompt length is recorded. To enable user prompt logging, set `OTEL_LOG_USER_PROMPTS=1`504* User prompt content is redacted by default, only prompt length is recorded. To enable user prompt logging, set `OTEL_LOG_USER_PROMPTS=1`

505* MCP server/tool names and skill names are not logged by default because they can reveal user-specific configurations. To enable, set `OTEL_LOG_TOOL_DETAILS=1`

500 506 

501## Monitoring Claude Code on Amazon Bedrock507## Monitoring Claude Code on Amazon Bedrock

502 508 

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.

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# Output styles5# Output styles

2 6 

3> Adapt Claude Code for uses beyond software engineering7> Adapt Claude Code for uses beyond software engineering


103settings 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

104about when to use the agent.108about when to use the agent.

105 109 

106### Output Styles vs. [Custom Slash Commands](/en/slash-commands)110### Output Styles vs. [Skills](/en/skills)

107 111 

108You 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.

109commands as "stored prompts".

overview.md +62 −23

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 overview5# Claude Code overview

2 6 

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.7> 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.


6 10 

7Prerequisites:11Prerequisites:

8 12 

9* A [Claude.ai](https://claude.ai) (recommended) or [Claude Console](https://console.anthropic.com/) account13* Meet the [system requirements](/en/setup#system-requirements)

14* A [Claude subscription](https://claude.com/pricing) (Pro, Max, Teams, or Enterprise) or [Claude Console](https://console.anthropic.com/) account

10 15 

11**Install Claude Code:**16**Install Claude Code:**

12 17 

18To install Claude Code, use one of the following methods:

19 

13<Tabs>20<Tabs>

14 <Tab title="macOS/Linux">21 <Tab title="Native Install (Recommended)">

15 ```bash theme={null}22 **macOS, Linux, WSL:**

23 

24 ```bash theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}

16 curl -fsSL https://claude.ai/install.sh | bash25 curl -fsSL https://claude.ai/install.sh | bash

17 ```26 ```

27 

28 **Windows PowerShell:**

29 

30 ```powershell theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}

31 irm https://claude.ai/install.ps1 | iex

32 ```

33 

34 **Windows CMD:**

35 

36 ```batch theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}

37 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

38 ```

39 

40 <Info>

41 Native installations automatically update in the background to keep you on the latest version.

42 </Info>

18 </Tab>43 </Tab>

19 44 

20 <Tab title="Homebrew">45 <Tab title="Homebrew">

21 ```bash theme={null}46 ```sh theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}

22 brew install --cask claude-code47 brew install --cask claude-code

23 ```48 ```

24 </Tab>

25 49 

26 <Tab title="Windows">50 <Info>

27 ```powershell theme={null}51 Homebrew installations do not auto-update. Run `brew upgrade claude-code` periodically to get the latest features and security fixes.

28 irm https://claude.ai/install.ps1 | iex52 </Info>

29 ```

30 </Tab>53 </Tab>

31 54 

32 <Tab title="NPM">55 <Tab title="WinGet">

33 ```bash theme={null}56 ```powershell theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null} theme={null}

34 npm install -g @anthropic-ai/claude-code57 winget install Anthropic.ClaudeCode

35 ```58 ```

36 59 

37 Requires [Node.js 18+](https://nodejs.org/en/download/)60 <Info>

61 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

62 </Info>

38 </Tab>63 </Tab>

39</Tabs>64</Tabs>

40 65 


45claude70claude

46```71```

47 72 

48You'll be prompted to log in on first use. That's it! [Continue with Quickstart (5 mins) →](/en/quickstart)73You'll be prompted to log in on first use. That's it! [Continue with Quickstart (5 minutes) →](/en/quickstart)

49 74 

50<Tip>75<Tip>

51 See [advanced setup](/en/setup) for installation options or [troubleshooting](/en/troubleshooting) if you hit issues.76 See [advanced setup](/en/setup) for installation options, manual updates, or uninstallation instructions. Visit [troubleshooting](/en/troubleshooting) if you hit issues.

52</Tip>77</Tip>

53 78 

54<Note>

55 **New VS Code Extension (Beta)**: Prefer a graphical interface? Our new [VS Code extension](/en/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.

56</Note>

57 

58## What Claude Code does for you79## What Claude Code does for you

59 80 

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.81* **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.

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.82* **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.

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/mcp) can pull from external datasources like Google Drive, Figma, and Slack.83* **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/mcp) can pull from external data sources 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.84* **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 85 

65## Why developers love Claude Code86## Why developers love Claude Code


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"`.90* **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/security), [privacy](/en/data-usage), and [compliance](https://trust.anthropic.com/) is built-in.91* **Enterprise-ready**: Use the Claude API, or host on AWS or GCP. Enterprise-grade [security](/en/security), [privacy](/en/data-usage), and [compliance](https://trust.anthropic.com/) is built-in.

71 92 

93## Use Claude Code everywhere

94 

95Claude Code works across your development environment: in your terminal, in your IDE, in the cloud, and in Slack.

96 

97* **[Terminal (CLI)](/en/quickstart)**: the core Claude Code experience. Run `claude` in any terminal to start coding.

98* **[Claude Code on the web](/en/claude-code-on-the-web)**: use Claude Code from your browser at [claude.ai/code](https://claude.ai/code) or the Claude iOS app, with no local setup required. Run tasks in parallel, work on repos you don't have locally, and review changes in a built-in diff view.

99* **[Desktop app](/en/desktop)**: a standalone application with diff review, parallel sessions via git worktrees, and the ability to launch cloud sessions.

100* **[VS Code](/en/vs-code)**: a native extension with inline diffs, @-mentions, and plan review.

101* **[JetBrains IDEs](/en/jetbrains)**: a plugin for IntelliJ IDEA, PyCharm, WebStorm, and other JetBrains IDEs with IDE diff viewing and context sharing.

102* **[GitHub Actions](/en/github-actions)**: automate code review, issue triage, and other workflows in CI/CD with `@claude` mentions.

103* **[GitLab CI/CD](/en/gitlab-ci-cd)**: event-driven automation for GitLab merge requests and issues.

104* **[Slack](/en/slack)**: mention Claude in Slack to route coding tasks to Claude Code on the web and get PRs back.

105* **[Chrome](/en/chrome)**: connect Claude Code to your browser for live debugging, design verification, and web app testing.

106 

72## Next steps107## Next steps

73 108 

74<CardGroup>109<CardGroup>


84 Solutions for common issues with Claude Code119 Solutions for common issues with Claude Code

85 </Card>120 </Card>

86 121 

87 <Card title="IDE setup" icon="laptop" href="/en/vs-code">122 <Card title="Desktop app" icon="laptop" href="/en/desktop">

88 Add Claude Code to your IDE123 Run Claude Code as a standalone application

89 </Card>124 </Card>

90</CardGroup>125</CardGroup>

91 126 

92## Additional resources127## Additional resources

93 128 

94<CardGroup>129<CardGroup>

95 <Card title="Build with the Agent SDK" icon="code-branch" href="https://docs.claude.com/en/docs/agent-sdk/overview">130 <Card title="About Claude Code" icon="sparkles" href="https://claude.com/product/claude-code">

131 Learn more about Claude Code on claude.com

132 </Card>

133 

134 <Card title="Build with the Agent SDK" icon="code-branch" href="https://platform.claude.com/docs/en/agent-sdk/overview">

96 Create custom AI agents with the Claude Agent SDK135 Create custom AI agents with the Claude Agent SDK

97 </Card>136 </Card>

98 137 

permissions.md +257 −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 settings file** | `Edit(/src/**/*.ts)` | `<settings file path>/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 your settings file. Use `//Users/alice/file` for absolute paths.

147</Warning>

148 

149Examples:

150 

151* `Edit(/docs/**)`: edits in `<project>/docs/` (NOT `/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.json` files to system directories. These policy files follow the same format as regular settings files and cannot be overridden by user or project settings.

219 

220**Managed settings file locations**:

221 

222* **macOS**: `/Library/Application Support/ClaudeCode/managed-settings.json`

223* **Linux and WSL**: `/etc/claude-code/managed-settings.json`

224* **Windows**: `C:\Program Files\ClaudeCode\managed-settings.json`

225 

226<Note>

227 These are system-wide paths (not user home directories like `~/Library/...`) that require administrator privileges. They are designed to be deployed by IT administrators.

228</Note>

229 

230### Managed-only settings

231 

232Some settings are only effective in managed settings:

233 

234| Setting | Description |

235| :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |

236| `disableBypassPermissionsMode` | Set to `"disable"` to prevent `bypassPermissions` mode and the `--dangerously-skip-permissions` flag |

237| `allowManagedPermissionRulesOnly` | When `true`, prevents user and project settings from defining `allow`, `ask`, or `deny` permission rules. Only rules in managed settings apply |

238| `allowManagedHooksOnly` | When `true`, prevents loading of user, project, and plugin hooks. Only managed hooks and SDK hooks are allowed |

239| `strictKnownMarketplaces` | Controls which plugin marketplaces users can add. See [managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions) |

240 

241## Settings precedence

242 

243Permission 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.

244 

245If a permission is allowed in user settings but denied in project settings, the project setting takes precedence and the permission is blocked.

246 

247## Example configurations

248 

249This [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.

250 

251## See also

252 

253* [Settings](/en/settings): complete configuration reference including the permission settings table

254* [Sandboxing](/en/sandboxing): OS-level filesystem and network isolation for Bash commands

255* [Authentication](/en/authentication): set up user access to Claude Code

256* [Security](/en/security): security safeguards and best practices

257* [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 10 

24Add marketplaces using the `/plugin marketplace` commands to access plugins from different sources:11Looking to install plugins from an existing marketplace? See [Discover and install prebuilt plugins](/en/discover-plugins).

25 12 

26### Add GitHub marketplaces13## Overview

27 

28```shell Add a GitHub repository containing .claude-plugin/marketplace.json theme={null}

29/plugin marketplace add owner/repo

30```

31 

32### Add Git repositories

33 

34```shell Add any git repository theme={null}

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>

87 

88 <Step title="Add and install">

89 Add the marketplace and install the plugin.

90 

91 ```shell theme={null}

92 /plugin marketplace add ./my-marketplace

93 /plugin install review-plugin@my-plugins

94 ```

95 </Step>

94 96 

95When team members trust the repository folder, Claude Code automatically installs these marketplaces and any plugins specified in the `enabledPlugins` field.97 <Step title="Try it out">

98 Select some code in your editor and run your new command.

96 99 

97***100 ```shell theme={null}

101 /review

102 ```

103 </Step>

104</Steps>

98 105 

99## Create your own marketplace106To learn more about what plugins can do, including hooks, agents, MCP servers, and LSP servers, see [Plugins](/en/plugins).

100 107 

101Build and distribute custom plugin collections for your team or community.108<Note>

109 **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.

102 110 

103### Prerequisites for marketplace creation111 If you need to share files across plugins, use symlinks (which are followed during copying) or restructure your marketplace so the shared directory is inside the plugin source path. See [Plugin caching and file resolution](/en/plugins-reference#plugin-caching-and-file-resolution) for details.

112</Note>

104 113 

105* Git repository (GitHub, GitLab, or other git hosting)114## Create the marketplace file

106* Understanding of JSON file format

107* One or more plugins to distribute

108 115 

109### Create the marketplace file116Create `.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.

110 117 

111Create `.claude-plugin/marketplace.json` in your repository root: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

164 

165| Field | Type | Required | Description |

166| :------ | :----- | :------- | :------------------------------- |

167| `name` | string | Yes | Name of the maintainer or team |

168| `email` | string | No | Contact email for the maintainer |

151 169 

152#### Optional metadata170### 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 plugins need their own `plugin.json` file. When `true` (default), the plugin source must contain a `plugin.json`, and any fields you add here in the marketplace entry get merged with it. When `false`, the plugin doesn't need its own `plugin.json`; the marketplace entry itself defines everything about the plugin. Use `false` when you want to define simple plugins entirely in your marketplace file. |

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 |

198 215 

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>*216## Plugin sources

200 

201### Plugin sources

202 217 

203#### Relative paths218### Relative paths

204 219 

205For plugins in the same repository:220For plugins in the same repository:

206 221 


211}226}

212```227```

213 228 

214#### GitHub repositories229<Note>

230 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.

231</Note>

232 

233### GitHub repositories

215 234 

216```json theme={null}235```json theme={null}

217{236{


223}242}

224```243```

225 244 

226#### Git repositories245You can pin to a specific branch, tag, or commit:

246 

247```json theme={null}

248{

249 "name": "github-plugin",

250 "source": {

251 "source": "github",

252 "repo": "owner/plugin-repo",

253 "ref": "v2.0.0",

254 "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"

255 }

256}

257```

258 

259| Field | Type | Description |

260| :----- | :----- | :-------------------------------------------------------------------- |

261| `repo` | string | Required. GitHub repository in `owner/repo` format |

262| `ref` | string | Optional. Git branch or tag (defaults to repository default branch) |

263| `sha` | string | Optional. Full 40-character git commit SHA to pin to an exact version |

264 

265### Git repositories

227 266 

228```json theme={null}267```json theme={null}

229{268{


235}274}

236```275```

237 276 

238#### Advanced plugin entries277You can pin to a specific branch, tag, or commit:

278 

279```json theme={null}

280{

281 "name": "git-plugin",

282 "source": {

283 "source": "url",

284 "url": "https://gitlab.com/team/plugin.git",

285 "ref": "main",

286 "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"

287 }

288}

289```

290 

291| Field | Type | Description |

292| :---- | :----- | :-------------------------------------------------------------------- |

293| `url` | string | Required. Full git repository URL (must end with `.git`) |

294| `ref` | string | Optional. Git branch or tag (defaults to repository default branch) |

295| `sha` | string | Optional. Full 40-character git commit SHA to pin to an exact version |

296 

297### Advanced plugin entries

239 298 

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/plugins-reference#environment-variables)):299This example shows a plugin entry using many of the optional fields, including custom paths for commands, agents, hooks, and MCP servers:

241 300 

242```json theme={null}301```json theme={null}

243{302{


250 "version": "2.1.0",309 "version": "2.1.0",

251 "author": {310 "author": {

252 "name": "Enterprise Team",311 "name": "Enterprise Team",

253 "email": "enterprise@company.com"312 "email": "enterprise@example.com"

254 },313 },

255 "homepage": "https://docs.company.com/plugins/enterprise-tools",314 "homepage": "https://docs.example.com/plugins/enterprise-tools",

256 "repository": "https://github.com/company/enterprise-plugin",315 "repository": "https://github.com/company/enterprise-plugin",

257 "license": "MIT",316 "license": "MIT",

258 "keywords": ["enterprise", "workflow", "automation"],317 "keywords": ["enterprise", "workflow", "automation"],


262 "./commands/enterprise/",321 "./commands/enterprise/",

263 "./commands/experimental/preview.md"322 "./commands/experimental/preview.md"

264 ],323 ],

265 "agents": [324 "agents": ["./agents/security-reviewer.md", "./agents/compliance-checker.md"],

266 "./agents/security-reviewer.md",

267 "./agents/compliance-checker.md"

268 ],

269 "hooks": {325 "hooks": {

270 "PostToolUse": [326 "PostToolUse": [

271 {327 {

272 "matcher": "Write|Edit",328 "matcher": "Write|Edit",

273 "hooks": [{"type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"}]329 "hooks": [

330 {

331 "type": "command",

332 "command": "${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"

333 }

334 ]

274 }335 }

275 ]336 ]

276 },337 },


284}345}

285```346```

286 347 

287<Note>348Key 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 349 

291***350* **`commands` and `agents`**: You can specify multiple directories or individual files. Paths are relative to the plugin root.

351* **`${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.

352* **`strict: false`**: Since this is set to false, the plugin doesn't need its own `plugin.json`. The marketplace entry defines everything.

292 353 

293## Host and distribute marketplaces354## Host and distribute marketplaces

294 355 

295Choose the best hosting strategy for your plugin distribution needs.

296 

297### Host on GitHub (recommended)356### Host on GitHub (recommended)

298 357 

299GitHub provides the easiest distribution method:358GitHub provides the easiest distribution method:

300 359 

3011. **Create a repository**: Set up a new repository for your marketplace3601. **Create a repository**: Set up a new repository for your marketplace

3022. **Add marketplace file**: Create `.claude-plugin/marketplace.json` with your plugin definitions3612. **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`3623. **Share with teams**: Users add your marketplace with `/plugin marketplace add owner/repo`

304 363 

305**Benefits**: Built-in version control, issue tracking, and team collaboration features.364**Benefits**: Built-in version control, issue tracking, and team collaboration features.

306 365 

307### Host on other git services366### Host on other git services

308 367 

309Any git hosting service works for marketplace distribution, using a URL to an arbitrary git repository.368Any 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 369 

313```shell theme={null}370```shell theme={null}

314/plugin marketplace add https://gitlab.com/company/plugins.git371/plugin marketplace add https://gitlab.com/company/plugins.git

315```372```

316 373 

317### Use local marketplaces for development374### Private repositories

318 375 

319Test your marketplace locally before distribution:376Claude 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 377 

321```shell Add local marketplace for testing theme={null}378Background 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-marketplace379 

380| Provider | Environment variables | Notes |

381| :-------- | :--------------------------- | :---------------------------------------- |

382| GitHub | `GITHUB_TOKEN` or `GH_TOKEN` | Personal access token or GitHub App token |

383| GitLab | `GITLAB_TOKEN` or `GL_TOKEN` | Personal access token or project token |

384| Bitbucket | `BITBUCKET_TOKEN` | App password or repository access token |

385 

386Set the token in your shell configuration (for example, `.bashrc`, `.zshrc`) or pass it when running Claude Code:

387 

388```bash theme={null}

389export GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxx

323```390```

324 391 

325```shell Test plugin installation theme={null}392<Note>

393 For CI/CD environments, configure the token as a secret environment variable. GitHub Actions automatically provides `GITHUB_TOKEN` for repositories in the same organization.

394</Note>

395 

396### Test locally before distribution

397 

398Test your marketplace locally before sharing:

399 

400```shell theme={null}

401/plugin marketplace add ./my-local-marketplace

326/plugin install test-plugin@my-local-marketplace402/plugin install test-plugin@my-local-marketplace

327```403```

328 404 

329## Manage marketplace operations405For the full range of add commands (GitHub, Git URLs, local paths, remote URLs), see [Add marketplaces](/en/discover-plugins#add-marketplaces).

330 406 

331### List known marketplaces407### Require marketplaces for your team

332 408 

333```shell List all configured marketplaces theme={null}409You 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`:

334/plugin marketplace list410 

411```json theme={null}

412{

413 "extraKnownMarketplaces": {

414 "company-tools": {

415 "source": {

416 "source": "github",

417 "repo": "your-org/claude-plugins"

418 }

419 }

420 }

421}

335```422```

336 423 

337Shows all configured marketplaces with their sources and status.424You can also specify which plugins should be enabled by default:

425 

426```json theme={null}

427{

428 "enabledPlugins": {

429 "code-formatter@company-tools": true,

430 "deployment-tools@company-tools": true

431 }

432}

433```

434 

435For full configuration options, see [Plugin settings](/en/settings#plugin-settings).

436 

437### Managed marketplace restrictions

438 

439For 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.

338 440 

339### Update marketplace metadata441When `strictKnownMarketplaces` is configured in managed settings, the restriction behavior depends on the value:

340 442 

341```shell Refresh marketplace metadata theme={null}443| Value | Behavior |

342/plugin marketplace update marketplace-name444| ------------------- | ---------------------------------------------------------------- |

445| Undefined (default) | No restrictions. Users can add any marketplace |

446| Empty array `[]` | Complete lockdown. Users cannot add any new marketplaces |

447| List of sources | Users can only add marketplaces that match the allowlist exactly |

448 

449#### Common configurations

450 

451Disable all marketplace additions:

452 

453```json theme={null}

454{

455 "strictKnownMarketplaces": []

456}

343```457```

344 458 

345Refreshes plugin listings and metadata from the marketplace source.459Allow specific marketplaces only:

346 460 

347### Remove a marketplace461```json theme={null}

462{

463 "strictKnownMarketplaces": [

464 {

465 "source": "github",

466 "repo": "acme-corp/approved-plugins"

467 },

468 {

469 "source": "github",

470 "repo": "acme-corp/security-tools",

471 "ref": "v2.0"

472 },

473 {

474 "source": "url",

475 "url": "https://plugins.example.com/marketplace.json"

476 }

477 ]

478}

479```

480 

481Allow all marketplaces from an internal git server using regex pattern matching:

348 482 

349```shell Remove a marketplace theme={null}483```json theme={null}

350/plugin marketplace remove marketplace-name484{

485 "strictKnownMarketplaces": [

486 {

487 "source": "hostPattern",

488 "hostPattern": "^github\\.example\\.com$"

489 }

490 ]

491}

351```492```

352 493 

353Removes the marketplace from your configuration.494#### How restrictions work

495 

496Restrictions are validated early in the plugin installation process, before any network requests or filesystem operations occur. This prevents unauthorized marketplace access attempts.

497 

498The allowlist uses exact matching for most source types. For a marketplace to be allowed, all specified fields must match exactly:

354 499 

355<Warning>500* For GitHub sources: `repo` is required, and `ref` or `path` must also match if specified in the allowlist

356 Removing a marketplace will uninstall any plugins you installed from it.501* For URL sources: the full URL must match exactly

357</Warning>502* For `hostPattern` sources: the marketplace host is matched against the regex pattern

358 503 

359***504Because `strictKnownMarketplaces` is set in [managed settings](/en/settings#settings-files), individual users and project configurations cannot override these restrictions.

360 505 

361## Troubleshooting marketplaces506For complete configuration details including all supported source types and comparison with `extraKnownMarketplaces`, see the [strictKnownMarketplaces reference](/en/settings#strictknownmarketplaces).

362 507 

363### Common marketplace issues508## Validation and testing

364 509 

365#### Marketplace not loading510Test your marketplace before sharing.

511 

512Validate your marketplace JSON syntax:

513 

514```bash theme={null}

515claude plugin validate .

516```

517 

518Or from within Claude Code:

519 

520```shell theme={null}

521/plugin validate .

522```

523 

524Add the marketplace for testing:

525 

526```shell theme={null}

527/plugin marketplace add ./path/to/marketplace

528```

529 

530Install a test plugin to verify everything works:

531 

532```shell theme={null}

533/plugin install test-plugin@marketplace-name

534```

535 

536For complete plugin testing workflows, see [Test your plugins locally](/en/plugins#test-your-plugins-locally). For technical troubleshooting, see [Plugins reference](/en/plugins-reference).

537 

538## Troubleshooting

539 

540### Marketplace not loading

366 541 

367**Symptoms**: Can't add marketplace or see plugins from it542**Symptoms**: Can't add marketplace or see plugins from it

368 543 


370 545 

371* Verify the marketplace URL is accessible546* Verify the marketplace URL is accessible

372* Check that `.claude-plugin/marketplace.json` exists at the specified path547* Check that `.claude-plugin/marketplace.json` exists at the specified path

373* Ensure JSON syntax is valid using `claude plugin validate`548* Ensure JSON syntax is valid using `claude plugin validate` or `/plugin validate`

374* For private repositories, confirm you have access permissions549* For private repositories, confirm you have access permissions

375 550 

376#### Plugin installation failures551### Marketplace validation errors

552 

553Run `claude plugin validate .` or `/plugin validate .` from your marketplace directory to check for issues. Common errors:

554 

555| Error | Cause | Solution |

556| :------------------------------------------------ | :------------------------------ | :------------------------------------------------------------ |

557| `File not found: .claude-plugin/marketplace.json` | Missing manifest | Create `.claude-plugin/marketplace.json` with required fields |

558| `Invalid JSON syntax: Unexpected token...` | JSON syntax error | Check for missing commas, extra commas, or unquoted strings |

559| `Duplicate plugin name "x" found in marketplace` | Two plugins share the same name | Give each plugin a unique `name` value |

560| `plugins[0].source: Path traversal not allowed` | Source path contains `..` | Use paths relative to marketplace root without `..` |

561 

562**Warnings** (non-blocking):

563 

564* `Marketplace has no plugins defined`: add at least one plugin to the `plugins` array

565* `No marketplace description provided`: add `metadata.description` to help users understand your marketplace

566* `Plugin "x" uses npm source which is not yet fully implemented`: use `github` or local path sources instead

567 

568### Plugin installation failures

377 569 

378**Symptoms**: Marketplace appears but plugin installation fails570**Symptoms**: Marketplace appears but plugin installation fails

379 571 


384* For GitHub sources, ensure repositories are public or you have access576* For GitHub sources, ensure repositories are public or you have access

385* Test plugin sources manually by cloning/downloading577* Test plugin sources manually by cloning/downloading

386 578 

387### Validation and testing579### Private repository authentication fails

388 580 

389Test your marketplace before sharing:581**Symptoms**: Authentication errors when installing plugins from private repositories

390 582 

391```bash Validate marketplace JSON syntax theme={null}583**Solutions**:

392claude plugin validate .

393```

394 584 

395```shell Add marketplace for testing theme={null}585For manual installation and updates:

396/plugin marketplace add ./path/to/marketplace

397```

398 586 

399```shell Install test plugin theme={null}587* Verify you're authenticated with your git provider (for example, run `gh auth status` for GitHub)

400/plugin install test-plugin@marketplace-name588* Check that your credential helper is configured correctly: `git config --global credential.helper`

401```589* Try cloning the repository manually to verify your credentials work

402 590 

403For complete plugin testing workflows, see [Test your plugins locally](/en/plugins#test-your-plugins-locally). For technical troubleshooting, see [Plugins reference](/en/plugins-reference).591For background auto-updates:

592 

593* Set the appropriate token in your environment: `echo $GITHUB_TOKEN`

594* Check that the token has the required permissions (read access to the repository)

595* For GitHub, ensure the token has the `repo` scope for private repositories

596* For GitLab, ensure the token has at least `read_repository` scope

597* Verify the token hasn't expired

598 

599### Plugins with relative paths fail in URL-based marketplaces

404 600 

405***601**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 602 

407## Next steps603**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.

604 

605**Solutions**:

408 606 

409### For marketplace users607* **Use external sources**: Change plugin entries to use GitHub, npm, or git URL sources instead of relative paths:

608 ```json theme={null}

609 { "name": "my-plugin", "source": { "source": "github", "repo": "owner/repo" } }

610 ```

611* **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 612 

411* **Discover community marketplaces**: Search GitHub for Claude Code plugin collections613### 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 614 

415### For marketplace creators615**Symptoms**: Plugin installs but references to files fail, especially files outside the plugin directory

416 616 

417* **Build plugin collections**: Create themed marketplace around specific use cases617**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 618 

422### For organizations619**Solutions**: See [Plugin caching and file resolution](/en/plugins-reference#plugin-caching-and-file-resolution) for workarounds including symlinks and directory restructuring.

423 620 

424* **Private marketplaces**: Set up internal marketplaces for proprietary tools621For 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 622 

428## See also623## See also

429 624 

430* [Plugins](/en/plugins) - Installing and using plugins625* [Discover and install prebuilt plugins](/en/discover-plugins) - Installing plugins from existing marketplaces

626* [Plugins](/en/plugins) - Creating your own plugins

431* [Plugins reference](/en/plugins-reference) - Complete technical specifications and schemas627* [Plugins reference](/en/plugins-reference) - Complete technical specifications and schemas

432* [Plugin development](/en/plugins#develop-more-complex-plugins) - Creating your own plugins628* [Plugin settings](/en/settings#plugin-settings) - Plugin configuration options

433* [Settings](/en/settings#plugin-configuration) - Plugin configuration options629* [strictKnownMarketplaces reference](/en/settings#strictknownmarketplaces) - Managed marketplace restrictions

plugins.md +272 −253

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/plugins-reference). For marketplace management, see [Plugin marketplaces](/en/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/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 command:

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 command 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 `hello.md` file:

144 

145 ```markdown my-first-plugin/commands/hello.md theme={null}

146 ---

147 description: Greet the user with a personalized message

148 ---

149 

150 # Hello Command

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 command 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* **Commands directory** (`commands/`): 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 only `plugin.json` manifest (required) |

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 |

146 192 

147<Note>193<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/plugins-reference).194 **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>195</Note>

150 196 

151***197## Develop more complex plugins

152 

153## Install and manage plugins

154 

155Learn how to discover, install, and manage plugins to extend your Claude Code capabilities.

156 198 

157### Prerequisites199Once you're comfortable with basic plugins, you can create more sophisticated extensions.

158 200 

159* Claude Code installed and running201### Add Skills to your plugin

160* Basic familiarity with command-line interfaces

161 202 

162### Add marketplaces203Plugins can include [Agent Skills](/en/skills) to extend Claude's capabilities. Skills are model-invoked: Claude automatically uses them based on the task context.

163 204 

164Marketplaces are catalogs of available plugins. Add them to discover and install plugins:205Add a `skills/` directory at your plugin root with Skill folders containing `SKILL.md` files:

165 206 

166```shell Add a marketplace theme={null}

167/plugin marketplace add your-org/claude-plugins

168```207```

169 208my-plugin/

170```shell Browse available plugins theme={null}209├── .claude-plugin/

171/plugin210│ └── plugin.json

211└── skills/

212 └── code-review/

213 └── SKILL.md

172```214```

173 215 

174For detailed marketplace management including Git repositories, local development, and team distribution, see [Plugin marketplaces](/en/plugin-marketplaces).216Each `SKILL.md` needs frontmatter with `name` and `description` fields, followed by instructions:

175 

176### Install plugins

177 217 

178#### Via interactive menu (recommended for discovery)218```yaml theme={null}

219---

220name: code-review

221description: Reviews code for best practices and potential issues. Use when reviewing code, checking PRs, or analyzing code quality.

222---

179 223 

180```shell Open the plugin management interface theme={null}224When reviewing code, check for:

181/plugin2251. Code organization and structure

2262. Error handling

2273. Security concerns

2284. Test coverage

182```229```

183 230 

184Select "Browse Plugins" to see available options with descriptions, features, and installation options.231After 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).

185 232 

186#### Via direct commands (for quick installation)233### Add LSP servers to your plugin

187 234 

188```shell Install a specific plugin theme={null}235<Tip>

189/plugin install formatter@your-org236 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.

190```237</Tip>

191 238 

192```shell Enable a disabled plugin theme={null}239LSP (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:

193/plugin enable plugin-name@marketplace-name

194```

195 240 

196```shell Disable without uninstalling theme={null}241```json .lsp.json theme={null}

197/plugin disable plugin-name@marketplace-name242{

243 "go": {

244 "command": "gopls",

245 "args": ["serve"],

246 "extensionToLanguage": {

247 ".go": "go"

248 }

249 }

250}

198```251```

199 252 

200```shell Completely remove a plugin theme={null}253Users installing your plugin must have the language server binary installed on their machine.

201/plugin uninstall plugin-name@marketplace-name

202```

203 254 

204### Verify installation255For complete LSP configuration options, see [LSP servers](/en/plugins-reference#lsp-servers).

205 256 

206After installing a plugin:257### Organize complex plugins

207 258 

2081. **Check available commands**: Run `/help` to see new commands259For 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 260 

212## Set up team plugin workflows261### Test your plugins locally

213 262 

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.263Use the `--plugin-dir` flag to test plugins during development. This loads your plugin directly without requiring installation.

215 264 

216**To set up team plugins:**265```bash theme={null}

266claude --plugin-dir ./my-plugin

267```

217 268 

2181. Add marketplace and plugin configuration to your repository's `.claude/settings.json`269As 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 270 

222For complete instructions including configuration examples, marketplace setup, and rollout best practices, see [Configure team marketplaces](/en/plugin-marketplaces#how-to-configure-team-marketplaces).271* Try your commands with `/command-name`

272* Check that agents appear in `/agents`

273* Verify hooks work as expected

223 274 

224***275<Tip>

276 You can load multiple plugins at once by specifying the flag multiple times:

225 277 

226## Develop more complex plugins278 ```bash theme={null}

279 claude --plugin-dir ./plugin-one --plugin-dir ./plugin-two

280 ```

281</Tip>

227 282 

228Once you're comfortable with basic plugins, you can create more sophisticated extensions.283### Debug plugin issues

229 284 

230### Add Skills to your plugin285If your plugin isn't working as expected:

231 286 

232Plugins can include [Agent Skills](/en/skills) to extend Claude's capabilities. Skills are model-invoked—Claude autonomously uses them based on the task context.2871. **Check the structure**: Ensure your directories are at the plugin root, not inside `.claude-plugin/`

2882. **Test components individually**: Check each command, agent, and hook separately

2893. **Use validation and debugging tools**: See [Debugging and development tools](/en/plugins-reference#debugging-and-development-tools) for CLI commands and troubleshooting techniques

233 290 

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.291### Share your plugins

235 292 

236For complete Skill authoring guidance, see [Agent Skills](/en/skills).293When your plugin is ready to share:

237 294 

238### Organize complex plugins2951. **Add documentation**: Include a `README.md` with installation and usage instructions

2962. **Version your plugin**: Use [semantic versioning](/en/plugins-reference#version-management) in your `plugin.json`

2973. **Create or use a marketplace**: Distribute through [plugin marketplaces](/en/plugin-marketplaces) for installation

2984. **Test with others**: Have team members test the plugin before wider distribution

239 299 

240For 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).300Once your plugin is in a marketplace, others can install it using the instructions in [Discover and install plugins](/en/discover-plugins).

241 301 

242### Test your plugins locally302<Note>

303 For complete technical specifications, debugging techniques, and distribution strategies, see [Plugins reference](/en/plugins-reference).

304</Note>

243 305 

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.306## Convert existing configurations to plugins

245 307 

246<Steps>308If 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 309 

250 ```bash Create directory structure theme={null}310### Migration steps

251 mkdir dev-marketplace

252 cd dev-marketplace

253 mkdir my-plugin

254 ```

255 311 

256 This creates:312<Steps>

313 <Step title="Create the plugin structure">

314 Create a new plugin directory:

257 315 

316 ```bash theme={null}

317 mkdir -p my-plugin/.claude-plugin

258 ```318 ```

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 319 

269 <Step title="Create the marketplace manifest">320 Create the manifest file at `my-plugin/.claude-plugin/plugin.json`:

270 ```bash Create marketplace.json theme={null}321 

271 mkdir .claude-plugin322 ```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 {323 {

280 "name": "my-plugin",324 "name": "my-plugin",

281 "source": "./my-plugin",325 "description": "Migrated from standalone configuration",

282 "description": "Plugin under development"326 "version": "1.0.0"

283 }

284 ]

285 }327 }

286 EOF

287 ```328 ```

288 </Step>329 </Step>

289 330 

290 <Step title="Install and test">331 <Step title="Copy your existing files">

291 ```bash Start Claude Code from parent directory theme={null}332 Copy your existing configurations to the plugin directory:

292 cd ..

293 claude

294 ```

295 

296 ```shell Add your development marketplace theme={null}

297 /plugin marketplace add ./dev-marketplace

298 ```

299 333 

300 ```shell Install your plugin theme={null}334 ```bash theme={null}

301 /plugin install my-plugin@dev-marketplace335 # Copy commands

302 ```336 cp -r .claude/commands my-plugin/

303 337 

304 Test your plugin components:338 # Copy agents (if any)

339 cp -r .claude/agents my-plugin/

305 340 

306 * Try your commands with `/command-name`341 # Copy skills (if any)

307 * Check that agents appear in `/agents`342 cp -r .claude/skills my-plugin/

308 * Verify hooks work as expected343 ```

309 </Step>344 </Step>

310 345 

311 <Step title="Iterate on your plugin">346 <Step title="Migrate hooks">

312 After making changes to your plugin code:347 If you have hooks in your settings, create a hooks directory:

313 348 

314 ```shell Uninstall the current version theme={null}349 ```bash theme={null}

315 /plugin uninstall my-plugin@dev-marketplace350 mkdir my-plugin/hooks

316 ```351 ```

317 352 

318 ```shell Reinstall to test changes theme={null}353 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 354 

322 Repeat this cycle as you develop and refine your plugin.355 ```json my-plugin/hooks/hooks.json theme={null}

356 {

357 "hooks": {

358 "PostToolUse": [

359 {

360 "matcher": "Write|Edit",

361 "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npm run lint:fix" }]

362 }

363 ]

364 }

365 }

366 ```

323 </Step>367 </Step>

324</Steps>

325 368 

326<Note>369 <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/plugin-marketplaces#plugin-sources) for organization patterns.370 Load your plugin to verify everything works:

328</Note>

329 371 

330### Debug plugin issues372 ```bash theme={null}

331 373 claude --plugin-dir ./my-plugin

332If your plugin isn't working as expected:374 ```

333 

3341. **Check the structure**: Ensure your directories are at the plugin root, not inside `.claude-plugin/`

3352. **Test components individually**: Check each command, agent, and hook separately

3363. **Use validation and debugging tools**: See [Debugging and development tools](/en/plugins-reference#debugging-and-development-tools) for CLI commands and troubleshooting techniques

337 375 

338### Share your plugins376 Test each component: run your commands, check agents appear in `/agents`, and verify hooks trigger correctly.

377 </Step>

378</Steps>

339 379 

340When your plugin is ready to share:380### What changes when migrating

341 381 

3421. **Add documentation**: Include a README.md with installation and usage instructions382| Standalone (`.claude/`) | Plugin |

3432. **Version your plugin**: Use semantic versioning in your `plugin.json`383| :---------------------------- | :------------------------------- |

3443. **Create or use a marketplace**: Distribute through plugin marketplaces for easy installation384| Only available in one project | Can be shared via marketplaces |

3454. **Test with others**: Have team members test the plugin before wider distribution385| Files in `.claude/commands/` | Files in `plugin-name/commands/` |

386| Hooks in `settings.json` | Hooks in `hooks/hooks.json` |

387| Must manually copy to share | Install with `/plugin install` |

346 388 

347<Note>389<Note>

348 For complete technical specifications, debugging techniques, and distribution strategies, see [Plugins reference](/en/plugins-reference).390 After migrating, you can remove the original files from `.claude/` to avoid duplicates. The plugin version will take precedence when loaded.

349</Note>391</Note>

350 392 

351***

352 

353## Next steps393## Next steps

354 394 

355Now that you understand Claude Code's plugin system, here are suggested paths for different goals:395Now that you understand Claude Code's plugin system, here are suggested paths for different goals:

356 396 

357### For plugin users397### For plugin users

358 398 

359* **Discover plugins**: Browse community marketplaces for useful tools399* [Discover and install plugins](/en/discover-plugins): browse marketplaces and install plugins

360* **Team adoption**: Set up repository-level plugins for your projects400* [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 401 

364### For plugin developers402### For plugin developers

365 403 

366* **Create your first marketplace**: [Plugin marketplaces guide](/en/plugin-marketplaces)404* [Create and distribute a marketplace](/en/plugin-marketplaces): package and share your plugins

367* **Advanced components**: Dive deeper into specific plugin components:405* [Plugins reference](/en/plugins-reference): complete technical specifications

368 * [Slash commands](/en/slash-commands) - Command development details406* Dive deeper into specific plugin components:

369 * [Subagents](/en/sub-agents) - Agent configuration and capabilities407 * [Skills](/en/skills): skill development details

370 * [Agent Skills](/en/skills) - Extend Claude's capabilities408 * [Subagents](/en/sub-agents): agent configuration and capabilities

371 * [Hooks](/en/hooks) - Event handling and automation409 * [Hooks](/en/hooks): event handling and automation

372 * [MCP](/en/mcp) - External tool integration410 * [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/plugin-marketplaces) - Creating and managing plugin catalogs

386* [Slash commands](/en/slash-commands) - Understanding custom commands

387* [Subagents](/en/sub-agents) - Creating and using specialized agents

388* [Agent Skills](/en/skills) - Extend Claude's capabilities

389* [Hooks](/en/hooks) - Automating workflows with event handlers

390* [MCP](/en/mcp) - Connecting to external tools and services

391* [Settings](/en/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/plugins). For plugin management across teams and communities, see [Plugin marketplaces](/en/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 

11## Plugin components reference15## Plugin components reference

12 16 

13This section documents the five types of components that plugins can provide.17This section documents the types of components that plugins can provide.

18 

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/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 


58* Agents can be invoked manually by users80* Agents can be invoked manually by users

59* Plugin agents work alongside built-in Claude agents81* Plugin agents work alongside built-in Claude agents

60 82 

61### Skills

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/skills)

90* [Agent Skills overview](https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview#skill-structure)

91 

92### Hooks83### Hooks

93 84 

94Plugins can provide event handlers that respond to Claude Code events automatically.85Plugins can provide event handlers that respond to Claude Code events automatically.


120**Available events**:111**Available events**:

121 112 

122* `PreToolUse`: Before Claude uses any tool113* `PreToolUse`: Before Claude uses any tool

114* `PostToolUse`: After Claude successfully uses any tool

115* `PostToolUseFailure`: After Claude tool execution fails

123* `PermissionRequest`: When a permission dialog is shown116* `PermissionRequest`: When a permission dialog is shown

124* `PostToolUse`: After Claude uses any tool

125* `UserPromptSubmit`: When user submits a prompt117* `UserPromptSubmit`: When user submits a prompt

126* `Notification`: When Claude Code sends notifications118* `Notification`: When Claude Code sends notifications

127* `Stop`: When Claude attempts to stop119* `Stop`: When Claude attempts to stop

120* `SubagentStart`: When a subagent is started

128* `SubagentStop`: When a subagent attempts to stop121* `SubagentStop`: When a subagent attempts to stop

129* `SessionStart`: At the beginning of sessions122* `SessionStart`: At the beginning of sessions

130* `SessionEnd`: At the end of sessions123* `SessionEnd`: At the end of sessions


133**Hook types**:126**Hook types**:

134 127 

135* `command`: Execute shell commands or scripts128* `command`: Execute shell commands or scripts

136* `validation`: Validate file contents or project state129* `prompt`: Evaluate a prompt with an LLM (uses `$ARGUMENTS` placeholder for context)

137* `notification`: Send alerts or status updates130* `agent`: Run an agentic verifier with tools for complex verification tasks

138 131 

139### MCP servers132### MCP servers

140 133 


172* Server capabilities integrate seamlessly with Claude's existing tools165* Server capabilities integrate seamlessly with Claude's existing tools

173* Plugin servers can be configured independently of user MCP servers166* Plugin servers can be configured independently of user MCP servers

174 167 

168### LSP servers

169 

170<Tip>

171 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.

172</Tip>

173 

174Plugins 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.

175 

176LSP integration provides:

177 

178* **Instant diagnostics**: Claude sees errors and warnings immediately after each edit

179* **Code navigation**: go to definition, find references, and hover information

180* **Language awareness**: type information and documentation for code symbols

181 

182**Location**: `.lsp.json` in plugin root, or inline in `plugin.json`

183 

184**Format**: JSON configuration mapping language server names to their configurations

185 

186**`.lsp.json` file format**:

187 

188```json theme={null}

189{

190 "go": {

191 "command": "gopls",

192 "args": ["serve"],

193 "extensionToLanguage": {

194 ".go": "go"

195 }

196 }

197}

198```

199 

200**Inline in `plugin.json`**:

201 

202```json theme={null}

203{

204 "name": "my-plugin",

205 "lspServers": {

206 "go": {

207 "command": "gopls",

208 "args": ["serve"],

209 "extensionToLanguage": {

210 ".go": "go"

211 }

212 }

213 }

214}

215```

216 

217**Required fields:**

218 

219| Field | Description |

220| :-------------------- | :------------------------------------------- |

221| `command` | The LSP binary to execute (must be in PATH) |

222| `extensionToLanguage` | Maps file extensions to language identifiers |

223 

224**Optional fields:**

225 

226| Field | Description |

227| :---------------------- | :-------------------------------------------------------- |

228| `args` | Command-line arguments for the LSP server |

229| `transport` | Communication transport: `stdio` (default) or `socket` |

230| `env` | Environment variables to set when starting the server |

231| `initializationOptions` | Options passed to the server during initialization |

232| `settings` | Settings passed via `workspace/didChangeConfiguration` |

233| `workspaceFolder` | Workspace folder path for the server |

234| `startupTimeout` | Max time to wait for server startup (milliseconds) |

235| `shutdownTimeout` | Max time to wait for graceful shutdown (milliseconds) |

236| `restartOnCrash` | Whether to automatically restart the server if it crashes |

237| `maxRestarts` | Maximum number of restart attempts before giving up |

238 

239<Warning>

240 **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.

241</Warning>

242 

243**Available LSP plugins:**

244 

245| Plugin | Language server | Install command |

246| :--------------- | :------------------------- | :----------------------------------------------------------------------------------------- |

247| `pyright-lsp` | Pyright (Python) | `pip install pyright` or `npm install -g pyright` |

248| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |

249| `rust-lsp` | rust-analyzer | [See rust-analyzer installation](https://rust-analyzer.github.io/manual.html#installation) |

250 

251Install the language server first, then install the plugin from the marketplace.

252 

253***

254 

255## Plugin installation scopes

256 

257When you install a plugin, you choose a **scope** that determines where the plugin is available and who else can use it:

258 

259| Scope | Settings file | Use case |

260| :-------- | :---------------------------- | :------------------------------------------------------- |

261| `user` | `~/.claude/settings.json` | Personal plugins available across all projects (default) |

262| `project` | `.claude/settings.json` | Team plugins shared via version control |

263| `local` | `.claude/settings.local.json` | Project-specific plugins, gitignored |

264| `managed` | `managed-settings.json` | Managed plugins (read-only, update only) |

265 

266Plugins 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).

267 

175***268***

176 269 

177## Plugin manifest schema270## Plugin manifest schema


196 "keywords": ["keyword1", "keyword2"],289 "keywords": ["keyword1", "keyword2"],

197 "commands": ["./custom/commands/special.md"],290 "commands": ["./custom/commands/special.md"],

198 "agents": "./custom/agents/",291 "agents": "./custom/agents/",

292 "skills": "./custom/skills/",

199 "hooks": "./config/hooks.json",293 "hooks": "./config/hooks.json",

200 "mcpServers": "./mcp-config.json"294 "mcpServers": "./mcp-config.json",

295 "outputStyles": "./styles/",

296 "lspServers": "./.lsp.json"

201}297}

202```298```

203 299 


222### Component path fields318### Component path fields

223 319 

224| Field | Type | Description | Example |320| Field | Type | Description | Example |

225| :----------- | :------------- | :----------------------------------- | :------------------------------------- |321| :------------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------- |

226| `commands` | string\|array | Additional command files/directories | `"./custom/cmd.md"` or `["./cmd1.md"]` |322| `commands` | string\|array | Additional command files/directories | `"./custom/cmd.md"` or `["./cmd1.md"]` |

227| `agents` | string\|array | Additional agent files | `"./custom/agents/"` |323| `agents` | string\|array | Additional agent files | `"./custom/agents/"` |

324| `skills` | string\|array | Additional skill directories | `"./custom/skills/"` |

228| `hooks` | string\|object | Hook config path or inline config | `"./hooks.json"` |325| `hooks` | string\|object | Hook config path or inline config | `"./hooks.json"` |

229| `mcpServers` | string\|object | MCP config path or inline config | `"./mcp.json"` |326| `mcpServers` | string\|object | MCP config path or inline config | `"./mcp-config.json"` |

327| `outputStyles` | string\|array | Additional output style files/directories | `"./styles/"` |

328| `lspServers` | string\|object | [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) config for code intelligence (go to definition, find references, etc.) | `"./.lsp.json"` |

230 329 

231### Path behavior rules330### Path behavior rules

232 331 


275 374 

276***375***

277 376 

377## Plugin caching and file resolution

378 

379For security and verification purposes, Claude Code copies plugins to a cache directory rather than using them in-place. Understanding this behavior is important when developing plugins that reference external files.

380 

381### How plugin caching works

382 

383When you install a plugin, Claude Code copies the plugin files to a cache directory:

384 

385* **For marketplace plugins with relative paths**: The path specified in the `source` field is copied recursively. For example, if your marketplace entry specifies `"source": "./plugins/my-plugin"`, the entire `./plugins` directory is copied.

386* **For plugins with `.claude-plugin/plugin.json`**: The implicit root directory (the directory containing `.claude-plugin/plugin.json`) is copied recursively.

387 

388### Path traversal limitations

389 

390Plugins cannot reference files outside their copied directory structure. 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 have two options:

395 

396**Option 1: Use symlinks**

397 

398Create symbolic links to external files within your plugin directory. Symlinks are honored during the copy process:

399 

400```bash theme={null}

401# Inside your plugin directory

402ln -s /path/to/shared-utils ./shared-utils

403```

404 

405The symlinked content will be copied into the plugin cache.

406 

407**Option 2: Restructure your marketplace**

408 

409Set the plugin path to a parent directory that contains all required files, then provide the rest of the plugin manifest directly in the marketplace entry:

410 

411```json theme={null}

412{

413 "name": "my-plugin",

414 "source": "./",

415 "description": "Plugin that needs root-level access",

416 "commands": ["./plugins/my-plugin/commands/"],

417 "agents": ["./plugins/my-plugin/agents/"],

418 "strict": false

419}

420```

421 

422This approach copies the entire marketplace root, giving your plugin access to sibling directories.

423 

424<Note>

425 Symlinks that point to locations outside the plugin's logical root are followed during copying. This provides flexibility while maintaining the security benefits of the caching system.

426</Note>

427 

428***

429 

278## Plugin directory structure430## Plugin directory structure

279 431 

280### Standard plugin layout432### Standard plugin layout


302│ ├── hooks.json # Main hook config454│ ├── hooks.json # Main hook config

303│ └── security-hooks.json # Additional hooks455│ └── security-hooks.json # Additional hooks

304├── .mcp.json # MCP server definitions456├── .mcp.json # MCP server definitions

457├── .lsp.json # LSP server configurations

305├── scripts/ # Hook and utility scripts458├── scripts/ # Hook and utility scripts

306│ ├── security-scan.sh459│ ├── security-scan.sh

307│ ├── format-code.py460│ ├── format-code.py


317### File locations reference470### File locations reference

318 471 

319| Component | Default Location | Purpose |472| Component | Default Location | Purpose |

320| :-------------- | :--------------------------- | :------------------------------- |473| :-------------- | :--------------------------- | :---------------------------------------------------------- |

321| **Manifest** | `.claude-plugin/plugin.json` | Required metadata file |474| **Manifest** | `.claude-plugin/plugin.json` | Required metadata file |

322| **Commands** | `commands/` | Slash command markdown files |475| **Commands** | `commands/` | Skill Markdown files (legacy; use `skills/` for new skills) |

323| **Agents** | `agents/` | Subagent markdown files |476| **Agents** | `agents/` | Subagent Markdown files |

324| **Skills** | `skills/` | Agent Skills with SKILL.md files |477| **Skills** | `skills/` | Skills with `<name>/SKILL.md` structure |

325| **Hooks** | `hooks/hooks.json` | Hook configuration |478| **Hooks** | `hooks/hooks.json` | Hook configuration |

326| **MCP servers** | `.mcp.json` | MCP server definitions |479| **MCP servers** | `.mcp.json` | MCP server definitions |

480| **LSP servers** | `.lsp.json` | Language server configurations |

481 

482***

483 

484## CLI commands reference

485 

486Claude Code provides CLI commands for non-interactive plugin management, useful for scripting and automation.

487 

488### plugin install

489 

490Install a plugin from available marketplaces.

491 

492```bash theme={null}

493claude plugin install <plugin> [options]

494```

495 

496**Arguments:**

497 

498* `<plugin>`: Plugin name or `plugin-name@marketplace-name` for a specific marketplace

499 

500**Options:**

501 

502| Option | Description | Default |

503| :-------------------- | :------------------------------------------------ | :------ |

504| `-s, --scope <scope>` | Installation scope: `user`, `project`, or `local` | `user` |

505| `-h, --help` | Display help for command | |

506 

507**Examples:**

508 

509```bash theme={null}

510# Install to user scope (default)

511claude plugin install formatter@my-marketplace

512 

513# Install to project scope (shared with team)

514claude plugin install formatter@my-marketplace --scope project

515 

516# Install to local scope (gitignored)

517claude plugin install formatter@my-marketplace --scope local

518```

519 

520### plugin uninstall

521 

522Remove an installed plugin.

523 

524```bash theme={null}

525claude plugin uninstall <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>` | Uninstall from scope: `user`, `project`, or `local` | `user` |

537| `-h, --help` | Display help for command | |

538 

539**Aliases:** `remove`, `rm`

540 

541### plugin enable

542 

543Enable a disabled plugin.

544 

545```bash theme={null}

546claude plugin enable <plugin> [options]

547```

548 

549**Arguments:**

550 

551* `<plugin>`: Plugin name or `plugin-name@marketplace-name`

552 

553**Options:**

554 

555| Option | Description | Default |

556| :-------------------- | :--------------------------------------------- | :------ |

557| `-s, --scope <scope>` | Scope to enable: `user`, `project`, or `local` | `user` |

558| `-h, --help` | Display help for command | |

559 

560### plugin disable

561 

562Disable a plugin without uninstalling it.

563 

564```bash theme={null}

565claude plugin disable <plugin> [options]

566```

567 

568**Arguments:**

569 

570* `<plugin>`: Plugin name or `plugin-name@marketplace-name`

571 

572**Options:**

573 

574| Option | Description | Default |

575| :-------------------- | :---------------------------------------------- | :------ |

576| `-s, --scope <scope>` | Scope to disable: `user`, `project`, or `local` | `user` |

577| `-h, --help` | Display help for command | |

578 

579### plugin update

580 

581Update a plugin to the latest version.

582 

583```bash theme={null}

584claude plugin update <plugin> [options]

585```

586 

587**Arguments:**

588 

589* `<plugin>`: Plugin name or `plugin-name@marketplace-name`

590 

591**Options:**

592 

593| Option | Description | Default |

594| :-------------------- | :-------------------------------------------------------- | :------ |

595| `-s, --scope <scope>` | Scope to update: `user`, `project`, `local`, or `managed` | `user` |

596| `-h, --help` | Display help for command | |

327 597 

328***598***

329 599 


347### Common issues617### Common issues

348 618 

349| Issue | Cause | Solution |619| Issue | Cause | Solution |

350| :--------------------- | :------------------------------ | :--------------------------------------------------- |620| :---------------------------------- | :------------------------------ | :-------------------------------------------------------------------------------- |

351| Plugin not loading | Invalid `plugin.json` | Validate JSON syntax |621| Plugin not loading | Invalid `plugin.json` | Validate JSON syntax with `claude plugin validate` or `/plugin validate` |

352| Commands not appearing | Wrong directory structure | Ensure `commands/` at root, not in `.claude-plugin/` |622| Commands not appearing | Wrong directory structure | Ensure `commands/` at root, not in `.claude-plugin/` |

353| Hooks not firing | Script not executable | Run `chmod +x script.sh` |623| Hooks not firing | Script not executable | Run `chmod +x script.sh` |

354| MCP server fails | Missing `${CLAUDE_PLUGIN_ROOT}` | Use variable for all plugin paths |624| MCP server fails | Missing `${CLAUDE_PLUGIN_ROOT}` | Use variable for all plugin paths |

355| Path errors | Absolute paths used | All paths must be relative and start with `./` |625| Path errors | Absolute paths used | All paths must be relative and start with `./` |

626| LSP `Executable not found in $PATH` | Language server not installed | Install the binary (e.g., `npm install -g typescript-language-server typescript`) |

627 

628### Example error messages

629 

630**Manifest validation errors**:

631 

632* `Invalid JSON syntax: Unexpected token } in JSON at position 142`: check for missing commas, extra commas, or unquoted strings

633* `Plugin has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Required`: a required field is missing

634* `Plugin has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...`: JSON syntax error

635 

636**Plugin loading errors**:

637 

638* `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

639* `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

640* `Plugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.`: remove duplicate component definitions or set `strict: true` in marketplace entry

641 

642### Hook troubleshooting

643 

644**Hook script not executing**:

645 

6461. Check the script is executable: `chmod +x ./scripts/your-script.sh`

6472. Verify the shebang line: First line should be `#!/bin/bash` or `#!/usr/bin/env bash`

6483. Check the path uses `${CLAUDE_PLUGIN_ROOT}`: `"command": "${CLAUDE_PLUGIN_ROOT}/scripts/your-script.sh"`

6494. Test the script manually: `./scripts/your-script.sh`

650 

651**Hook not triggering on expected events**:

652 

6531. Verify the event name is correct (case-sensitive): `PostToolUse`, not `postToolUse`

6542. Check the matcher pattern matches your tools: `"matcher": "Write|Edit"` for file operations

6553. Confirm the hook type is valid: `command`, `prompt`, or `agent`

656 

657### MCP server troubleshooting

658 

659**Server not starting**:

660 

6611. Check the command exists and is executable

6622. Verify all paths use `${CLAUDE_PLUGIN_ROOT}` variable

6633. Check the MCP server logs: `claude --debug` shows initialization errors

6644. Test the server manually outside of Claude Code

665 

666**Server tools not appearing**:

667 

6681. Ensure the server is properly configured in `.mcp.json` or `plugin.json`

6692. Verify the server implements the MCP protocol correctly

6703. Check for connection timeouts in debug output

671 

672### Directory structure mistakes

673 

674**Symptoms**: Plugin loads but components (commands, agents, hooks) are missing.

675 

676**Correct structure**: Components must be at the plugin root, not inside `.claude-plugin/`. Only `plugin.json` belongs in `.claude-plugin/`.

677 

678```

679my-plugin/

680├── .claude-plugin/

681│ └── plugin.json ← Only manifest here

682├── commands/ ← At root level

683├── agents/ ← At root level

684└── hooks/ ← At root level

685```

686 

687If your components are inside `.claude-plugin/`, move them to the plugin root.

688 

689**Debug checklist**:

690 

6911. Run `claude --debug` and look for "loading plugin" messages

6922. Check that each component directory is listed in the debug output

6933. Verify file permissions allow reading the plugin files

356 694 

357***695***

358 696 


363Follow semantic versioning for plugin releases:701Follow semantic versioning for plugin releases:

364 702 

365```json theme={null}703```json theme={null}

704{

705 "name": "my-plugin",

706 "version": "2.1.0"

707}

708```

709 

710**Version format**: `MAJOR.MINOR.PATCH`

711 

712* **MAJOR**: Breaking changes (incompatible API changes)

713* **MINOR**: New features (backward-compatible additions)

714* **PATCH**: Bug fixes (backward-compatible fixes)

715 

716**Best practices**:

717 

718* Start at `1.0.0` for your first stable release

719* Update the version in `plugin.json` before distributing changes

720* Document changes in a `CHANGELOG.md` file

721* Use pre-release versions like `2.0.0-beta.1` for testing

722 

723***

366 724 

367## See also725## See also

368 726 

369- [Plugins](/en/plugins) - Tutorials and practical usage727* [Plugins](/en/plugins) - Tutorials and practical usage

370- [Plugin marketplaces](/en/plugin-marketplaces) - Creating and managing marketplaces728* [Plugin marketplaces](/en/plugin-marketplaces) - Creating and managing marketplaces

371- [Slash commands](/en/slash-commands) - Command development details729* [Skills](/en/skills) - Skill development details

372- [Subagents](/en/sub-agents) - Agent configuration and capabilities730* [Subagents](/en/sub-agents) - Agent configuration and capabilities

373- [Agent Skills](/en/skills) - Extend Claude's capabilities731* [Hooks](/en/hooks) - Event handling and automation

374- [Hooks](/en/hooks) - Event handling and automation732* [MCP](/en/mcp) - External tool integration

375- [MCP](/en/mcp) - External tool integration733* [Settings](/en/settings) - Configuration options for plugins

376- [Settings](/en/settings) - Configuration options for plugins

377```

quickstart.md +76 −69

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!


10 14 

11* A terminal or command prompt open15* A terminal or command prompt open

12* A code project to work with16* A code project to work with

13* A [Claude.ai](https://claude.ai) (recommended) or [Claude Console](https://console.anthropic.com/) account17* 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)

18 

19<Note>

20 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).

21</Note>

14 22 

15## Step 1: Install Claude Code23## Step 1: Install Claude Code

16 24 


18 26 

19<Tabs>27<Tabs>

20 <Tab title="Native Install (Recommended)">28 <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:**29 **macOS, Linux, WSL:**

28 30 

29 ```bash theme={null}31 ```bash theme={null}


41 ```batch theme={null}43 ```batch theme={null}

42 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd44 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

43 ```45 ```

44 </Tab>

45 46 

46 <Tab title="NPM">47 <Info>

47 If you have [Node.js 18 or newer installed](https://nodejs.org/en/download/):48 Native installations automatically update in the background to keep you on the latest version.

49 </Info>

50 </Tab>

48 51 

52 <Tab title="Homebrew">

49 ```sh theme={null}53 ```sh theme={null}

50 npm install -g @anthropic-ai/claude-code54 brew install --cask claude-code

51 ```55 ```

56 

57 <Info>

58 Homebrew installations do not auto-update. Run `brew upgrade claude-code` periodically to get the latest features and security fixes.

59 </Info>

60 </Tab>

61 

62 <Tab title="WinGet">

63 ```powershell theme={null}

64 winget install Anthropic.ClaudeCode

65 ```

66 

67 <Info>

68 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

69 </Info>

52 </Tab>70 </Tab>

53</Tabs>71</Tabs>

54 72 


66# Follow the prompts to log in with your account84# Follow the prompts to log in with your account

67```85```

68 86 

69You can log in using either account type:87You can log in using any of these account types:

70 88 

71* [Claude.ai](https://claude.ai) (subscription plans - recommended)89* [Claude Pro, Max, Teams, or Enterprise](https://claude.com/pricing) (recommended)

72* [Claude Console](https://console.anthropic.com/) (API access with pre-paid credits)90* [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.

91* [Amazon Bedrock, Google Vertex AI, or Microsoft Foundry](/en/third-party-integrations) (enterprise cloud providers)

73 92 

74Once logged in, your credentials are stored and you won't need to log in again.93Once logged in, your credentials are stored and you won't need to log in again. To switch accounts later, use the `/login` command.

75 

76<Note>

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 

80<Note>

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 94 

84## Step 3: Start your first session95## Step 3: Start your first session

85 96 


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.104You'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 105 

95<Tip>106<Tip>

96 After logging in (Step 2), your credentials are stored on your system. Learn more in [Credential Management](/en/iam#credential-management).107 After logging in (Step 2), your credentials are stored on your system. Learn more in [Credential Management](/en/authentication#credential-management).

97</Tip>108</Tip>

98 109 

99## Step 4: Ask your first question110## Step 4: Ask your first question


101Let's start with understanding your codebase. Try one of these commands:112Let's start with understanding your codebase. Try one of these commands:

102 113 

103```114```

104> what does this project do?115what does this project do?

105```116```

106 117 

107Claude will analyze your files and provide a summary. You can also ask more specific questions:118Claude will analyze your files and provide a summary. You can also ask more specific questions:

108 119 

109```120```

110> what technologies does this project use?121what technologies does this project use?

111```122```

112 123 

113```124```

114> where is the main entry point?125where is the main entry point?

115```126```

116 127 

117```128```

118> explain the folder structure129explain the folder structure

119```130```

120 131 

121You can also ask Claude about its own capabilities:132You can also ask Claude about its own capabilities:

122 133 

123```134```

124> what can Claude Code do?135what can Claude Code do?

125```136```

126 137 

127```138```

128> how do I use slash commands in Claude Code?139how do I create custom skills in Claude Code?

129```140```

130 141 

131```142```

132> can Claude Code work with Docker?143can Claude Code work with Docker?

133```144```

134 145 

135<Note>146<Note>


141Now let's make Claude Code do some actual coding. Try a simple task:152Now let's make Claude Code do some actual coding. Try a simple task:

142 153 

143```154```

144> add a hello world function to the main file155add a hello world function to the main file

145```156```

146 157 

147Claude Code will:158Claude Code will:


160Claude Code makes Git operations conversational:171Claude Code makes Git operations conversational:

161 172 

162```173```

163> what files have I changed?174what files have I changed?

164```175```

165 176 

166```177```

167> commit my changes with a descriptive message178commit my changes with a descriptive message

168```179```

169 180 

170You can also prompt for more complex Git operations:181You can also prompt for more complex Git operations:

171 182 

172```183```

173> create a new branch called feature/quickstart184create a new branch called feature/quickstart

174```185```

175 186 

176```187```

177> show me the last 5 commits188show me the last 5 commits

178```189```

179 190 

180```191```

181> help me resolve merge conflicts192help me resolve merge conflicts

182```193```

183 194 

184## Step 7: Fix a bug or add a feature195## Step 7: Fix a bug or add a feature


188Describe what you want in natural language:199Describe what you want in natural language:

189 200 

190```201```

191> add input validation to the user registration form202add input validation to the user registration form

192```203```

193 204 

194Or fix existing issues:205Or fix existing issues:

195 206 

196```207```

197> there's a bug where users can submit empty forms - fix it208there's a bug where users can submit empty forms - fix it

198```209```

199 210 

200Claude Code will:211Claude Code will:


211**Refactor code**222**Refactor code**

212 223 

213```224```

214> refactor the authentication module to use async/await instead of callbacks225refactor the authentication module to use async/await instead of callbacks

215```226```

216 227 

217**Write tests**228**Write tests**

218 229 

219```230```

220> write unit tests for the calculator functions231write unit tests for the calculator functions

221```232```

222 233 

223**Update documentation**234**Update documentation**

224 235 

225```236```

226> update the README with installation instructions237update the README with installation instructions

227```238```

228 239 

229**Code review**240**Code review**

230 241 

231```242```

232> review my changes and suggest improvements243review my changes and suggest improvements

233```244```

234 245 

235<Tip>246<Tip>


241Here are the most important commands for daily use:252Here are the most important commands for daily use:

242 253 

243| Command | What it does | Example |254| Command | What it does | Example |

244| ------------------- | --------------------------------- | ----------------------------------- |255| ------------------- | ------------------------------------------------------ | ----------------------------------- |

245| `claude` | Start interactive mode | `claude` |256| `claude` | Start interactive mode | `claude` |

246| `claude "task"` | Run a one-time task | `claude "fix the build error"` |257| `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"` |258| `claude -p "query"` | Run one-off query, then exit | `claude -p "explain this function"` |

248| `claude -c` | Continue most recent conversation | `claude -c` |259| `claude -c` | Continue most recent conversation in current directory | `claude -c` |

249| `claude -r` | Resume a previous conversation | `claude -r` |260| `claude -r` | Resume a previous conversation | `claude -r` |

250| `claude commit` | Create a Git commit | `claude commit` |261| `claude commit` | Create a Git commit | `claude commit` |

251| `/clear` | Clear conversation history | `> /clear` |262| `/clear` | Clear conversation history | `/clear` |

252| `/help` | Show available commands | `> /help` |263| `/help` | Show available commands | `/help` |

253| `exit` or Ctrl+C | Exit Claude Code | `> exit` |264| `exit` or Ctrl+C | Exit Claude Code | `exit` |

254 265 

255See the [CLI reference](/en/cli-reference) for a complete list of commands.266See the [CLI reference](/en/cli-reference) for a complete list of commands.

256 267 

257## Pro tips for beginners268## Pro tips for beginners

258 269 

270For more, see [best practices](/en/best-practices) and [common workflows](/en/common-workflows).

271 

259<AccordionGroup>272<AccordionGroup>

260 <Accordion title="Be specific with your requests">273 <Accordion title="Be specific with your requests">

261 Instead of: "fix the bug"274 Instead of: "fix the bug"


267 Break complex tasks into steps:280 Break complex tasks into steps:

268 281 

269 ```282 ```

270 > 1. create a new database table for user profiles283 1. create a new database table for user profiles

271 ```284 2. create an API endpoint to get and update user profiles

272 285 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 ```286 ```

280 </Accordion>287 </Accordion>

281 288 


283 Before making changes, let Claude understand your code:290 Before making changes, let Claude understand your code:

284 291 

285 ```292 ```

286 > analyze the database schema293 analyze the database schema

287 ```294 ```

288 295 

289 ```296 ```

290 > build a dashboard showing products that are most frequently returned by our UK customers297 build a dashboard showing products that are most frequently returned by our UK customers

291 ```298 ```

292 </Accordion>299 </Accordion>

293 300 


295 * Press `?` to see all available keyboard shortcuts302 * Press `?` to see all available keyboard shortcuts

296 * Use Tab for command completion303 * Use Tab for command completion

297 * Press ↑ for command history304 * Press ↑ for command history

298 * Type `/` to see all slash commands305 * Type `/` to see all commands and skills

299 </Accordion>306 </Accordion>

300</AccordionGroup>307</AccordionGroup>

301 308 


303 310 

304Now that you've learned the basics, explore more advanced features:311Now that you've learned the basics, explore more advanced features:

305 312 

306<CardGroup cols={3}>313<CardGroup cols={2}>

307 <Card title="Common workflows" icon="graduation-cap" href="/en/common-workflows">314 <Card title="How Claude Code works" icon="microchip" href="/en/how-claude-code-works">

308 Step-by-step guides for common tasks315 Understand the agentic loop, built-in tools, and how Claude Code interacts with your project

309 </Card>316 </Card>

310 317 

311 <Card title="CLI reference" icon="terminal" href="/en/cli-reference">318 <Card title="Best practices" icon="star" href="/en/best-practices">

312 Master all commands and options319 Get better results with effective prompting and project setup

313 </Card>320 </Card>

314 321 

315 <Card title="Configuration" icon="gear" href="/en/settings">322 <Card title="Common workflows" icon="graduation-cap" href="/en/common-workflows">

316 Customize Claude Code for your workflow323 Step-by-step guides for common tasks

317 </Card>324 </Card>

318 325 

319 <Card title="Claude Code on the web" icon="cloud" href="/en/claude-code-on-the-web">326 <Card title="Extend Claude Code" icon="puzzle-piece" href="/en/features-overview">

320 Run tasks asynchronously in the cloud327 Customize with CLAUDE.md, skills, hooks, MCP, and more

321 </Card>328 </Card>

322</CardGroup>329</CardGroup>

323 330 

sandboxing.md +65 −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# 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 


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/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/iam) for defense-in-depth228* **Permission rules**: Combine with [permission settings](/en/permissions) for defense-in-depth

173* **Development containers**: Use with [devcontainers](/en/devcontainer) for additional isolation229* **Development containers**: Use with [devcontainers](/en/devcontainer) for additional isolation

174* **Enterprise policies**: Enforce sandbox configurations through [managed settings](/en/settings#settings-precedence)230* **Enterprise policies**: Enforce sandbox configurations through [managed settings](/en/settings#settings-precedence)

175 231 


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/security) - Comprehensive security features and best practices258* [Security](/en/security) - Comprehensive security features and best practices

203* [IAM](/en/iam) - Permission configuration and access control259* [Permissions](/en/permissions) - Permission configuration and access control

204* [Settings](/en/settings) - Complete configuration reference260* [Settings](/en/settings) - Complete configuration reference

205* [CLI reference](/en/cli-reference) - Command-line options including `-sb`261* [CLI reference](/en/cli-reference) - Command-line options

sdk/migration-guide.md +0 −329 deleted

File DeletedView Diff

1# Migrate to Claude Agent SDK

2 

3Guide for migrating the Claude Code TypeScript and Python SDKs to the Claude Agent SDK

4 

5 

6## Overview

7 

8The 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.

9 

10## What's Changed

11 

12| Aspect | Old | New |

13| :----------------------- | :-------------------------- | :------------------------------- |

14| **Package Name (TS/JS)** | `@anthropic-ai/claude-code` | `@anthropic-ai/claude-agent-sdk` |

15| **Python Package** | `claude-code-sdk` | `claude-agent-sdk` |

16| **Documentation Location** | Claude Code docs | API Guide → Agent SDK section |

17 

18<Note>

19**Documentation Changes:** The Agent SDK documentation has moved from the Claude Code docs to the API Guide under a dedicated [Agent SDK](/docs/en/agent-sdk/overview) section. The Claude Code docs now focus on the CLI tool and automation features.

20</Note>

21 

22## Migration Steps

23 

24### For TypeScript/JavaScript Projects

25 

26**1. Uninstall the old package:**

27 

28```bash

29npm uninstall @anthropic-ai/claude-code

30```

31 

32**2. Install the new package:**

33 

34```bash

35npm install @anthropic-ai/claude-agent-sdk

36```

37 

38**3. Update your imports:**

39 

40Change all imports from `@anthropic-ai/claude-code` to `@anthropic-ai/claude-agent-sdk`:

41 

42```typescript

43// Before

44import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-code";

45 

46// After

47import {

48 query,

49 tool,

50 createSdkMcpServer,

51} from "@anthropic-ai/claude-agent-sdk";

52```

53 

54**4. Update package.json dependencies:**

55 

56If you have the package listed in your `package.json`, update it:

57 

58```json

59// Before

60{

61 "dependencies": {

62 "@anthropic-ai/claude-code": "^1.0.0"

63 }

64}

65 

66// After

67{

68 "dependencies": {

69 "@anthropic-ai/claude-agent-sdk": "^0.1.0"

70 }

71}

72```

73 

74That's it! No other code changes are required.

75 

76### For Python Projects

77 

78**1. Uninstall the old package:**

79 

80```bash

81pip uninstall claude-code-sdk

82```

83 

84**2. Install the new package:**

85 

86```bash

87pip install claude-agent-sdk

88```

89 

90**3. Update your imports:**

91 

92Change all imports from `claude_code_sdk` to `claude_agent_sdk`:

93 

94```python

95# Before

96from claude_code_sdk import query, ClaudeCodeOptions

97 

98# After

99from claude_agent_sdk import query, ClaudeAgentOptions

100```

101 

102**4. Update type names:**

103 

104Change `ClaudeCodeOptions` to `ClaudeAgentOptions`:

105 

106```python

107# Before

108from claude_agent_sdk import query, ClaudeCodeOptions

109 

110options = ClaudeCodeOptions(

111 model="claude-sonnet-4-5"

112)

113 

114# After

115from claude_agent_sdk import query, ClaudeAgentOptions

116 

117options = ClaudeAgentOptions(

118 model="claude-sonnet-4-5"

119)

120```

121 

122**5. Review [breaking changes](#breaking-changes)**

123 

124Make any code changes needed to complete the migration.

125 

126## Breaking changes

127 

128<Warning>

129To 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.

130</Warning>

131 

132### Python: ClaudeCodeOptions renamed to ClaudeAgentOptions

133 

134**What changed:** The Python SDK type `ClaudeCodeOptions` has been renamed to `ClaudeAgentOptions`.

135 

136**Migration:**

137 

138```python

139# BEFORE (v0.0.x)

140from claude_agent_sdk import query, ClaudeCodeOptions

141 

142options = ClaudeCodeOptions(

143 model="claude-sonnet-4-5",

144 permission_mode="acceptEdits"

145)

146 

147# AFTER (v0.1.0)

148from claude_agent_sdk import query, ClaudeAgentOptions

149 

150options = ClaudeAgentOptions(

151 model="claude-sonnet-4-5",

152 permission_mode="acceptEdits"

153)

154```

155 

156**Why this changed:** The type name now matches the "Claude Agent SDK" branding and provides consistency across the SDK's naming conventions.

157 

158### System prompt no longer default

159 

160**What changed:** The SDK no longer uses Claude Code's system prompt by default.

161 

162**Migration:**

163 

164<CodeGroup>

165 

166```typescript TypeScript

167// BEFORE (v0.0.x) - Used Claude Code's system prompt by default

168const result = query({ prompt: "Hello" });

169 

170// AFTER (v0.1.0) - Uses empty system prompt by default

171// To get the old behavior, explicitly request Claude Code's preset:

172const result = query({

173 prompt: "Hello",

174 options: {

175 systemPrompt: { type: "preset", preset: "claude_code" }

176 }

177});

178 

179// Or use a custom system prompt:

180const result = query({

181 prompt: "Hello",

182 options: {

183 systemPrompt: "You are a helpful coding assistant"

184 }

185});

186```

187 

188```python Python

189# BEFORE (v0.0.x) - Used Claude Code's system prompt by default

190async for message in query(prompt="Hello"):

191 print(message)

192 

193# AFTER (v0.1.0) - Uses empty system prompt by default

194# To get the old behavior, explicitly request Claude Code's preset:

195from claude_agent_sdk import query, ClaudeAgentOptions

196 

197async for message in query(

198 prompt="Hello",

199 options=ClaudeAgentOptions(

200 system_prompt={"type": "preset", "preset": "claude_code"} # Use the preset

201 )

202):

203 print(message)

204 

205# Or use a custom system prompt:

206async for message in query(

207 prompt="Hello",

208 options=ClaudeAgentOptions(

209 system_prompt="You are a helpful coding assistant"

210 )

211):

212 print(message)

213```

214 

215</CodeGroup>

216 

217**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.

218 

219### Settings Sources No Longer Loaded by Default

220 

221**What changed:** The SDK no longer reads from filesystem settings (CLAUDE.md, settings.json, slash commands, etc.) by default.

222 

223**Migration:**

224 

225<CodeGroup>

226 

227```typescript TypeScript

228// BEFORE (v0.0.x) - Loaded all settings automatically

229const result = query({ prompt: "Hello" });

230// Would read from:

231// - ~/.claude/settings.json (user)

232// - .claude/settings.json (project)

233// - .claude/settings.local.json (local)

234// - CLAUDE.md files

235// - Custom slash commands

236 

237// AFTER (v0.1.0) - No settings loaded by default

238// To get the old behavior:

239const result = query({

240 prompt: "Hello",

241 options: {

242 settingSources: ["user", "project", "local"]

243 }

244});

245 

246// Or load only specific sources:

247const result = query({

248 prompt: "Hello",

249 options: {

250 settingSources: ["project"] // Only project settings

251 }

252});

253```

254 

255```python Python

256# BEFORE (v0.0.x) - Loaded all settings automatically

257async for message in query(prompt="Hello"):

258 print(message)

259# Would read from:

260# - ~/.claude/settings.json (user)

261# - .claude/settings.json (project)

262# - .claude/settings.local.json (local)

263# - CLAUDE.md files

264# - Custom slash commands

265 

266# AFTER (v0.1.0) - No settings loaded by default

267# To get the old behavior:

268from claude_agent_sdk import query, ClaudeAgentOptions

269 

270async for message in query(

271 prompt="Hello",

272 options=ClaudeAgentOptions(

273 setting_sources=["user", "project", "local"]

274 )

275):

276 print(message)

277 

278# Or load only specific sources:

279async for message in query(

280 prompt="Hello",

281 options=ClaudeAgentOptions(

282 setting_sources=["project"] # Only project settings

283 )

284):

285 print(message)

286```

287 

288</CodeGroup>

289 

290**Why this changed:** Ensures SDK applications have predictable behavior independent of local filesystem configurations. This is especially important for:

291- **CI/CD environments** - Consistent behavior without local customizations

292- **Deployed applications** - No dependency on filesystem settings

293- **Testing** - Isolated test environments

294- **Multi-tenant systems** - Prevent settings leakage between users

295 

296<Note>

297**Backward compatibility:** If your application relied on filesystem settings (custom slash commands, CLAUDE.md instructions, etc.), add `settingSources: ['user', 'project', 'local']` to your options.

298</Note>

299 

300## Why the Rename?

301 

302The 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:

303 

304- Building business agents (legal assistants, finance advisors, customer support)

305- Creating specialized coding agents (SRE bots, security reviewers, code review agents)

306- Developing custom agents for any domain with tool use, MCP integration, and more

307 

308## Getting Help

309 

310If you encounter any issues during migration:

311 

312**For TypeScript/JavaScript:**

313 

3141. Check that all imports are updated to use `@anthropic-ai/claude-agent-sdk`

3152. Verify your package.json has the new package name

3163. Run `npm install` to ensure dependencies are updated

317 

318**For Python:**

319 

3201. Check that all imports are updated to use `claude_agent_sdk`

3212. Verify your requirements.txt or pyproject.toml has the new package name

3223. Run `pip install claude-agent-sdk` to ensure the package is installed

323 

324## Next Steps

325 

326- Explore the [Agent SDK Overview](/docs/en/agent-sdk/overview) to learn about available features

327- Check out the [TypeScript SDK Reference](/docs/en/agent-sdk/typescript) for detailed API documentation

328- Review the [Python SDK Reference](/docs/en/agent-sdk/python) for Python-specific documentation

329- Learn about [Custom Tools](/docs/en/agent-sdk/custom-tools) and [MCP Integration](/docs/en/agent-sdk/mcp)

security.md +10 −6

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/iam).21For detailed permission configuration, see [Permissions](/en/permissions).

18 22 

19### Built-in protections23### Built-in protections

20 24 


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/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/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/vs-code#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 


113 117 

114### Team security118### Team security

115 119 

116* Use [enterprise managed policies](/en/iam#enterprise-managed-policy-settings) to enforce organizational standards120* Use [managed settings](/en/permissions#managed-settings) to enforce organizational standards

117* Share approved permission configurations through version control121* Share approved permission configurations through version control

118* Train team members on security best practices122* Train team members on security best practices

119* Monitor Claude Code usage through [OpenTelemetry metrics](/en/monitoring-usage)123* Monitor Claude Code usage through [OpenTelemetry metrics](/en/monitoring-usage)


130## Related resources134## Related resources

131 135 

132* [Sandboxing](/en/sandboxing) - Filesystem and network isolation for bash commands136* [Sandboxing](/en/sandboxing) - Filesystem and network isolation for bash commands

133* [Identity and Access Management](/en/iam) - Configure permissions and access controls137* [Permissions](/en/permissions) - Configure permissions and access controls

134* [Monitoring usage](/en/monitoring-usage) - Track and audit Claude Code activity138* [Monitoring usage](/en/monitoring-usage) - Track and audit Claude Code activity

135* [Development containers](/en/devcontainer) - Secure, isolated environments139* [Development containers](/en/devcontainer) - Secure, isolated environments

136* [Anthropic Trust Center](https://trust.anthropic.com) - Security certifications and compliance140* [Anthropic Trust Center](https://trust.anthropic.com) - Security certifications and compliance

settings.md +641 −128

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** | 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 `managed-settings.json` and `managed-mcp.json` files that can be deployed to system directories:

18 managed policy settings**. These take precedence over user and project87 

19 settings. System administrators can deploy policies to:88 * macOS: `/Library/Application Support/ClaudeCode/`

20 * macOS: `/Library/Application Support/ClaudeCode/managed-settings.json`89 * Linux and WSL: `/etc/claude-code/`

21 * Linux and WSL: `/etc/claude-code/managed-settings.json`90 * Windows: `C:\Program Files\ClaudeCode\`

22 * Windows: `C:\ProgramData\ClaudeCode\managed-settings.json`91 

23* Enterprise deployments can also configure **managed MCP servers** that override92 <Note>

24 user-configured servers. See [Enterprise MCP configuration](/en/mcp#enterprise-mcp-configuration):93 These are system-wide paths (not user home directories like `~/Library/...`) that require administrator privileges. They are designed to be deployed by IT administrators.

25 * macOS: `/Library/Application Support/ClaudeCode/managed-mcp.json`94 </Note>

26 * Linux and WSL: `/etc/claude-code/managed-mcp.json`95 

27 * Windows: `C:\ProgramData\ClaudeCode\managed-mcp.json`96 See [Managed settings](/en/permissions#managed-settings) and [Managed MCP configuration](/en/mcp#managed-mcp-configuration) for details.

97 

98 <Note>

99 Managed deployments can also restrict **plugin marketplace additions** using

100 `strictKnownMarketplaces`. For more information, see [Managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions).

101 </Note>

102* **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`.

103 

104<Note>

105 Claude Code automatically creates timestamped backups of configuration files and retains the five most recent backups to prevent data loss.

106</Note>

28 107 

29```JSON Example settings.json theme={null}108```JSON Example settings.json theme={null}

30{109{

110 "$schema": "https://json.schemastore.org/claude-code-settings.json",

31 "permissions": {111 "permissions": {

32 "allow": [112 "allow": [

33 "Bash(npm run lint)",113 "Bash(npm run lint)",

34 "Bash(npm run test:*)",114 "Bash(npm run test *)",

35 "Read(~/.zshrc)"115 "Read(~/.zshrc)"

36 ],116 ],

37 "deny": [117 "deny": [

38 "Bash(curl:*)",118 "Bash(curl *)",

39 "Read(./.env)",119 "Read(./.env)",

40 "Read(./.env.*)",120 "Read(./.env.*)",

41 "Read(./secrets/**)"121 "Read(./secrets/**)"


53}133}

54```134```

55 135 

136The `$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.

137 

56### Available settings138### Available settings

57 139 

58`settings.json` supports a number of options:140`settings.json` supports a number of options:

59 141 

60| Key | Description | Example |142| Key | Description | Example |

61| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------- |143| :-------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------- |

62| `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` |144| `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` |

63| `cleanupPeriodDays` | How long to locally retain chat transcripts based on last activity date (default: 30 days) | `20` |145| `cleanupPeriodDays` | Sessions inactive for longer than this period are deleted at startup. Setting to `0` immediately deletes all sessions. (default: 30 days) | `20` |

64| `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"]` |146| `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"]` |

65| `env` | Environment variables that will be applied to every session | `{"FOO": "bar"}` |147| `env` | Environment variables that will be applied to every session | `{"FOO": "bar"}` |

66| `includeCoAuthoredBy` | Whether to include the `co-authored-by Claude` byline in git commits and pull requests (default: `true`) | `false` |148| `attribution` | Customize attribution for git commits and pull requests. See [Attribution settings](#attribution-settings) | `{"commit": "🤖 Generated with Claude Code", "pr": ""}` |

149| `includeCoAuthoredBy` | **Deprecated**: Use `attribution` instead. Whether to include the `co-authored-by Claude` byline in git commits and pull requests (default: `true`) | `false` |

67| `permissions` | See table below for structure of permissions. | |150| `permissions` | See table below for structure of permissions. | |

68| `hooks` | Configure custom commands to run before or after tool executions. See [hooks documentation](/en/hooks) | `{"PreToolUse": {"Bash": "echo 'Running command...'"}}` |151| `hooks` | Configure custom commands to run at lifecycle events. See [hooks documentation](/en/hooks) for format | See [hooks](/en/hooks) |

69| `disableAllHooks` | Disable all [hooks](/en/hooks) | `true` |152| `disableAllHooks` | Disable all [hooks](/en/hooks) | `true` |

153| `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` |

154| `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` |

70| `model` | Override the default model to use for Claude Code | `"claude-sonnet-4-5-20250929"` |155| `model` | Override the default model to use for Claude Code | `"claude-sonnet-4-5-20250929"` |

71| `statusLine` | Configure a custom status line to display context. See [statusLine documentation](/en/statusline) | `{"type": "command", "command": "~/.claude/statusline.sh"}` |156| `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` |

157| `statusLine` | Configure a custom status line to display context. See [`statusLine` documentation](/en/statusline) | `{"type": "command", "command": "~/.claude/statusline.sh"}` |

158| `fileSuggestion` | Configure a custom script for `@` file autocomplete. See [File suggestion settings](#file-suggestion-settings) | `{"type": "command", "command": "~/.claude/file-suggestion.sh"}` |

159| `respectGitignore` | Control whether the `@` file picker respects `.gitignore` patterns. When `true` (default), files matching `.gitignore` patterns are excluded from suggestions | `false` |

72| `outputStyle` | Configure an output style to adjust the system prompt. See [output styles documentation](/en/output-styles) | `"Explanatory"` |160| `outputStyle` | Configure an output style to adjust the system prompt. See [output styles documentation](/en/output-styles) | `"Explanatory"` |

73| `forceLoginMethod` | Use `claudeai` to restrict login to Claude.ai accounts, `console` to restrict login to Claude Console (API usage billing) accounts | `claudeai` |161| `forceLoginMethod` | Use `claudeai` to restrict login to Claude.ai accounts, `console` to restrict login to Claude Console (API usage billing) accounts | `claudeai` |

74| `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"` |162| `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"` |

75| `enableAllProjectMcpServers` | Automatically approve all MCP servers defined in project `.mcp.json` files | `true` |163| `enableAllProjectMcpServers` | Automatically approve all MCP servers defined in project `.mcp.json` files | `true` |

76| `enabledMcpjsonServers` | List of specific MCP servers from `.mcp.json` files to approve | `["memory", "github"]` |164| `enabledMcpjsonServers` | List of specific MCP servers from `.mcp.json` files to approve | `["memory", "github"]` |

77| `disabledMcpjsonServers` | List of specific MCP servers from `.mcp.json` files to reject | `["filesystem"]` |165| `disabledMcpjsonServers` | List of specific MCP servers from `.mcp.json` files to reject | `["filesystem"]` |

78| `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/mcp#enterprise-mcp-configuration) | `[{ "serverName": "github" }]` |166| `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" }]` |

79| `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/mcp#enterprise-mcp-configuration) | `[{ "serverName": "filesystem" }]` |167| `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" }]` |

168| `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" }]` |

80| `awsAuthRefresh` | Custom script that modifies the `.aws` directory (see [advanced credential configuration](/en/amazon-bedrock#advanced-credential-configuration)) | `aws sso login --profile myprofile` |169| `awsAuthRefresh` | Custom script that modifies the `.aws` directory (see [advanced credential configuration](/en/amazon-bedrock#advanced-credential-configuration)) | `aws sso login --profile myprofile` |

81| `awsCredentialExport` | Custom script that outputs JSON with AWS credentials (see [advanced credential configuration](/en/amazon-bedrock#advanced-credential-configuration)) | `/bin/generate_aws_grant.sh` |170| `awsCredentialExport` | Custom script that outputs JSON with AWS credentials (see [advanced credential configuration](/en/amazon-bedrock#advanced-credential-configuration)) | `/bin/generate_aws_grant.sh` |

171| `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` |

172| `plansDirectory` | Customize where plan files are stored. Path is relative to project root. Default: `~/.claude/plans` | `"./plans"` |

173| `showTurnDuration` | Show turn duration messages after responses (e.g., "Cooked for 1m 6s"). Set to `false` to hide these messages | `true` |

174| `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"]}` |

175| `language` | Configure Claude's preferred response language (e.g., `"japanese"`, `"spanish"`, `"french"`). Claude will respond in this language by default | `"japanese"` |

176| `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"` |

177| `spinnerTipsEnabled` | Show tips in the spinner while Claude is working. Set to `false` to disable tips (default: `true`) | `false` |

178| `terminalProgressBarEnabled` | Enable the terminal progress bar that shows progress in supported terminals like Windows Terminal and iTerm2 (default: `true`) | `false` |

82 179 

83### Permission settings180### Permission settings

84 181 

85| Keys | Description | Example |182| Keys | Description | Example |

86| :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------- |183| :----------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- |

87| `allow` | Array of [permission rules](/en/iam#configuring-permissions) to allow tool use. **Note:** Bash rules use prefix matching, not regex | `[ "Bash(git diff:*)" ]` |184| `allow` | Array of permission rules to allow tool use. See [Permission rule syntax](#permission-rule-syntax) below for pattern matching details | `[ "Bash(git diff *)" ]` |

88| `ask` | Array of [permission rules](/en/iam#configuring-permissions) to ask for confirmation upon tool use. | `[ "Bash(git push:*)" ]` |185| `ask` | Array of permission rules to ask for confirmation upon tool use. See [Permission rule syntax](#permission-rule-syntax) below | `[ "Bash(git push *)" ]` |

89| `deny` | Array of [permission rules](/en/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/iam#tool-specific-permission-rules)) | `[ "WebFetch", "Bash(curl:*)", "Read(./.env)", "Read(./secrets/**)" ]` |186| `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/**)" ]` |

90| `additionalDirectories` | Additional [working directories](/en/iam#working-directories) that Claude has access to | `[ "../docs/" ]` |187| `additionalDirectories` | Additional [working directories](/en/permissions#working-directories) that Claude has access to | `[ "../docs/" ]` |

91| `defaultMode` | Default [permission mode](/en/iam#permission-modes) when opening Claude Code | `"acceptEdits"` |188| `defaultMode` | Default [permission mode](/en/permissions#permission-modes) when opening Claude Code | `"acceptEdits"` |

92| `disableBypassPermissionsMode` | Set to `"disable"` to prevent `bypassPermissions` mode from being activated. This disables the `--dangerously-skip-permissions` command-line flag. See [managed policy settings](/en/iam#enterprise-managed-policy-settings) | `"disable"` |189| `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-settings) | `"disable"` |

190 

191### Permission rule syntax

192 

193Permission 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.

194 

195Quick examples:

196 

197| Rule | Effect |

198| :----------------------------- | :--------------------------------------- |

199| `Bash` | Matches all Bash commands |

200| `Bash(npm run *)` | Matches commands starting with `npm run` |

201| `Read(./.env)` | Matches reading the `.env` file |

202| `WebFetch(domain:example.com)` | Matches fetch requests to example.com |

203 

204For 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).

93 205 

94### Sandbox settings206### Sandbox settings

95 207 


98**Filesystem and network restrictions** are configured via Read, Edit, and WebFetch permission rules, not via these sandbox settings.210**Filesystem and network restrictions** are configured via Read, Edit, and WebFetch permission rules, not via these sandbox settings.

99 211 

100| Keys | Description | Example |212| Keys | Description | Example |

101| :-------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------ |213| :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------ |

102| `enabled` | Enable bash sandboxing (macOS/Linux only). Default: false | `true` |214| `enabled` | Enable bash sandboxing (macOS, Linux, and WSL2). Default: false | `true` |

103| `autoAllowBashIfSandboxed` | Auto-approve bash commands when sandboxed. Default: true | `true` |215| `autoAllowBashIfSandboxed` | Auto-approve bash commands when sandboxed. Default: true | `true` |

104| `excludedCommands` | Commands that should run outside of the sandbox | `["git", "docker"]` |216| `excludedCommands` | Commands that should run outside of the sandbox | `["git", "docker"]` |

105| `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` |217| `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` |

106| `network.allowUnixSockets` | Unix socket paths accessible in sandbox (for SSH agents, etc.) | `["~/.ssh/agent-socket"]` |218| `network.allowUnixSockets` | Unix socket paths accessible in sandbox (for SSH agents, etc.) | `["~/.ssh/agent-socket"]` |

107| `network.allowLocalBinding` | Allow binding to localhost ports (MacOS only). Default: false | `true` |219| `network.allowAllUnixSockets` | Allow all Unix socket connections in sandbox. Default: false | `true` |

220| `network.allowLocalBinding` | Allow binding to localhost ports (macOS only). Default: false | `true` |

221| `network.allowedDomains` | Array of domains to allow for outbound network traffic. Supports wildcards (e.g., `*.example.com`). | `["github.com", "*.npmjs.org"]` |

108| `network.httpProxyPort` | HTTP proxy port used if you wish to bring your own proxy. If not specified, Claude will run its own proxy. | `8080` |222| `network.httpProxyPort` | HTTP proxy port used if you wish to bring your own proxy. If not specified, Claude will run its own proxy. | `8080` |

109| `network.socksProxyPort` | SOCKS5 proxy port used if you wish to bring your own proxy. If not specified, Claude will run its own proxy. | `8081` |223| `network.socksProxyPort` | SOCKS5 proxy port used if you wish to bring your own proxy. If not specified, Claude will run its own proxy. | `8081` |

110| `enableWeakerNestedSandbox` | Enable weaker sandbox for unprivileged Docker environments (Linux only). **Reduces security.** Default: false | `true` |224| `enableWeakerNestedSandbox` | Enable weaker sandbox for unprivileged Docker environments (Linux and WSL2 only). **Reduces security.** Default: false | `true` |

111 225 

112**Configuration example:**226**Configuration example:**

113 227 


118 "autoAllowBashIfSandboxed": true,232 "autoAllowBashIfSandboxed": true,

119 "excludedCommands": ["docker"],233 "excludedCommands": ["docker"],

120 "network": {234 "network": {

235 "allowedDomains": ["github.com", "*.npmjs.org", "registry.yarnpkg.com"],

121 "allowUnixSockets": [236 "allowUnixSockets": [

122 "/var/run/docker.sock"237 "/var/run/docker.sock"

123 ],238 ],


133}248}

134```249```

135 250 

136**Filesystem access** is controlled via Read/Edit permissions:251**Filesystem and network restrictions** use standard permission rules:

252 

253* Use `Read` deny rules to block Claude from reading specific files or directories

254* Use `Edit` allow rules to let Claude write to directories beyond the current working directory

255* Use `Edit` deny rules to block writes to specific paths

256* Use `WebFetch` allow/deny rules to control which network domains Claude can access

257 

258### Attribution settings

259 

260Claude Code adds attribution to git commits and pull requests. These are configured separately:

261 

262* Commits use [git trailers](https://git-scm.com/docs/git-interpret-trailers) (like `Co-Authored-By`) by default, which can be customized or disabled

263* Pull request descriptions are plain text

264 

265| Keys | Description |

266| :------- | :----------------------------------------------------------------------------------------- |

267| `commit` | Attribution for git commits, including any trailers. Empty string hides commit attribution |

268| `pr` | Attribution for pull request descriptions. Empty string hides pull request attribution |

269 

270**Default commit attribution:**

271 

272```

273🤖 Generated with [Claude Code](https://claude.com/claude-code)

274 

275 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

276```

277 

278**Default pull request attribution:**

279 

280```

281🤖 Generated with [Claude Code](https://claude.com/claude-code)

282```

283 

284**Example:**

285 

286```json theme={null}

287{

288 "attribution": {

289 "commit": "Generated with AI\n\nCo-Authored-By: AI <ai@example.com>",

290 "pr": ""

291 }

292}

293```

294 

295<Note>

296 The `attribution` setting takes precedence over the deprecated `includeCoAuthoredBy` setting. To hide all attribution, set `commit` and `pr` to empty strings.

297</Note>

298 

299### File suggestion settings

300 

301Configure 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.

302 

303```json theme={null}

304{

305 "fileSuggestion": {

306 "type": "command",

307 "command": "~/.claude/file-suggestion.sh"

308 }

309}

310```

311 

312The command runs with the same environment variables as [hooks](/en/hooks), including `CLAUDE_PROJECT_DIR`. It receives JSON via stdin with a `query` field:

313 

314```json theme={null}

315{"query": "src/comp"}

316```

317 

318Output newline-separated file paths to stdout (currently limited to 15):

319 

320```

321src/components/Button.tsx

322src/components/Modal.tsx

323src/components/Form.tsx

324```

325 

326**Example:**

327 

328```bash theme={null}

329#!/bin/bash

330query=$(cat | jq -r '.query')

331your-repo-file-index --query "$query" | head -20

332```

333 

334### Hook configuration

335 

336**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.

337 

338**Behavior when `allowManagedHooksOnly` is `true`:**

137 339 

138* Read deny rules block file reads in sandbox340* Managed hooks and SDK hooks are loaded

139* Edit allow rules permit file writes (in addition to the defaults, e.g. the current working directory)341* User hooks, project hooks, and plugin hooks are blocked

140* Edit deny rules block writes within allowed paths

141 342 

142**Network access** is controlled via WebFetch permissions:343**Configuration:**

143 344 

144* WebFetch allow rules permit network domains345```json theme={null}

145* WebFetch deny rules block network domains346{

347 "allowManagedHooksOnly": true

348}

349```

146 350 

147### Settings precedence351### Settings precedence

148 352 

149Settings are applied in order of precedence (highest to lowest):353Settings apply in order of precedence. From highest to lowest:

150 354 

1511. **Enterprise managed policies** (`managed-settings.json`)3551. **Managed settings** (`managed-settings.json`)

152 * Deployed by IT/DevOps356 * Policies deployed by IT/DevOps to system directories

153 * Cannot be overridden357 * Cannot be overridden by user or project settings

154 358 

1552. **Command line arguments**3592. **Command line arguments**

156 * Temporary overrides for a specific session360 * Temporary overrides for a specific session


1645. **User settings** (`~/.claude/settings.json`)3685. **User settings** (`~/.claude/settings.json`)

165 * Personal global settings369 * Personal global settings

166 370 

167This hierarchy ensures that enterprise security policies are always enforced while still allowing teams and individuals to customize their experience.371This hierarchy ensures that organizational policies are always enforced while still allowing teams and individuals to customize their experience.

372 

373For 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.

168 374 

169### Key points about the configuration system375### Key points about the configuration system

170 376 

171* **Memory files (CLAUDE.md)**: Contain instructions and context that Claude loads at startup377* **Memory files (`CLAUDE.md`)**: Contain instructions and context that Claude loads at startup

172* **Settings files (JSON)**: Configure permissions, environment variables, and tool behavior378* **Settings files (JSON)**: Configure permissions, environment variables, and tool behavior

173* **Slash commands**: Custom commands that can be invoked during a session with `/command-name`379* **Skills**: Custom prompts that can be invoked with `/skill-name` or loaded by Claude automatically

174* **MCP servers**: Extend Claude Code with additional tools and integrations380* **MCP servers**: Extend Claude Code with additional tools and integrations

175* **Precedence**: Higher-level configurations (Enterprise) override lower-level ones (User/Project)381* **Precedence**: Higher-level configurations (Managed) override lower-level ones (User/Project)

176* **Inheritance**: Settings are merged, with more specific settings adding to or overriding broader ones382* **Inheritance**: Settings are merged, with more specific settings adding to or overriding broader ones

177 383 

178### System prompt availability384### System prompt

179 385 

180<Note>386Claude Code's internal system prompt is not published. To add custom instructions, use `CLAUDE.md` files or the `--append-system-prompt` flag.

181 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.

182</Note>

183 387 

184### Excluding sensitive files388### Excluding sensitive files

185 389 

186To 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:390To 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:

187 391 

188```json theme={null}392```json theme={null}

189{393{


199}403}

200```404```

201 405 

202This replaces the deprecated `ignorePatterns` configuration. Files matching these patterns will be completely invisible to Claude Code, preventing any accidental exposure of sensitive data.406This 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.

203 407 

204## Subagent configuration408## Subagent configuration

205 409 


212 416 

213## Plugin configuration417## Plugin configuration

214 418 

215Claude 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.419Claude 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.

216 420 

217### Plugin settings421### Plugin settings

218 422 


221```json theme={null}425```json theme={null}

222{426{

223 "enabledPlugins": {427 "enabledPlugins": {

224 "formatter@company-tools": true,428 "formatter@acme-tools": true,

225 "deployer@company-tools": true,429 "deployer@acme-tools": true,

226 "analyzer@security-plugins": false430 "analyzer@security-plugins": false

227 },431 },

228 "extraKnownMarketplaces": {432 "extraKnownMarketplaces": {

229 "company-tools": {433 "acme-tools": {

230 "source": "github",434 "source": "github",

231 "repo": "company/claude-plugins"435 "repo": "acme-corp/claude-plugins"

232 }436 }

233 }437 }

234}438}


272```json theme={null}476```json theme={null}

273{477{

274 "extraKnownMarketplaces": {478 "extraKnownMarketplaces": {

275 "company-tools": {479 "acme-tools": {

276 "source": {480 "source": {

277 "source": "github",481 "source": "github",

278 "repo": "company-org/claude-plugins"482 "repo": "acme-corp/claude-plugins"

279 }483 }

280 },484 },

281 "security-plugins": {485 "security-plugins": {

282 "source": {486 "source": {

283 "source": "git",487 "source": "git",

284 "url": "https://git.company.com/security/plugins.git"488 "url": "https://git.example.com/security/plugins.git"

285 }489 }

286 }490 }

287 }491 }


293* `github`: GitHub repository (uses `repo`)497* `github`: GitHub repository (uses `repo`)

294* `git`: Any git URL (uses `url`)498* `git`: Any git URL (uses `url`)

295* `directory`: Local filesystem path (uses `path`, for development only)499* `directory`: Local filesystem path (uses `path`, for development only)

500* `hostPattern`: regex pattern to match marketplace hosts (uses `hostPattern`)

501 

502#### `strictKnownMarketplaces`

503 

504**Managed settings only**: Controls which plugin marketplaces users are allowed to add. This setting can only be configured in [`managed-settings.json`](/en/permissions#managed-settings) and provides administrators with strict control over marketplace sources.

505 

506**Managed settings file locations**:

507 

508* **macOS**: `/Library/Application Support/ClaudeCode/managed-settings.json`

509* **Linux and WSL**: `/etc/claude-code/managed-settings.json`

510* **Windows**: `C:\Program Files\ClaudeCode\managed-settings.json`

511 

512**Key characteristics**:

513 

514* Only available in managed settings (`managed-settings.json`)

515* Cannot be overridden by user or project settings (highest precedence)

516* Enforced BEFORE network/filesystem operations (blocked sources never execute)

517* Uses exact matching for source specifications (including `ref`, `path` for git sources), except `hostPattern`, which uses regex matching

518 

519**Allowlist behavior**:

520 

521* `undefined` (default): No restrictions - users can add any marketplace

522* Empty array `[]`: Complete lockdown - users cannot add any new marketplaces

523* List of sources: Users can only add marketplaces that match exactly

524 

525**All supported source types**:

526 

527The allowlist supports seven marketplace source types. Most sources use exact matching, while `hostPattern` uses regex matching against the marketplace host.

528 

5291. **GitHub repositories**:

530 

531```json theme={null}

532{ "source": "github", "repo": "acme-corp/approved-plugins" }

533{ "source": "github", "repo": "acme-corp/security-tools", "ref": "v2.0" }

534{ "source": "github", "repo": "acme-corp/plugins", "ref": "main", "path": "marketplace" }

535```

536 

537Fields: `repo` (required), `ref` (optional: branch/tag/SHA), `path` (optional: subdirectory)

538 

5392. **Git repositories**:

540 

541```json theme={null}

542{ "source": "git", "url": "https://gitlab.example.com/tools/plugins.git" }

543{ "source": "git", "url": "https://bitbucket.org/acme-corp/plugins.git", "ref": "production" }

544{ "source": "git", "url": "ssh://git@git.example.com/plugins.git", "ref": "v3.1", "path": "approved" }

545```

546 

547Fields: `url` (required), `ref` (optional: branch/tag/SHA), `path` (optional: subdirectory)

548 

5493. **URL-based marketplaces**:

550 

551```json theme={null}

552{ "source": "url", "url": "https://plugins.example.com/marketplace.json" }

553{ "source": "url", "url": "https://cdn.example.com/marketplace.json", "headers": { "Authorization": "Bearer ${TOKEN}" } }

554```

555 

556Fields: `url` (required), `headers` (optional: HTTP headers for authenticated access)

557 

558<Note>

559 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.

560</Note>

561 

5624. **NPM packages**:

563 

564```json theme={null}

565{ "source": "npm", "package": "@acme-corp/claude-plugins" }

566{ "source": "npm", "package": "@acme-corp/approved-marketplace" }

567```

568 

569Fields: `package` (required, supports scoped packages)

570 

5715. **File paths**:

572 

573```json theme={null}

574{ "source": "file", "path": "/usr/local/share/claude/acme-marketplace.json" }

575{ "source": "file", "path": "/opt/acme-corp/plugins/marketplace.json" }

576```

577 

578Fields: `path` (required: absolute path to marketplace.json file)

579 

5806. **Directory paths**:

581 

582```json theme={null}

583{ "source": "directory", "path": "/usr/local/share/claude/acme-plugins" }

584{ "source": "directory", "path": "/opt/acme-corp/approved-marketplaces" }

585```

586 

587Fields: `path` (required: absolute path to directory containing `.claude-plugin/marketplace.json`)

588 

5897. **Host pattern matching**:

590 

591```json theme={null}

592{ "source": "hostPattern", "hostPattern": "^github\\.example\\.com$" }

593{ "source": "hostPattern", "hostPattern": "^gitlab\\.internal\\.example\\.com$" }

594```

595 

596Fields: `hostPattern` (required: regex pattern to match against the marketplace host)

597 

598Use 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.

599 

600Host extraction by source type:

601 

602* `github`: always matches against `github.com`

603* `git`: extracts hostname from the URL (supports both HTTPS and SSH formats)

604* `url`: extracts hostname from the URL

605* `npm`, `file`, `directory`: not supported for host pattern matching

606 

607**Configuration examples**:

608 

609Example: allow specific marketplaces only:

610 

611```json theme={null}

612{

613 "strictKnownMarketplaces": [

614 {

615 "source": "github",

616 "repo": "acme-corp/approved-plugins"

617 },

618 {

619 "source": "github",

620 "repo": "acme-corp/security-tools",

621 "ref": "v2.0"

622 },

623 {

624 "source": "url",

625 "url": "https://plugins.example.com/marketplace.json"

626 },

627 {

628 "source": "npm",

629 "package": "@acme-corp/compliance-plugins"

630 }

631 ]

632}

633```

634 

635Example - Disable all marketplace additions:

636 

637```json theme={null}

638{

639 "strictKnownMarketplaces": []

640}

641```

642 

643Example: allow all marketplaces from an internal git server:

644 

645```json theme={null}

646{

647 "strictKnownMarketplaces": [

648 {

649 "source": "hostPattern",

650 "hostPattern": "^github\\.example\\.com$"

651 }

652 ]

653}

654```

655 

656**Exact matching requirements**:

657 

658Marketplace sources must match **exactly** for a user's addition to be allowed. For git-based sources (`github` and `git`), this includes all optional fields:

659 

660* The `repo` or `url` must match exactly

661* The `ref` field must match exactly (or both be undefined)

662* The `path` field must match exactly (or both be undefined)

663 

664Examples of sources that **do NOT match**:

665 

666```json theme={null}

667// These are DIFFERENT sources:

668{ "source": "github", "repo": "acme-corp/plugins" }

669{ "source": "github", "repo": "acme-corp/plugins", "ref": "main" }

670 

671// These are also DIFFERENT:

672{ "source": "github", "repo": "acme-corp/plugins", "path": "marketplace" }

673{ "source": "github", "repo": "acme-corp/plugins" }

674```

675 

676**Comparison with `extraKnownMarketplaces`**:

677 

678| Aspect | `strictKnownMarketplaces` | `extraKnownMarketplaces` |

679| --------------------- | ------------------------------------ | ------------------------------------ |

680| **Purpose** | Organizational policy enforcement | Team convenience |

681| **Settings file** | `managed-settings.json` only | Any settings file |

682| **Behavior** | Blocks non-allowlisted additions | Auto-installs missing marketplaces |

683| **When enforced** | Before network/filesystem operations | After user trust prompt |

684| **Can be overridden** | No (highest precedence) | Yes (by higher precedence settings) |

685| **Source format** | Direct source object | Named marketplace with nested source |

686| **Use case** | Compliance, security restrictions | Onboarding, standardization |

687 

688**Format difference**:

689 

690`strictKnownMarketplaces` uses direct source objects:

691 

692```json theme={null}

693{

694 "strictKnownMarketplaces": [

695 { "source": "github", "repo": "acme-corp/plugins" }

696 ]

697}

698```

699 

700`extraKnownMarketplaces` requires named marketplaces:

701 

702```json theme={null}

703{

704 "extraKnownMarketplaces": {

705 "acme-tools": {

706 "source": { "source": "github", "repo": "acme-corp/plugins" }

707 }

708 }

709}

710```

711 

712**Important notes**:

713 

714* Restrictions are checked BEFORE any network requests or filesystem operations

715* When blocked, users see clear error messages indicating the source is blocked by managed policy

716* The restriction applies only to adding NEW marketplaces; previously installed marketplaces remain accessible

717* Managed settings have the highest precedence and cannot be overridden

718 

719See [Managed marketplace restrictions](/en/plugin-marketplaces#managed-marketplace-restrictions) for user-facing documentation.

296 720 

297### Managing plugins721### Managing plugins

298 722 


314 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.738 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.

315</Note>739</Note>

316 740 

317| Variable | Purpose |741| Variable | Purpose | |

318| :----------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |742| :--------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- |

319| `ANTHROPIC_API_KEY` | API key sent as `X-Api-Key` header, typically for the Claude SDK (for interactive usage, run `/login`) |743| `ANTHROPIC_API_KEY` | API key sent as `X-Api-Key` header, typically for the Claude SDK (for interactive usage, run `/login`) | |

320| `ANTHROPIC_AUTH_TOKEN` | Custom value for the `Authorization` header (the value you set here will be prefixed with `Bearer `) |744| `ANTHROPIC_AUTH_TOKEN` | Custom value for the `Authorization` header (the value you set here will be prefixed with `Bearer `) | |

321| `ANTHROPIC_CUSTOM_HEADERS` | Custom headers you want to add to the request (in `Name: Value` format) |745| `ANTHROPIC_CUSTOM_HEADERS` | Custom headers to add to requests (`Name: Value` format, newline-separated for multiple headers) | |

322| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | See [Model configuration](/en/model-config#environment-variables) |746| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | See [Model configuration](/en/model-config#environment-variables) | |

323| `ANTHROPIC_DEFAULT_OPUS_MODEL` | See [Model configuration](/en/model-config#environment-variables) |747| `ANTHROPIC_DEFAULT_OPUS_MODEL` | See [Model configuration](/en/model-config#environment-variables) | |

324| `ANTHROPIC_DEFAULT_SONNET_MODEL` | See [Model configuration](/en/model-config#environment-variables) |748| `ANTHROPIC_DEFAULT_SONNET_MODEL` | See [Model configuration](/en/model-config#environment-variables) | |

325| `ANTHROPIC_FOUNDRY_API_KEY` | API key for Microsoft Foundry authentication (see [Microsoft Foundry](/en/microsoft-foundry)) |749| `ANTHROPIC_FOUNDRY_API_KEY` | API key for Microsoft Foundry authentication (see [Microsoft Foundry](/en/microsoft-foundry)) | |

326| `ANTHROPIC_MODEL` | Name of the model setting to use (see [Model Configuration](/en/model-config#environment-variables)) |750| `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)) | |

327| `ANTHROPIC_SMALL_FAST_MODEL` | \[DEPRECATED] Name of [Haiku-class model for background tasks](/en/costs) |751| `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)) | |

328| `ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION` | Override AWS region for the Haiku-class model when using Bedrock |752| `ANTHROPIC_MODEL` | Name of the model setting to use (see [Model Configuration](/en/model-config#environment-variables)) | |

329| `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/)) |753| `ANTHROPIC_SMALL_FAST_MODEL` | \[DEPRECATED] Name of [Haiku-class model for background tasks](/en/costs) | |

330| `BASH_DEFAULT_TIMEOUT_MS` | Default timeout for long-running bash commands |754| `ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION` | Override AWS region for the Haiku-class model when using Bedrock | |

331| `BASH_MAX_OUTPUT_LENGTH` | Maximum number of characters in bash outputs before they are middle-truncated |755| `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/)) | |

332| `BASH_MAX_TIMEOUT_MS` | Maximum timeout the model can set for long-running bash commands |756| `BASH_DEFAULT_TIMEOUT_MS` | Default timeout for long-running bash commands | |

333| `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` | Return to the original working directory after each Bash command |757| `BASH_MAX_OUTPUT_LENGTH` | Maximum number of characters in bash outputs before they are middle-truncated | |

334| `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` | Interval in milliseconds at which credentials should be refreshed (when using `apiKeyHelper`) |758| `BASH_MAX_TIMEOUT_MS` | Maximum timeout the model can set for long-running bash commands | |

335| `CLAUDE_CODE_CLIENT_CERT` | Path to client certificate file for mTLS authentication |759| `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) | |

336| `CLAUDE_CODE_CLIENT_KEY_PASSPHRASE` | Passphrase for encrypted CLAUDE\_CODE\_CLIENT\_KEY (optional) |760| `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` | Return to the original working directory after each Bash command | |

337| `CLAUDE_CODE_CLIENT_KEY` | Path to client private key file for mTLS authentication |761| `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` |

338| `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 |762| `CLAUDE_CODE_API_KEY_HELPER_TTL_MS` | Interval in milliseconds at which credentials should be refreshed (when using `apiKeyHelper`) | |

339| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | Equivalent of setting `DISABLE_AUTOUPDATER`, `DISABLE_BUG_COMMAND`, `DISABLE_ERROR_REPORTING`, and `DISABLE_TELEMETRY` |763| `CLAUDE_CODE_CLIENT_CERT` | Path to client certificate file for mTLS authentication | |

340| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | Set to `1` to disable automatic terminal title updates based on conversation context |764| `CLAUDE_CODE_CLIENT_KEY_PASSPHRASE` | Passphrase for encrypted CLAUDE\_CODE\_CLIENT\_KEY (optional) | |

341| `CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL` | Skip auto-installation of IDE extensions |765| `CLAUDE_CODE_CLIENT_KEY` | Path to client private key file for mTLS authentication | |

342| `CLAUDE_CODE_MAX_OUTPUT_TOKENS` | Set the maximum number of output tokens for most requests |766| `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 | |

343| `CLAUDE_CODE_SKIP_BEDROCK_AUTH` | Skip AWS authentication for Bedrock (e.g. when using an LLM gateway) |767| `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 | |

344| `CLAUDE_CODE_SKIP_FOUNDRY_AUTH` | Skip Azure authentication for Microsoft Foundry (e.g. when using an LLM gateway) |768| `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) | |

345| `CLAUDE_CODE_SKIP_VERTEX_AUTH` | Skip Google authentication for Vertex (e.g. when using an LLM gateway) |769| `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 | |

346| `CLAUDE_CODE_SUBAGENT_MODEL` | See [Model configuration](/en/model-config) |770| `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 | |

347| `CLAUDE_CODE_USE_BEDROCK` | Use [Bedrock](/en/amazon-bedrock) |771| `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) | |

348| `CLAUDE_CODE_USE_FOUNDRY` | Use [Microsoft Foundry](/en/microsoft-foundry) |772| `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 | |

349| `CLAUDE_CODE_USE_VERTEX` | Use [Vertex](/en/google-vertex-ai) |773| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | Equivalent of setting `DISABLE_AUTOUPDATER`, `DISABLE_BUG_COMMAND`, `DISABLE_ERROR_REPORTING`, and `DISABLE_TELEMETRY` | |

350| `DISABLE_AUTOUPDATER` | Set to `1` to disable automatic updates. |774| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | Set to `1` to disable automatic terminal title updates based on conversation context | |

351| `DISABLE_BUG_COMMAND` | Set to `1` to disable the `/bug` command |775| `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) | |

352| `DISABLE_COST_WARNINGS` | Set to `1` to disable cost warning messages |776| `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) | |

353| `DISABLE_ERROR_REPORTING` | Set to `1` to opt out of Sentry error reporting |777| `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) | |

354| `DISABLE_NON_ESSENTIAL_MODEL_CALLS` | Set to `1` to disable model calls for non-critical paths like flavor text |778| `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 | |

355| `DISABLE_PROMPT_CACHING` | Set to `1` to disable prompt caching for all models (takes precedence over per-model settings) |779| `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 | |

356| `DISABLE_PROMPT_CACHING_HAIKU` | Set to `1` to disable prompt caching for Haiku models |780| `CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL` | Skip auto-installation of IDE extensions | |

357| `DISABLE_PROMPT_CACHING_OPUS` | Set to `1` to disable prompt caching for Opus models |781| `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. | |

358| `DISABLE_PROMPT_CACHING_SONNET` | Set to `1` to disable prompt caching for Sonnet models |782| `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) | |

359| `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) |783| `CLAUDE_CODE_SHELL` | Override automatic shell detection. Useful when your login shell differs from your preferred working shell (for example, `bash` vs `zsh`) | |

360| `HTTP_PROXY` | Specify HTTP proxy server for network connections |784| `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>` | |

361| `HTTPS_PROXY` | Specify HTTPS proxy server for network connections |785| `CLAUDE_CODE_SKIP_BEDROCK_AUTH` | Skip AWS authentication for Bedrock (for example, when using an LLM gateway) | |

362| `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) |786| `CLAUDE_CODE_SKIP_FOUNDRY_AUTH` | Skip Azure authentication for Microsoft Foundry (for example, when using an LLM gateway) | |

363| `MAX_THINKING_TOKENS` | Enable [extended thinking](https://docs.claude.com/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](https://docs.claude.com/en/docs/build-with-claude/prompt-caching#caching-with-thinking-blocks). Disabled by default. |787| `CLAUDE_CODE_SKIP_VERTEX_AUTH` | Skip Google authentication for Vertex (for example, when using an LLM gateway) | |

364| `MCP_TIMEOUT` | Timeout in milliseconds for MCP server startup |788| `CLAUDE_CODE_SUBAGENT_MODEL` | See [Model configuration](/en/model-config) | |

365| `MCP_TOOL_TIMEOUT` | Timeout in milliseconds for MCP tool execution |789| `CLAUDE_CODE_USE_BEDROCK` | Use [Bedrock](/en/amazon-bedrock) | |

366| `NO_PROXY` | List of domains and IPs to which requests will be directly issued, bypassing proxy |790| `CLAUDE_CODE_USE_FOUNDRY` | Use [Microsoft Foundry](/en/microsoft-foundry) | |

367| `SLASH_COMMAND_TOOL_CHAR_BUDGET` | Maximum number of characters for slash command metadata shown to [SlashCommand tool](/en/slash-commands#slashcommand-tool) (default: 15000) |791| `CLAUDE_CODE_USE_VERTEX` | Use [Vertex](/en/google-vertex-ai) | |

368| `USE_BUILTIN_RIPGREP` | Set to `0` to use system-installed `rg` intead of `rg` included with Claude Code |792| `CLAUDE_CONFIG_DIR` | Customize where Claude Code stores its configuration and data files | |

369| `VERTEX_REGION_CLAUDE_3_5_HAIKU` | Override region for Claude 3.5 Haiku when using Vertex AI |793| `DISABLE_AUTOUPDATER` | Set to `1` to disable automatic updates. | |

370| `VERTEX_REGION_CLAUDE_3_7_SONNET` | Override region for Claude 3.7 Sonnet when using Vertex AI |794| `DISABLE_BUG_COMMAND` | Set to `1` to disable the `/bug` command | |

371| `VERTEX_REGION_CLAUDE_4_0_OPUS` | Override region for Claude 4.0 Opus when using Vertex AI |795| `DISABLE_COST_WARNINGS` | Set to `1` to disable cost warning messages | |

372| `VERTEX_REGION_CLAUDE_4_0_SONNET` | Override region for Claude 4.0 Sonnet when using Vertex AI |796| `DISABLE_ERROR_REPORTING` | Set to `1` to opt out of Sentry error reporting | |

373| `VERTEX_REGION_CLAUDE_4_1_OPUS` | Override region for Claude 4.1 Opus when using Vertex AI |797| `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 | |

798| `DISABLE_NON_ESSENTIAL_MODEL_CALLS` | Set to `1` to disable model calls for non-critical paths like flavor text | |

799| `DISABLE_PROMPT_CACHING` | Set to `1` to disable prompt caching for all models (takes precedence over per-model settings) | |

800| `DISABLE_PROMPT_CACHING_HAIKU` | Set to `1` to disable prompt caching for Haiku models | |

801| `DISABLE_PROMPT_CACHING_OPUS` | Set to `1` to disable prompt caching for Opus models | |

802| `DISABLE_PROMPT_CACHING_SONNET` | Set to `1` to disable prompt caching for Sonnet models | |

803| `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) | |

804| `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) | |

805| `FORCE_AUTOUPDATE_PLUGINS` | Set to `true` to force plugin auto-updates even when the main auto-updater is disabled via `DISABLE_AUTOUPDATER` | |

806| `HTTP_PROXY` | Specify HTTP proxy server for network connections | |

807| `HTTPS_PROXY` | Specify HTTPS proxy server for network connections | |

808| `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 | |

809| `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) | |

810| `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`). Extended thinking improves performance on complex reasoning and coding tasks but impacts [prompt caching efficiency](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#caching-with-thinking-blocks). | |

811| `MCP_TIMEOUT` | Timeout in milliseconds for MCP server startup | |

812| `MCP_TOOL_TIMEOUT` | Timeout in milliseconds for MCP tool execution | |

813| `NO_PROXY` | List of domains and IPs to which requests will be directly issued, bypassing proxy | |

814| `SLASH_COMMAND_TOOL_CHAR_BUDGET` | Maximum number of characters for skill metadata shown to the [Skill tool](/en/skills#control-who-invokes-a-skill) (default: 15000). Legacy name kept for backwards compatibility. | |

815| `USE_BUILTIN_RIPGREP` | Set to `0` to use system-installed `rg` instead of `rg` included with Claude Code | |

816| `VERTEX_REGION_CLAUDE_3_5_HAIKU` | Override region for Claude 3.5 Haiku when using Vertex AI | |

817| `VERTEX_REGION_CLAUDE_3_7_SONNET` | Override region for Claude 3.7 Sonnet when using Vertex AI | |

818| `VERTEX_REGION_CLAUDE_4_0_OPUS` | Override region for Claude 4.0 Opus when using Vertex AI | |

819| `VERTEX_REGION_CLAUDE_4_0_SONNET` | Override region for Claude 4.0 Sonnet when using Vertex AI | |

820| `VERTEX_REGION_CLAUDE_4_1_OPUS` | Override region for Claude 4.1 Opus when using Vertex AI | |

374 821 

375## Tools available to Claude822## Tools available to Claude

376 823 

377Claude Code has access to a set of powerful tools that help it understand and modify your codebase:824Claude Code has access to a set of powerful tools that help it understand and modify your codebase:

378 825 

379| Tool | Description | Permission Required |826| Tool | Description | Permission Required |

380| :------------------ | :--------------------------------------------------------------------------------- | :------------------ |827| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------ |

381| **AskUserQuestion** | Asks the user multiple choice questions to gather information or clarify ambiguity | No |828| **AskUserQuestion** | Asks multiple-choice questions to gather requirements or clarify ambiguity | No |

382| **Bash** | Executes shell commands in your environment | Yes |829| **Bash** | Executes shell commands in your environment (see [Bash tool behavior](#bash-tool-behavior) below) | Yes |

383| **BashOutput** | Retrieves output from a background bash shell | No |830| **TaskOutput** | Retrieves output from a background task (bash shell or subagent) | No |

384| **Edit** | Makes targeted edits to specific files | Yes |831| **Edit** | Makes targeted edits to specific files | Yes |

385| **ExitPlanMode** | Prompts the user to exit plan mode and start coding | Yes |832| **ExitPlanMode** | Prompts the user to exit plan mode and start coding | Yes |

386| **Glob** | Finds files based on pattern matching | No |833| **Glob** | Finds files based on pattern matching | No |

387| **Grep** | Searches for patterns in file contents | No |834| **Grep** | Searches for patterns in file contents | No |

388| **KillShell** | Kills a running background bash shell by its ID | No |835| **KillShell** | Kills a running background bash shell by its ID | No |

836| **MCPSearch** | Searches for and loads MCP tools when [tool search](/en/mcp#scale-with-mcp-tool-search) is enabled | No |

389| **NotebookEdit** | Modifies Jupyter notebook cells | Yes |837| **NotebookEdit** | Modifies Jupyter notebook cells | Yes |

390| **Read** | Reads the contents of files | No |838| **Read** | Reads the contents of files | No |

391| **Skill** | Executes a skill within the main conversation | Yes |839| **Skill** | Executes a [skill](/en/skills#control-who-invokes-a-skill) within the main conversation | Yes |

392| **SlashCommand** | Runs a [custom slash command](/en/slash-commands#slashcommand-tool) | Yes |

393| **Task** | Runs a sub-agent to handle complex, multi-step tasks | No |840| **Task** | Runs a sub-agent to handle complex, multi-step tasks | No |

394| **TodoWrite** | Creates and manages structured task lists | No |841| **TaskCreate** | Creates a new task in the task list | No |

842| **TaskGet** | Retrieves full details for a specific task | No |

843| **TaskList** | Lists all tasks with their current status | No |

844| **TaskUpdate** | Updates task status, dependencies, details, or deletes tasks | No |

395| **WebFetch** | Fetches content from a specified URL | Yes |845| **WebFetch** | Fetches content from a specified URL | Yes |

396| **WebSearch** | Performs web searches with domain filtering | Yes |846| **WebSearch** | Performs web searches with domain filtering | Yes |

397| **Write** | Creates or overwrites files | Yes |847| **Write** | Creates or overwrites files | Yes |

848| **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 |

849 

850Permission 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).

851 

852### Bash tool behavior

853 

854The Bash tool executes shell commands with the following persistence behavior:

855 

856* **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.

857* **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.

858 

859To make environment variables available in Bash commands, you have **three options**:

860 

861**Option 1: Activate environment before starting Claude Code** (simplest approach)

862 

863Activate your virtual environment in your terminal before launching Claude Code:

864 

865```bash theme={null}

866conda activate myenv

867# or: source /path/to/venv/bin/activate

868claude

869```

870 

871This works for shell environments but environment variables set within Claude's Bash commands will not persist between commands.

872 

873**Option 2: Set CLAUDE\_ENV\_FILE before starting Claude Code** (persistent environment setup)

874 

875Export the path to a shell script containing your environment setup:

876 

877```bash theme={null}

878export CLAUDE_ENV_FILE=/path/to/env-setup.sh

879claude

880```

881 

882Where `/path/to/env-setup.sh` contains:

883 

884```bash theme={null}

885conda activate myenv

886# or: source /path/to/venv/bin/activate

887# or: export MY_VAR=value

888```

889 

890Claude Code will source this file before each Bash command, making the environment persistent across all commands.

891 

892**Option 3: Use a SessionStart hook** (project-specific configuration)

893 

894Configure in `.claude/settings.json`:

895 

896```json theme={null}

897{

898 "hooks": {

899 "SessionStart": [{

900 "matcher": "startup",

901 "hooks": [{

902 "type": "command",

903 "command": "echo 'conda activate myenv' >> \"$CLAUDE_ENV_FILE\""

904 }]

905 }]

906 }

907}

908```

909 

910The hook writes to `$CLAUDE_ENV_FILE`, which is then sourced before each Bash command. This is ideal for team-shared project configurations.

398 911 

399Permission rules can be configured using `/allowed-tools` or in [permission settings](/en/settings#available-settings). Also see [Tool-specific permission rules](/en/iam#tool-specific-permission-rules).912See [SessionStart hooks](/en/hooks#persist-environment-variables) for more details on Option 3.

400 913 

401### Extending tools with hooks914### Extending tools with hooks

402 915 


409 922 

410## See also923## See also

411 924 

412* [Identity and Access Management](/en/iam#configuring-permissions) - Learn about Claude Code's permission system925* [Permissions](/en/permissions): permission system, rule syntax, tool-specific patterns, and managed policies

413* [IAM and access control](/en/iam#enterprise-managed-policy-settings) - Enterprise policy management926* [Authentication](/en/authentication): set up user access to Claude Code

414* [Troubleshooting](/en/troubleshooting#auto-updater-issues) - Solutions for common configuration issues927* [Troubleshooting](/en/troubleshooting): solutions for common configuration issues

setup.md +246 −106

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# Set up Claude Code5# Set up Claude Code

2 6 

3> Install, authenticate, and start using Claude Code on your development machine.7> Install, authenticate, and start using Claude Code on your development machine.

4 8 

5## System requirements9## System requirements

6 10 

7* **Operating Systems**: macOS 10.15+, Ubuntu 20.04+/Debian 10+, or Windows 10+ (with WSL 1, WSL 2, or Git for Windows)11* **Operating System**:

8* **Hardware**: 4GB+ RAM12 * macOS 13.0+

9* **Software**: [Node.js 18+](https://nodejs.org/en/download) (only required for NPM installation)13 * Windows 10 1809+ or Windows Server 2019+ ([see setup notes](#platform-specific-setup))

10* **Network**: Internet connection required for authentication and AI processing14 * Ubuntu 20.04+

11* **Shell**: Works best in Bash, Zsh or Fish15 * Debian 10+

16 * Alpine Linux 3.19+ ([additional dependencies required](#platform-specific-setup))

17* **Hardware**: 4 GB+ RAM

18* **Network**: Internet connection required (see [network configuration](/en/network-config#network-access-requirements))

19* **Shell**: Works best in Bash or Zsh

12* **Location**: [Anthropic supported countries](https://www.anthropic.com/supported-countries)20* **Location**: [Anthropic supported countries](https://www.anthropic.com/supported-countries)

13 21 

14### Additional dependencies22### Additional dependencies

15 23 

16* **ripgrep**: Usually included with Claude Code. If search functionality fails, see [search troubleshooting](/en/troubleshooting#search-and-discovery-issues).24* **ripgrep**: Usually included with Claude Code. If search fails, see [search troubleshooting](/en/troubleshooting#search-and-discovery-issues).

25* **[Node.js 18+](https://nodejs.org/en/download)**: Only required for [deprecated npm installation](#npm-installation-deprecated)

17 26 

18## Standard installation27## Installation

19 28 

20To install Claude Code, use one of the following methods:29To install Claude Code, use one of the following methods:

21 30 

22<Tabs>31<Tabs>

23 <Tab title="Native Install (Recommended)">32 <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:**33 **macOS, Linux, WSL:**

31 34 

32 ```bash theme={null}35 ```bash theme={null} theme={null} theme={null} theme={null} theme={null}

33 curl -fsSL https://claude.ai/install.sh | bash36 curl -fsSL https://claude.ai/install.sh | bash

34 ```37 ```

35 38 

36 **Windows PowerShell:**39 **Windows PowerShell:**

37 40 

38 ```powershell theme={null}41 ```powershell theme={null} theme={null} theme={null} theme={null} theme={null}

39 irm https://claude.ai/install.ps1 | iex42 irm https://claude.ai/install.ps1 | iex

40 ```43 ```

41 44 

42 **Windows CMD:**45 **Windows CMD:**

43 46 

44 ```batch theme={null}47 ```batch theme={null} theme={null} theme={null} theme={null} theme={null}

45 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd48 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

46 ```49 ```

50 

51 <Info>

52 Native installations automatically update in the background to keep you on the latest version.

53 </Info>

47 </Tab>54 </Tab>

48 55 

49 <Tab title="NPM">56 <Tab title="Homebrew">

50 If you have [Node.js 18 or newer installed](https://nodejs.org/en/download/):57 ```sh theme={null} theme={null} theme={null} theme={null} theme={null}

58 brew install --cask claude-code

59 ```

60 

61 <Info>

62 Homebrew installations do not auto-update. Run `brew upgrade claude-code` periodically to get the latest features and security fixes.

63 </Info>

64 </Tab>

51 65 

52 ```sh theme={null}66 <Tab title="WinGet">

53 npm install -g @anthropic-ai/claude-code67 ```powershell theme={null} theme={null} theme={null} theme={null} theme={null}

68 winget install Anthropic.ClaudeCode

54 ```69 ```

70 

71 <Info>

72 WinGet installations do not auto-update. Run `winget upgrade Anthropic.ClaudeCode` periodically to get the latest features and security fixes.

73 </Info>

55 </Tab>74 </Tab>

56</Tabs>75</Tabs>

57 76 

58<Note>

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:77After the installation process completes, navigate to your project and start Claude Code:

63 78 

64```bash theme={null}79```bash theme={null}


66claude81claude

67```82```

68 83 

69Claude Code offers the following authentication options:84If you encounter any issues during installation, consult the [troubleshooting guide](/en/troubleshooting).

70 85 

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.86<Tip>

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.87 Run `claude doctor` after installation to check your installation type and version.

733. **Enterprise platforms**: Configure Claude Code to use [Amazon Bedrock, Google Vertex AI, or Microsoft Foundry](/en/third-party-integrations) for enterprise deployments with your existing cloud infrastructure.88</Tip>

74 

75<Note>

76 Claude Code securely stores your credentials. See [Credential Management](/en/iam#credential-management) for details.

77</Note>

78 

79## Windows setup

80 89 

81**Option 1: Claude Code within WSL**90### Platform-specific setup

82 91 

83* Both WSL 1 and WSL 2 are supported92**Windows**: Run Claude Code natively (requires [Git Bash](https://git-scm.com/downloads/win)) or inside WSL. Both WSL 1 and WSL 2 are supported, but WSL 1 has limited support and does not support features like Bash tool sandboxing.

84 93 

85**Option 2: Claude Code on native Windows with Git Bash**94**Alpine Linux and other musl/uClibc-based distributions**:

86 95 

87* Requires [Git for Windows](https://git-scm.com/downloads/win)96The 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`.

88* For portable Git installations, specify the path to your `bash.exe`:

89 ```powershell theme={null}

90 $env:CLAUDE_CODE_GIT_BASH_PATH="C:\Program Files\Git\bin\bash.exe"

91 ```

92 97 

93## Alternative installation methods98On Alpine:

94 99 

95Claude Code offers multiple installation methods to suit different environments.100```bash theme={null}

96 101apk add libgcc libstdc++ ripgrep

97If you encounter any issues during installation, consult the [troubleshooting guide](/en/troubleshooting#linux-permission-issues).102```

98 

99<Tip>

100 Run `claude doctor` after installation to check your installation type and version.

101</Tip>

102 103 

103### Native installation options104### Authentication

104 105 

105The native installation is the recommended method and offers several benefits:106#### For individuals

106 107 

107* One self-contained executable1081. **Claude Pro or Max plan** (recommended): Subscribe to Claude's [Pro or Max plan](https://claude.ai/pricing) for a unified subscription that includes both Claude Code and Claude on the web. Manage your account in one place and log in with your Claude.ai account.

108* No Node.js dependency1092. **Claude Console**: Connect through the [Claude Console](https://console.anthropic.com) and complete the OAuth process. Requires active billing in the Anthropic Console. A "Claude Code" workspace is automatically created for usage tracking and cost management. You can't create API keys for the Claude Code workspace; it's dedicated exclusively for Claude Code usage.

109* Improved auto-updater stability

110 110 

111If you have an existing installation of Claude Code, use `claude install` to migrate to the native binary installation.111#### For teams and organizations

112 112 

113For advanced installation options with the native installer:1131. **Claude for Teams or Enterprise** (recommended): Subscribe to [Claude for Teams](https://claude.com/pricing#team-&-enterprise) or [Claude for Enterprise](https://anthropic.com/contact-sales) for centralized billing, team management, and access to both Claude Code and Claude on the web. Team members log in with their Claude.ai accounts.

1142. **Claude Console with team billing**: Set up a shared [Claude Console](https://console.anthropic.com) organization with team billing. Invite team members and assign roles for usage tracking.

1153. **Cloud providers**: Configure Claude Code to use [Amazon Bedrock, Google Vertex AI, or Microsoft Foundry](/en/third-party-integrations) for deployments with your existing cloud infrastructure.

114 116 

115**macOS, Linux, WSL:**117### Install a specific version

116 118 

117```bash theme={null}119The 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.

118# Install stable version (default)

119curl -fsSL https://claude.ai/install.sh | bash

120 120 

121# Install latest version121To install the latest version (default):

122curl -fsSL https://claude.ai/install.sh | bash -s latest

123 122 

124# Install specific version number123<Tabs>

125curl -fsSL https://claude.ai/install.sh | bash -s 1.0.58124 <Tab title="macOS, Linux, WSL">

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

127 126 curl -fsSL https://claude.ai/install.sh | bash

128<Note>127 ```

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`.128 </Tab>

130</Note>

131 129 

132<Note>130 <Tab title="Windows PowerShell">

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).131 ```powershell theme={null}

134</Note>132 irm https://claude.ai/install.ps1 | iex

133 ```

134 </Tab>

135 135 

136**Windows PowerShell:**136 <Tab title="Windows CMD">

137 ```batch theme={null}

138 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

139 ```

140 </Tab>

141</Tabs>

137 142 

138```powershell theme={null}143To install the stable version:

139# Install stable version (default)

140irm https://claude.ai/install.ps1 | iex

141 144 

142# Install latest version145<Tabs>

143& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) latest146 <Tab title="macOS, Linux, WSL">

147 ```bash theme={null}

148 curl -fsSL https://claude.ai/install.sh | bash -s stable

149 ```

150 </Tab>

144 151 

145# Install specific version number152 <Tab title="Windows PowerShell">

146& ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 1.0.58153 ```powershell theme={null}

147```154 & ([scriptblock]::Create((irm https://claude.ai/install.ps1))) stable

155 ```

156 </Tab>

148 157 

149**Windows CMD:**158 <Tab title="Windows CMD">

159 ```batch theme={null}

160 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd stable && del install.cmd

161 ```

162 </Tab>

163</Tabs>

150 164 

151```batch theme={null}165To install a specific version number:

152REM Install stable version (default)

153curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmd

154 166 

155REM Install latest version167<Tabs>

156curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd latest && del install.cmd168 <Tab title="macOS, Linux, WSL">

169 ```bash theme={null}

170 curl -fsSL https://claude.ai/install.sh | bash -s 1.0.58

171 ```

172 </Tab>

157 173 

158REM Install specific version number174 <Tab title="Windows PowerShell">

159curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd 1.0.58 && del install.cmd175 ```powershell theme={null}

160```176 & ([scriptblock]::Create((irm https://claude.ai/install.ps1))) 1.0.58

177 ```

178 </Tab>

161 179 

162<Tip>180 <Tab title="Windows CMD">

163 Make sure that you remove any outdated aliases or symlinks before installing.181 ```batch theme={null}

164</Tip>182 curl -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd 1.0.58 && del install.cmd

183 ```

184 </Tab>

185</Tabs>

165 186 

166**Binary integrity and code signing**187### Binary integrity and code signing

167 188 

168* SHA256 checksums for all platforms are published in the release manifests, currently located at `https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/{VERSION}/manifest.json` (example: replace `{VERSION}` with `2.0.30`)189* SHA256 checksums for all platforms are published in the release manifests, currently located at `https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/{VERSION}/manifest.json` (example: replace `{VERSION}` with `2.0.30`)

169* Signed binaries are distributed for the following platforms:190* Signed binaries are distributed for the following platforms:

170 * macOS: Signed by "Anthropic PBC" and notarized by Apple191 * macOS: Signed by "Anthropic PBC" and notarized by Apple

171 * Windows: Signed by "Anthropic, PBC"192 * Windows: Signed by "Anthropic, PBC"

172 193 

173### NPM installation194## NPM installation (deprecated)

195 

196NPM installation is deprecated. Use the [native installation](#installation) method when possible. To migrate an existing npm installation to native, run `claude install`.

174 197 

175For environments where NPM is preferred or required:198**Global npm installation**

176 199 

177```sh theme={null}200```sh theme={null}

178npm install -g @anthropic-ai/claude-code201npm install -g @anthropic-ai/claude-code


180 203 

181<Warning>204<Warning>

182 Do NOT use `sudo npm install -g` as this can lead to permission issues and security risks.205 Do NOT use `sudo npm install -g` as this can lead to permission issues and security risks.

183 If you encounter permission errors, see [configure Claude Code](/en/troubleshooting#linux-permission-issues) for recommended solutions.206 If you encounter permission errors, see [troubleshooting permission errors](/en/troubleshooting#command-not-found-claude-or-permission-errors) for recommended solutions.

184</Warning>207</Warning>

185 208 

186### Local installation209## Windows setup

187 210 

188* After global install via npm, use `claude migrate-installer` to move to local211**Option 1: Claude Code within WSL**

189* Avoids autoupdater npm permission issues

190* Some users may be automatically migrated to this method

191 212 

192## Running on AWS or GCP213* Both WSL 1 and WSL 2 are supported

214* WSL 2 supports [sandboxing](/en/sandboxing) for enhanced security. WSL 1 does not support sandboxing.

193 215 

194By default, Claude Code uses the Claude API.216**Option 2: Claude Code on native Windows with Git Bash**

195 217 

196For details on running Claude Code on AWS or GCP, see [third-party integrations](/en/third-party-integrations).218* Requires [Git for Windows](https://git-scm.com/downloads/win)

219* For portable Git installations, specify the path to your `bash.exe`:

220 ```powershell theme={null}

221 $env:CLAUDE_CODE_GIT_BASH_PATH="C:\Program Files\Git\bin\bash.exe"

222 ```

197 223 

198## Update Claude Code224## Update Claude Code

199 225 


206* **Notifications**: You'll see a notification when updates are installed232* **Notifications**: You'll see a notification when updates are installed

207* **Applying updates**: Updates take effect the next time you start Claude Code233* **Applying updates**: Updates take effect the next time you start Claude Code

208 234 

209**Disable auto-updates:**235<Note>

236 Homebrew and WinGet installations do not auto-update. Use `brew upgrade claude-code` or `winget upgrade Anthropic.ClaudeCode` to update manually.

237 

238 **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.

239</Note>

240 

241### Configure release channel

242 

243Configure which release channel Claude Code follows for both auto-updates and `claude update` with the `autoUpdatesChannel` setting:

244 

245* `"latest"` (default): Receive new features as soon as they're released

246* `"stable"`: Use a version that is typically about one week old, skipping releases with major regressions

247 

248Configure this via `/config` → **Auto-update channel**, or add it to your [settings.json file](/en/settings):

249 

250```json theme={null}

251{

252 "autoUpdatesChannel": "stable"

253}

254```

255 

256For enterprise deployments, you can enforce a consistent release channel across your organization using [managed settings](/en/permissions#managed-settings).

257 

258### Disable auto-updates

210 259 

211Set the `DISABLE_AUTOUPDATER` environment variable in your shell or [settings.json file](/en/settings):260Set the `DISABLE_AUTOUPDATER` environment variable in your shell or [settings.json file](/en/settings):

212 261 


219```bash theme={null}268```bash theme={null}

220claude update269claude update

221```270```

271 

272## Uninstall Claude Code

273 

274If you need to uninstall Claude Code, follow the instructions for your installation method.

275 

276### Native installation

277 

278Remove the Claude Code binary and version files:

279 

280**macOS, Linux, WSL:**

281 

282```bash theme={null}

283rm -f ~/.local/bin/claude

284rm -rf ~/.local/share/claude

285```

286 

287**Windows PowerShell:**

288 

289```powershell theme={null}

290Remove-Item -Path "$env:USERPROFILE\.local\bin\claude.exe" -Force

291Remove-Item -Path "$env:USERPROFILE\.local\share\claude" -Recurse -Force

292```

293 

294**Windows CMD:**

295 

296```batch theme={null}

297del "%USERPROFILE%\.local\bin\claude.exe"

298rmdir /s /q "%USERPROFILE%\.local\share\claude"

299```

300 

301### Homebrew installation

302 

303```bash theme={null}

304brew uninstall --cask claude-code

305```

306 

307### WinGet installation

308 

309```powershell theme={null}

310winget uninstall Anthropic.ClaudeCode

311```

312 

313### NPM installation

314 

315```bash theme={null}

316npm uninstall -g @anthropic-ai/claude-code

317```

318 

319### Clean up configuration files (optional)

320 

321<Warning>

322 Removing configuration files will delete all your settings, allowed tools, MCP server configurations, and session history.

323</Warning>

324 

325To remove Claude Code settings and cached data:

326 

327**macOS, Linux, WSL:**

328 

329```bash theme={null}

330# Remove user settings and state

331rm -rf ~/.claude

332rm ~/.claude.json

333 

334# Remove project-specific settings (run from your project directory)

335rm -rf .claude

336rm -f .mcp.json

337```

338 

339**Windows PowerShell:**

340 

341```powershell theme={null}

342# Remove user settings and state

343Remove-Item -Path "$env:USERPROFILE\.claude" -Recurse -Force

344Remove-Item -Path "$env:USERPROFILE\.claude.json" -Force

345 

346# Remove project-specific settings (run from your project directory)

347Remove-Item -Path ".claude" -Recurse -Force

348Remove-Item -Path ".mcp.json" -Force

349```

350 

351**Windows CMD:**

352 

353```batch theme={null}

354REM Remove user settings and state

355rmdir /s /q "%USERPROFILE%\.claude"

356del "%USERPROFILE%\.claude.json"

357 

358REM Remove project-specific settings (run from your project directory)

359rmdir /s /q ".claude"

360del ".mcp.json"

361```

skills.md +485 −416

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/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](https://docs.claude.com/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/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/permissions#managed-settings) | 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](https://docs.claude.com/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```102```

109 103 

110Reference these files from SKILL.md: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.

105 

106<Note>

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.

108</Note>

111 109 

112````markdown theme={null}110## Configure skills

113For advanced usage, see [reference.md](reference.md).

114 111 

115Run the helper script:112Skills are configured through YAML frontmatter at the top of `SKILL.md` and the markdown content that follows.

116```bash

117python scripts/helper.py input.txt

118```

119````

120 113 

121Claude reads these files only when needed, using progressive disclosure to manage context efficiently.114### Types of skill content

122 115 

123## Restrict tool access with allowed-tools116Skill files can contain any instructions, but thinking about how you want to invoke them helps guide what to include:

124 117 

125Use the `allowed-tools` frontmatter field to limit which tools Claude can use when a Skill is active:118**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.

126 119 

127```yaml theme={null}120```yaml theme={null}

128---121---

129name: safe-file-reader122name: api-conventions

130description: Read files without making changes. Use when you need read-only file access.123description: API design patterns for this codebase

131allowed-tools: Read, Grep, Glob

132---124---

133 125 

134# Safe File Reader126When writing API endpoints:

135 127- Use RESTful naming conventions

136This Skill provides read-only file access.128- Return consistent error formats

137 129- Include request validation

138## Instructions

1391. Use Read to view file contents

1402. Use Grep to search within files

1413. Use Glob to find files by pattern

142```130```

143 131 

144When this Skill is active, Claude can only use the specified tools (Read, Grep, Glob) without needing to ask for permission. This is useful for:132**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.

145 

146* Read-only Skills that shouldn't modify files

147* Skills with limited scope (e.g., only data analysis, no file writing)

148* Security-sensitive workflows where you want to restrict capabilities

149 

150If `allowed-tools` is not specified, Claude will ask for permission to use tools as normal, following the standard permission model.

151 133 

152<Note>134```yaml theme={null}

153 `allowed-tools` is only supported for Skills in Claude Code.135---

154</Note>136name: deploy

155 137description: Deploy the application to production

156## View available Skills138context: fork

157 139disable-model-invocation: true

158Skills are automatically discovered by Claude from three sources:140---

159 

160* Personal Skills: `~/.claude/skills/`

161* Project Skills: `.claude/skills/`

162* Plugin Skills: bundled with installed plugins

163 

164**To view all available Skills**, ask Claude directly:

165 

166```

167What Skills are available?

168```

169 

170or

171 141 

172```142Deploy the application:

173List all available Skills1431. Run the test suite

1442. Build the application

1453. Push to the deployment target

174```146```

175 147 

176This will show all Skills from all sources, including plugin Skills.148Your `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.

177 149 

178**To inspect a specific Skill**, you can also check the filesystem:150### Frontmatter reference

179 151 

180```bash theme={null}152Beyond the markdown content, you can configure skill behavior using YAML frontmatter fields between `---` markers at the top of your `SKILL.md` file:

181# List personal Skills

182ls ~/.claude/skills/

183 153 

184# List project Skills (if in a project directory)154```yaml theme={null}

185ls .claude/skills/155---

156name: my-skill

157description: What this skill does

158disable-model-invocation: true

159allowed-tools: Read, Grep

160---

186 161 

187# View a specific Skill's content162Your skill instructions here...

188cat ~/.claude/skills/my-skill/SKILL.md

189```163```

190 164 

191## Test a Skill165All fields are optional. Only `description` is recommended so Claude knows when to use the skill.

192 

193After creating a Skill, test it by asking questions that match your description.

194 

195**Example**: If your description mentions "PDF files":

196 

197```

198Can you help me extract text from this PDF?

199```

200 166 

201Claude 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.167| Field | Required | Description |

168| :------------------------- | :---------- | :---------------------------------------------------------------------------------------------------------------------------------------------------- |

169| `name` | No | Display name for the skill. If omitted, uses the directory name. Lowercase letters, numbers, and hyphens only (max 64 characters). |

170| `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. |

171| `argument-hint` | No | Hint shown during autocomplete to indicate expected arguments. Example: `[issue-number]` or `[filename] [format]`. |

172| `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`. |

173| `user-invocable` | No | Set to `false` to hide from the `/` menu. Use for background knowledge users shouldn't invoke directly. Default: `true`. |

174| `allowed-tools` | No | Tools Claude can use without asking permission when this skill is active. |

175| `model` | No | Model to use when this skill is active. |

176| `context` | No | Set to `fork` to run in a forked subagent context. |

177| `agent` | No | Which subagent type to use when `context: fork` is set. |

178| `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. |

202 179 

203## Debug a Skill180#### Available string substitutions

204 181 

205If Claude doesn't use your Skill, check these common issues:182Skills support string substitution for dynamic values in the skill content:

206 183 

207### Make description specific184| Variable | Description |

185| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- |

186| `$ARGUMENTS` | All arguments passed when invoking the skill. If `$ARGUMENTS` is not present in the content, arguments are appended as `ARGUMENTS: <value>`. |

187| `$ARGUMENTS[N]` | Access a specific argument by 0-based index, such as `$ARGUMENTS[0]` for the first argument. |

188| `$N` | Shorthand for `$ARGUMENTS[N]`, such as `$0` for the first argument or `$1` for the second. |

189| `${CLAUDE_SESSION_ID}` | The current session ID. Useful for logging, creating session-specific files, or correlating skill output with sessions. |

208 190 

209**Too vague**:191**Example using substitutions:**

210 192 

211```yaml theme={null}193```yaml theme={null}

212description: Helps with documents194---

213```195name: session-logger

196description: Log activity for this session

197---

214 198 

215**Specific**:199Log the following to logs/${CLAUDE_SESSION_ID}.log:

216 200 

217```yaml theme={null}201$ARGUMENTS

218description: 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.

219```202```

220 203 

221Include both what the Skill does and when to use it in the description.204### Add supporting files

222 

223### Verify file path

224 205 

225**Personal Skills**: `~/.claude/skills/skill-name/SKILL.md`206Skills 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.

226**Project Skills**: `.claude/skills/skill-name/SKILL.md`

227 207 

228Check the file exists:

229 

230```bash theme={null}

231# Personal

232ls ~/.claude/skills/my-skill/SKILL.md

233 

234# Project

235ls .claude/skills/my-skill/SKILL.md

236```208```

237 209my-skill/

238### Check YAML syntax210├── SKILL.md (required - overview and navigation)

239 211├── reference.md (detailed API docs - loaded when needed)

240Invalid YAML prevents the Skill from loading. Verify the frontmatter:212├── examples.md (usage examples - loaded when needed)

241 213└── scripts/

242```bash theme={null}214 └── helper.py (utility script - executed, not loaded)

243cat SKILL.md | head -n 10

244```215```

245 216 

246Ensure:217Reference supporting files from `SKILL.md` so Claude knows what each file contains and when to load it:

247 

248* Opening `---` on line 1

249* Closing `---` before Markdown content

250* Valid YAML syntax (no tabs, correct indentation)

251 218 

252### View errors219```markdown theme={null}

253 220## Additional resources

254Run Claude Code with debug mode to see Skill loading errors:

255 221 

256```bash theme={null}222- For complete API details, see [reference.md](reference.md)

257claude --debug223- For usage examples, see [examples.md](examples.md)

258```224```

259 225 

260## Share Skills with your team226<Tip>Keep `SKILL.md` under 500 lines. Move detailed reference material to separate files.</Tip>

261 

262**Recommended approach**: Distribute Skills through [plugins](/en/plugins).

263 

264To share Skills via plugin:

265 227 

2661. Create a plugin with Skills in the `skills/` directory228### Control who invokes a skill

2672. Add the plugin to a marketplace

2683. Team members install the plugin

269 229 

270For complete instructions, see [Add Skills to your plugin](/en/plugins#add-skills-to-your-plugin).230By 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:

271 231 

272You can also share Skills directly through project repositories:232* **`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.

273 233 

274### Step 1: Add Skill to your project234* **`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.

275 235 

276Create a project Skill:236This example creates a deploy skill that only you can trigger. The `disable-model-invocation: true` field prevents Claude from running it automatically:

277 237 

278```bash theme={null}238```yaml theme={null}

279mkdir -p .claude/skills/team-skill239---

280# Create SKILL.md240name: deploy

281```241description: Deploy the application to production

242disable-model-invocation: true

243---

282 244 

283### Step 2: Commit to git245Deploy $ARGUMENTS to production:

284 246 

285```bash theme={null}2471. Run the test suite

286git add .claude/skills/2482. Build the application

287git commit -m "Add team Skill for PDF processing"2493. Push to the deployment target

288git push2504. Verify the deployment succeeded

289```251```

290 252 

291### Step 3: Team members get Skills automatically253Here's how the two fields affect invocation and context loading:

292 

293When team members pull the latest changes, Skills are immediately available:

294 

295```bash theme={null}

296git pull

297claude # Skills are now available

298```

299 254 

300## Update a Skill255| Frontmatter | You can invoke | Claude can invoke | When loaded into context |

256| :------------------------------- | :------------- | :---------------- | :----------------------------------------------------------- |

257| (default) | Yes | Yes | Description always in context, full skill loads when invoked |

258| `disable-model-invocation: true` | Yes | No | Description not in context, full skill loads when you invoke |

259| `user-invocable: false` | No | Yes | Description always in context, full skill loads when invoked |

301 260 

302Edit SKILL.md directly:261<Note>

303 262 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.

304```bash theme={null}263</Note>

305# Personal Skill

306code ~/.claude/skills/my-skill/SKILL.md

307 

308# Project Skill

309code .claude/skills/my-skill/SKILL.md

310```

311 

312Changes take effect the next time you start Claude Code. If Claude Code is already running, restart it to load the updates.

313 

314## Remove a Skill

315 264 

316Delete the Skill directory:265### Restrict tool access

317 266 

318```bash theme={null}267Use 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:

319# Personal

320rm -rf ~/.claude/skills/my-skill

321 268 

322# Project269```yaml theme={null}

323rm -rf .claude/skills/my-skill270---

324git commit -m "Remove unused Skill"271name: safe-reader

272description: Read files without making changes

273allowed-tools: Read, Grep, Glob

274---

325```275```

326 276 

327## Best practices277### Pass arguments to skills

328 

329### Keep Skills focused

330 278 

331One Skill should address one capability:279Both you and Claude can pass arguments when invoking a skill. Arguments are available via the `$ARGUMENTS` placeholder.

332 280 

333**Focused**:281This skill fixes a GitHub issue by number. The `$ARGUMENTS` placeholder gets replaced with whatever follows the skill name:

334 282 

335* "PDF form filling"283```yaml theme={null}

336* "Excel data analysis"284---

337* "Git commit messages"285name: fix-issue

286description: Fix a GitHub issue

287disable-model-invocation: true

288---

338 289 

339**Too broad**:290Fix GitHub issue $ARGUMENTS following our coding standards.

340 291 

341* "Document processing" (split into separate Skills)2921. Read the issue description

342* "Data tools" (split by data type or operation)2932. Understand the requirements

2943. Implement the fix

2954. Write tests

2965. Create a commit

297```

343 298 

344### Write clear descriptions299When you run `/fix-issue 123`, Claude receives "Fix GitHub issue 123 following our coding standards..."

345 300 

346Help Claude discover when to use Skills by including specific triggers in your description:301If 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.

347 302 

348**Clear**:303To access individual arguments by position, use `$ARGUMENTS[N]` or the shorter `$N`:

349 304 

350```yaml theme={null}305```yaml theme={null}

351description: Analyze Excel spreadsheets, create pivot tables, and generate charts. Use when working with Excel files, spreadsheets, or analyzing tabular data in .xlsx format.306---

352```307name: migrate-component

353 308description: Migrate a component from one framework to another

354**Vague**:309---

355 310 

356```yaml theme={null}311Migrate the $ARGUMENTS[0] component from $ARGUMENTS[1] to $ARGUMENTS[2].

357description: For files312Preserve all existing behavior and tests.

358```313```

359 314 

360### Test with your team315Running `/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:

361 

362Have teammates use Skills and provide feedback:

363 

364* Does the Skill activate when expected?

365* Are the instructions clear?

366* Are there missing examples or edge cases?

367 

368### Document Skill versions

369 316 

370You can document Skill versions in your SKILL.md content to track changes over time. Add a version history section:317```yaml theme={null}

371 318---

372```markdown theme={null}319name: migrate-component

373# My Skill320description: Migrate a component from one framework to another

321---

374 322 

375## Version History323Migrate the $0 component from $1 to $2.

376- v2.0.0 (2025-10-01): Breaking changes to API324Preserve all existing behavior and tests.

377- v1.1.0 (2025-09-15): Added new features

378- v1.0.0 (2025-09-01): Initial release

379```325```

380 326 

381This helps team members understand what changed between versions.327## Advanced patterns

382 328 

383## Troubleshooting329### Inject dynamic context

384 

385### Claude doesn't use my Skill

386 330 

387**Symptom**: You ask a relevant question but Claude doesn't use your Skill.331The `!`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.

388 332 

389**Check**: Is the description specific enough?333This 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:

390 334 

391Vague descriptions make discovery difficult. Include both what the Skill does and when to use it, with key terms users would mention.335```yaml theme={null}

336---

337name: pr-summary

338description: Summarize changes in a pull request

339context: fork

340agent: Explore

341allowed-tools: Bash(gh *)

342---

392 343 

393**Too generic**:344## Pull request context

345- PR diff: !`gh pr diff`

346- PR comments: !`gh pr view --comments`

347- Changed files: !`gh pr diff --name-only`

394 348 

395```yaml theme={null}349## Your task

396description: Helps with data350Summarize this pull request...

397```351```

398 352 

399**Specific**:353When this skill runs:

400 354 

401```yaml theme={null}3551. Each `!`command\`\` executes immediately (before Claude sees anything)

402description: Analyze Excel spreadsheets, generate pivot tables, create charts. Use when working with Excel files, spreadsheets, or .xlsx files.3562. The output replaces the placeholder in the skill content

403```3573. Claude receives the fully-rendered prompt with actual PR data

404 358 

405**Check**: Is the YAML valid?359This is preprocessing, not something Claude executes. Claude only sees the final result.

406 360 

407Run validation to check for syntax errors:361<Tip>

362 To enable [extended thinking](/en/common-workflows#use-extended-thinking-thinking-mode) in a skill, include the word "ultrathink" anywhere in your skill content.

363</Tip>

408 364 

409```bash theme={null}365### Run skills in a subagent

410# View frontmatter

411cat .claude/skills/my-skill/SKILL.md | head -n 15

412 366 

413# Check for common issues367Add `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.

414# - Missing opening or closing ---

415# - Tabs instead of spaces

416# - Unquoted strings with special characters

417```

418 368 

419**Check**: Is the Skill in the correct location?369<Warning>

370 `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.

371</Warning>

420 372 

421```bash theme={null}373Skills and [subagents](/en/sub-agents) work together in two directions:

422# Personal Skills

423ls ~/.claude/skills/*/SKILL.md

424 374 

425# Project Skills375| Approach | System prompt | Task | Also loads |

426ls .claude/skills/*/SKILL.md376| :--------------------------- | :---------------------------------------- | :-------------------------- | :--------------------------- |

427```377| Skill with `context: fork` | From agent type (`Explore`, `Plan`, etc.) | SKILL.md content | CLAUDE.md |

378| Subagent with `skills` field | Subagent's markdown body | Claude's delegation message | Preloaded skills + CLAUDE.md |

428 379 

429### Skill has errors380With `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).

430 381 

431**Symptom**: The Skill loads but doesn't work correctly.382#### Example: Research skill using Explore agent

432 383 

433**Check**: Are dependencies available?384This 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:

434 385 

435Claude will automatically install required dependencies (or ask for permission to install them) when it needs them.386```yaml theme={null}

387---

388name: deep-research

389description: Research a topic thoroughly

390context: fork

391agent: Explore

392---

436 393 

437**Check**: Do scripts have execute permissions?394Research $ARGUMENTS thoroughly:

438 395 

439```bash theme={null}3961. Find relevant files using Glob and Grep

440chmod +x .claude/skills/my-skill/scripts/*.py3972. Read and analyze the code

3983. Summarize findings with specific file references

441```399```

442 400 

443**Check**: Are file paths correct?401When this skill runs:

444 402 

445Use forward slashes (Unix style) in all paths:4031. A new isolated context is created

4042. The subagent receives the skill content as its prompt ("Research \$ARGUMENTS thoroughly...")

4053. The `agent` field determines the execution environment (model, tools, and permissions)

4064. Results are summarized and returned to your main conversation

446 407 

447**Correct**: `scripts/helper.py`408The `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`.

448**Wrong**: `scripts\helper.py` (Windows style)

449 409 

450### Multiple Skills conflict410### Restrict Claude's skill access

451 411 

452**Symptom**: Claude uses the wrong Skill or seems confused between similar Skills.412By 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.

453 413 

454**Be specific in descriptions**: Help Claude choose the right Skill by using distinct trigger terms in your descriptions.414Three ways to control which skills Claude can invoke:

455 415 

456Instead of:416**Disable all skills** by denying the Skill tool in `/permissions`:

457 417 

458```yaml theme={null}418```

459# Skill 1419# Add to deny rules:

460description: For data analysis420Skill

461 

462# Skill 2

463description: For analyzing data

464```421```

465 422 

466Use:423**Allow or deny specific skills** using [permission rules](/en/permissions):

467 424 

468```yaml theme={null}425```

469# Skill 1426# Allow only specific skills

470description: Analyze sales data in Excel files and CRM exports. Use for sales reports, pipeline analysis, and revenue tracking.427Skill(commit)

428Skill(review-pr *)

471 429 

472# Skill 2430# Deny specific skills

473description: Analyze log files and system metrics data. Use for performance monitoring, debugging, and system diagnostics.431Skill(deploy *)

474```432```

475 433 

476## Examples434Permission syntax: `Skill(name)` for exact match, `Skill(name *)` for prefix match with any arguments.

477 435 

478### Simple Skill (single file)436**Hide individual skills** by adding `disable-model-invocation: true` to their frontmatter. This removes the skill from Claude's context entirely.

479 437 

480```438<Note>

481commit-helper/439 The `user-invocable` field only controls menu visibility, not Skill tool access. Use `disable-model-invocation: true` to block programmatic invocation.

482└── SKILL.md440</Note>

483```

484 441 

485```yaml theme={null}442## Share skills

486name: generating-commit-messages

487description: Generates clear commit messages from git diffs. Use when writing commit messages or reviewing staged changes.

488 443 

489# Generating Commit Messages444Skills can be distributed at different scopes depending on your audience:

490 445 

491## Instructions446* **Project skills**: Commit `.claude/skills/` to version control

447* **Plugins**: Create a `skills/` directory in your [plugin](/en/plugins)

448* **Managed**: Deploy organization-wide through [managed settings](/en/permissions#managed-settings)

492 449 

4931. Run `git diff --staged` to see changes450### Generate visual output

4942. I'll suggest a commit message with:

495 - Summary under 50 characters

496 - Detailed description

497 - Affected components

498 451 

499## Best practices452Skills 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.

500 453 

501- Use present tense454This 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.

502- Explain what and why, not how

503```

504 455 

505### Skill with tool permissions456Create the Skill directory:

506 457 

507```458```bash theme={null}

508code-reviewer/459mkdir -p ~/.claude/skills/codebase-visualizer/scripts

509└── SKILL.md

510```460```

511 461 

512```yaml theme={null}462Create `~/.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:

463 

464````yaml theme={null}

513---465---

514name: code-reviewer466name: codebase-visualizer

515description: Review code for best practices and potential issues. Use when reviewing code, checking PRs, or analyzing code quality.467description: Generate an interactive collapsible tree visualization of your codebase. Use when exploring a new repo, understanding project structure, or identifying large files.

516allowed-tools: Read, Grep, Glob468allowed-tools: Bash(python *)

517---469---

518 470 

519# Code Reviewer471# Codebase Visualizer

520 472 

521## Review checklist473Generate an interactive HTML tree view that shows your project's file structure with collapsible directories.

522 474 

5231. Code organization and structure475## Usage

5242. Error handling

5253. Performance considerations

5264. Security concerns

5275. Test coverage

528 476 

529## Instructions477Run the visualization script from your project root:

530 478 

5311. Read the target files using Read tool479```bash

5322. Search for patterns using Grep480python ~/.claude/skills/codebase-visualizer/scripts/visualize.py .

5333. Find related files using Glob

5344. Provide detailed feedback on code quality

535```481```

536 482 

537### Multi-file Skill483This creates `codebase-map.html` in the current directory and opens it in your default browser.

538 484 

539```485## What the visualization shows

540pdf-processing/

541├── SKILL.md

542├── FORMS.md

543├── REFERENCE.md

544└── scripts/

545 ├── fill_form.py

546 └── validate.py

547```

548 486 

549**SKILL.md**:487- **Collapsible directories**: Click folders to expand/collapse

550 488- **File sizes**: Displayed next to each file

551````yaml theme={null}489- **Colors**: Different colors for different file types

552name: pdf-processing490- **Directory totals**: Shows aggregate size of each folder

553description: Extract text, fill forms, merge PDFs. Use when working with PDF files, forms, or document extraction. Requires pypdf and pdfplumber packages.491````

554 492 

555# PDF Processing493Create `~/.claude/skills/codebase-visualizer/scripts/visualize.py`. This script scans a directory tree and generates a self-contained HTML file with:

494 

495* A **summary sidebar** showing file count, directory count, total size, and number of file types

496* A **bar chart** breaking down the codebase by file type (top 8 by size)

497* A **collapsible tree** where you can expand and collapse directories, with color-coded file type indicators

498 

499The script requires Python but uses only built-in libraries, so there are no packages to install:

500 

501```python expandable theme={null}

502#!/usr/bin/env python3

503"""Generate an interactive collapsible tree visualization of a codebase."""

504 

505import json

506import sys

507import webbrowser

508from pathlib import Path

509from collections import Counter

510 

511IGNORE = {'.git', 'node_modules', '__pycache__', '.venv', 'venv', 'dist', 'build'}

512 

513def scan(path: Path, stats: dict) -> dict:

514 result = {"name": path.name, "children": [], "size": 0}

515 try:

516 for item in sorted(path.iterdir()):

517 if item.name in IGNORE or item.name.startswith('.'):

518 continue

519 if item.is_file():

520 size = item.stat().st_size

521 ext = item.suffix.lower() or '(no ext)'

522 result["children"].append({"name": item.name, "size": size, "ext": ext})

523 result["size"] += size

524 stats["files"] += 1

525 stats["extensions"][ext] += 1

526 stats["ext_sizes"][ext] += size

527 elif item.is_dir():

528 stats["dirs"] += 1

529 child = scan(item, stats)

530 if child["children"]:

531 result["children"].append(child)

532 result["size"] += child["size"]

533 except PermissionError:

534 pass

535 return result

536 

537def generate_html(data: dict, stats: dict, output: Path) -> None:

538 ext_sizes = stats["ext_sizes"]

539 total_size = sum(ext_sizes.values()) or 1

540 sorted_exts = sorted(ext_sizes.items(), key=lambda x: -x[1])[:8]

541 colors = {

542 '.js': '#f7df1e', '.ts': '#3178c6', '.py': '#3776ab', '.go': '#00add8',

543 '.rs': '#dea584', '.rb': '#cc342d', '.css': '#264de4', '.html': '#e34c26',

544 '.json': '#6b7280', '.md': '#083fa1', '.yaml': '#cb171e', '.yml': '#cb171e',

545 '.mdx': '#083fa1', '.tsx': '#3178c6', '.jsx': '#61dafb', '.sh': '#4eaa25',

546 }

547 lang_bars = "".join(

548 f'<div class="bar-row"><span class="bar-label">{ext}</span>'

549 f'<div class="bar" style="width:{(size/total_size)*100}%;background:{colors.get(ext,"#6b7280")}"></div>'

550 f'<span class="bar-pct">{(size/total_size)*100:.1f}%</span></div>'

551 for ext, size in sorted_exts

552 )

553 def fmt(b):

554 if b < 1024: return f"{b} B"

555 if b < 1048576: return f"{b/1024:.1f} KB"

556 return f"{b/1048576:.1f} MB"

557 

558 html = f'''<!DOCTYPE html>

559<html><head>

560 <meta charset="utf-8"><title>Codebase Explorer</title>

561 <style>

562 body {{ font: 14px/1.5 system-ui, sans-serif; margin: 0; background: #1a1a2e; color: #eee; }}

563 .container {{ display: flex; height: 100vh; }}

564 .sidebar {{ width: 280px; background: #252542; padding: 20px; border-right: 1px solid #3d3d5c; overflow-y: auto; flex-shrink: 0; }}

565 .main {{ flex: 1; padding: 20px; overflow-y: auto; }}

566 h1 {{ margin: 0 0 10px 0; font-size: 18px; }}

567 h2 {{ margin: 20px 0 10px 0; font-size: 14px; color: #888; text-transform: uppercase; }}

568 .stat {{ display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #3d3d5c; }}

569 .stat-value {{ font-weight: bold; }}

570 .bar-row {{ display: flex; align-items: center; margin: 6px 0; }}

571 .bar-label {{ width: 55px; font-size: 12px; color: #aaa; }}

572 .bar {{ height: 18px; border-radius: 3px; }}

573 .bar-pct {{ margin-left: 8px; font-size: 12px; color: #666; }}

574 .tree {{ list-style: none; padding-left: 20px; }}

575 details {{ cursor: pointer; }}

576 summary {{ padding: 4px 8px; border-radius: 4px; }}

577 summary:hover {{ background: #2d2d44; }}

578 .folder {{ color: #ffd700; }}

579 .file {{ display: flex; align-items: center; padding: 4px 8px; border-radius: 4px; }}

580 .file:hover {{ background: #2d2d44; }}

581 .size {{ color: #888; margin-left: auto; font-size: 12px; }}

582 .dot {{ width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; }}

583 </style>

584</head><body>

585 <div class="container">

586 <div class="sidebar">

587 <h1>📊 Summary</h1>

588 <div class="stat"><span>Files</span><span class="stat-value">{stats["files"]:,}</span></div>

589 <div class="stat"><span>Directories</span><span class="stat-value">{stats["dirs"]:,}</span></div>

590 <div class="stat"><span>Total size</span><span class="stat-value">{fmt(data["size"])}</span></div>

591 <div class="stat"><span>File types</span><span class="stat-value">{len(stats["extensions"])}</span></div>

592 <h2>By file type</h2>

593 {lang_bars}

594 </div>

595 <div class="main">

596 <h1>📁 {data["name"]}</h1>

597 <ul class="tree" id="root"></ul>

598 </div>

599 </div>

600 <script>

601 const data = {json.dumps(data)};

602 const colors = {json.dumps(colors)};

603 function fmt(b) {{ if (b < 1024) return b + ' B'; if (b < 1048576) return (b/1024).toFixed(1) + ' KB'; return (b/1048576).toFixed(1) + ' MB'; }}

604 function render(node, parent) {{

605 if (node.children) {{

606 const det = document.createElement('details');

607 det.open = parent === document.getElementById('root');

608 det.innerHTML = `<summary><span class="folder">📁 ${{node.name}}</span><span class="size">${{fmt(node.size)}}</span></summary>`;

609 const ul = document.createElement('ul'); ul.className = 'tree';

610 node.children.sort((a,b) => (b.children?1:0)-(a.children?1:0) || a.name.localeCompare(b.name));

611 node.children.forEach(c => render(c, ul));

612 det.appendChild(ul);

613 const li = document.createElement('li'); li.appendChild(det); parent.appendChild(li);

614 }} else {{

615 const li = document.createElement('li'); li.className = 'file';

616 li.innerHTML = `<span class="dot" style="background:${{colors[node.ext]||'#6b7280'}}"></span>${{node.name}}<span class="size">${{fmt(node.size)}}</span>`;

617 parent.appendChild(li);

618 }}

619 }}

620 data.children.forEach(c => render(c, document.getElementById('root')));

621 </script>

622</body></html>'''

623 output.write_text(html)

624 

625if __name__ == '__main__':

626 target = Path(sys.argv[1] if len(sys.argv) > 1 else '.').resolve()

627 stats = {"files": 0, "dirs": 0, "extensions": Counter(), "ext_sizes": Counter()}

628 data = scan(target, stats)

629 out = Path('codebase-map.html')

630 generate_html(data, stats, out)

631 print(f'Generated {out.absolute()}')

632 webbrowser.open(f'file://{out.absolute()}')

633```

634 

635To 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.

636 

637This 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.

556 638 

557## Quick start639## Troubleshooting

558 640 

559Extract text:641### Skill not triggering

560```python

561import pdfplumber

562with pdfplumber.open("doc.pdf") as pdf:

563 text = pdf.pages[0].extract_text()

564```

565 642 

566For form filling, see [FORMS.md](FORMS.md).643If Claude doesn't use your skill when expected:

567For detailed API reference, see [REFERENCE.md](REFERENCE.md).

568 644 

569## Requirements6451. Check the description includes keywords users would naturally say

6462. Verify the skill appears in `What skills are available?`

6473. Try rephrasing your request to match the description more closely

6484. Invoke it directly with `/skill-name` if the skill is user-invocable

570 649 

571Packages must be installed in your environment:650### Skill triggers too often

572```bash

573pip install pypdf pdfplumber

574```

575````

576 651 

577<Note>652If Claude uses your skill when you don't want it:

578 List required packages in the description. Packages must be installed in your environment before Claude can use them.

579</Note>

580 653 

581Claude loads additional files only when needed.6541. Make the description more specific

6552. Add `disable-model-invocation: true` if you only want manual invocation

582 656 

583## Next steps657### Claude doesn't see all my skills

584 658 

585<CardGroup cols={2}>659Skill descriptions are loaded into context so Claude knows what's available. If you have many skills, they may exceed the character budget (default 15,000 characters). Run `/context` to check for a warning about excluded skills.

586 <Card title="Authoring best practices" icon="lightbulb" href="https://docs.claude.com/en/docs/agents-and-tools/agent-skills/best-practices">

587 Write Skills that Claude can use effectively

588 </Card>

589 660 

590 <Card title="Agent Skills overview" icon="book" href="https://docs.claude.com/en/docs/agents-and-tools/agent-skills/overview">661To increase the limit, set the `SLASH_COMMAND_TOOL_CHAR_BUDGET` environment variable.

591 Learn how Skills work across Claude products

592 </Card>

593 662 

594 <Card title="Use Skills in the Agent SDK" icon="cube" href="https://docs.claude.com/en/docs/agent-sdk/skills">663## Related resources

595 Use Skills programmatically with TypeScript and Python

596 </Card>

597 664 

598 <Card title="Get started with Agent Skills" icon="rocket" href="https://docs.claude.com/en/docs/agents-and-tools/agent-skills/quickstart">665* **[Subagents](/en/sub-agents)**: delegate tasks to specialized agents

599 Create your first Skill666* **[Plugins](/en/plugins)**: package and distribute skills with other extensions

600 </Card>667* **[Hooks](/en/hooks)**: automate workflows around tool events

601</CardGroup>668* **[Memory](/en/memory)**: manage CLAUDE.md files for persistent context

669* **[Interactive mode](/en/interactive-mode#built-in-commands)**: built-in commands and shortcuts

670* **[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, Team, 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 −497 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| `/bashes` | List and manage background tasks |

12| `/bug` | Report bugs (sends conversation to Anthropic) |

13| `/clear` | Clear conversation history |

14| `/compact [instructions]` | Compact conversation with optional focus instructions |

15| `/config` | Open the Settings interface (Config tab) |

16| `/context` | Visualize current context usage as a colored grid |

17| `/cost` | Show token usage statistics (see [cost tracking guide](/en/costs#using-the-cost-command) for subscription-specific details) |

18| `/doctor` | Checks the health of your Claude Code installation |

19| `/exit` | Exit the REPL |

20| `/export [filename]` | Export the current conversation to a file or clipboard |

21| `/help` | Get usage help |

22| `/hooks` | Manage hook configurations for tool events |

23| `/ide` | Manage IDE integrations and show status |

24| `/init` | Initialize project with CLAUDE.md guide |

25| `/install-github-app` | Set up Claude GitHub Actions for a repository |

26| `/login` | Switch Anthropic accounts |

27| `/logout` | Sign out from your Anthropic account |

28| `/mcp` | Manage MCP server connections and OAuth authentication |

29| `/memory` | Edit CLAUDE.md memory files |

30| `/model` | Select or change the AI model |

31| `/output-style [style]` | Set the output style directly or from a selection menu |

32| `/permissions` | View or update [permissions](/en/iam#configuring-permissions) |

33| `/plugin` | Manage Claude Code plugins |

34| `/pr-comments` | View pull request comments |

35| `/privacy-settings` | View and update your privacy settings |

36| `/release-notes` | View release notes |

37| `/resume` | Resume a conversation |

38| `/review` | Request code review |

39| `/rewind` | Rewind the conversation and/or code |

40| `/sandbox` | Enable sandboxed bash tool with filesystem and network isolation for safer, more autonomous execution |

41| `/security-review` | Complete a security review of pending changes on the current branch |

42| `/status` | Open the Settings interface (Status tab) showing version, model, account, and connectivity |

43| `/statusline` | Set up Claude Code's status line UI |

44| `/terminal-setup` | Install Shift+Enter key binding for newlines (iTerm2 and VSCode only) |

45| `/todos` | List current todo items |

46| `/usage` | Show plan usage limits and rate limit status (subscription plans only) |

47| `/vim` | Enter vim mode for alternating insert and command modes |

48 

49## Custom slash commands

50 

51Custom 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.

52 

53### Syntax

54 

55```

56/<command-name> [arguments]

57```

58 

59#### Parameters

60 

61| Parameter | Description |

62| :--------------- | :---------------------------------------------------------------- |

63| `<command-name>` | Name derived from the Markdown filename (without `.md` extension) |

64| `[arguments]` | Optional arguments passed to the command |

65 

66### Command types

67 

68#### Project commands

69 

70Commands stored in your repository and shared with your team. When listed in `/help`, these commands show "(project)" after their description.

71 

72**Location**: `.claude/commands/`

73 

74In the following example, we create the `/optimize` command:

75 

76```bash theme={null}

77# Create a project command

78mkdir -p .claude/commands

79echo "Analyze this code for performance issues and suggest optimizations:" > .claude/commands/optimize.md

80```

81 

82#### Personal commands

83 

84Commands available across all your projects. When listed in `/help`, these commands show "(user)" after their description.

85 

86**Location**: `~/.claude/commands/`

87 

88In the following example, we create the `/security-review` command:

89 

90```bash theme={null}

91# Create a personal command

92mkdir -p ~/.claude/commands

93echo "Review this code for security vulnerabilities:" > ~/.claude/commands/security-review.md

94```

95 

96### Features

97 

98#### Namespacing

99 

100Organize 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.

101 

102Conflicts between user and project level commands are not supported. Otherwise, multiple commands with the same base file name can coexist.

103 

104For example, a file at `.claude/commands/frontend/component.md` creates the command `/component` with description showing "(project:frontend)".

105Meanwhile, a file at `~/.claude/commands/component.md` creates the command `/component` with description showing "(user)".

106 

107#### Arguments

108 

109Pass dynamic values to commands using argument placeholders:

110 

111##### All arguments with `$ARGUMENTS`

112 

113The `$ARGUMENTS` placeholder captures all arguments passed to the command:

114 

115```bash theme={null}

116# Command definition

117echo 'Fix issue #$ARGUMENTS following our coding standards' > .claude/commands/fix-issue.md

118 

119# Usage

120> /fix-issue 123 high-priority

121# $ARGUMENTS becomes: "123 high-priority"

122```

123 

124##### Individual arguments with `$1`, `$2`, etc.

125 

126Access specific arguments individually using positional parameters (similar to shell scripts):

127 

128```bash theme={null}

129# Command definition

130echo 'Review PR #$1 with priority $2 and assign to $3' > .claude/commands/review-pr.md

131 

132# Usage

133> /review-pr 456 high alice

134# $1 becomes "456", $2 becomes "high", $3 becomes "alice"

135```

136 

137Use positional arguments when you need to:

138 

139* Access arguments individually in different parts of your command

140* Provide defaults for missing arguments

141* Build more structured commands with specific parameter roles

142 

143#### Bash command execution

144 

145Execute 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.

146 

147For example:

148 

149```markdown theme={null}

150allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)

151description: Create a git commit

152 

153## Context

154 

155- Current git status: !`git status`

156- Current git diff (staged and unstaged changes): !`git diff HEAD`

157- Current branch: !`git branch --show-current`

158- Recent commits: !`git log --oneline -10`

159 

160## Your task

161 

162Based on the above changes, create a single git commit.

163```

164 

165#### File references

166 

167Include file contents in commands using the `@` prefix to [reference files](/en/common-workflows#reference-files-and-directories).

168 

169For example:

170 

171```markdown theme={null}

172# Reference a specific file

173 

174Review the implementation in @src/utils/helpers.js

175 

176# Reference multiple files

177 

178Compare @src/old-version.js with @src/new-version.js

179```

180 

181#### Thinking mode

182 

183Slash commands can trigger extended thinking by including [extended thinking keywords](/en/common-workflows#use-extended-thinking).

184 

185### Frontmatter

186 

187Command files support frontmatter, useful for specifying metadata about the command:

188 

189| Frontmatter | Purpose | Default |

190| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------- |

191| `allowed-tools` | List of tools the command can use | Inherits from the conversation |

192| `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 |

193| `description` | Brief description of the command | Uses the first line from the prompt |

194| `model` | Specific model string (see [Models overview](https://docs.claude.com/en/docs/about-claude/models/overview)) | Inherits from the conversation |

195| `disable-model-invocation` | Whether to prevent `SlashCommand` tool from calling this command | false |

196 

197For example:

198 

199```markdown theme={null}

200allowed-tools: Bash(git add:*), Bash(git status:*), Bash(git commit:*)

201argument-hint: [message]

202description: Create a git commit

203model: claude-3-5-haiku-20241022

204 

205Create a git commit with message: $ARGUMENTS

206```

207 

208Example using positional arguments:

209 

210```markdown theme={null}

211argument-hint: [pr-number] [priority] [assignee]

212description: Review pull request

213 

214Review PR #$1 with priority $2 and assign to $3.

215Focus on security, performance, and code style.

216```

217 

218## Plugin commands

219 

220[Plugins](/en/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/plugin-marketplaces).

221 

222### How plugin commands work

223 

224Plugin commands are:

225 

226* **Namespaced**: Commands can use the format `/plugin-name:command-name` to avoid conflicts (plugin prefix is optional unless there are name collisions)

227* **Automatically available**: Once a plugin is installed and enabled, its commands appear in `/help`

228* **Fully integrated**: Support all command features (arguments, frontmatter, bash execution, file references)

229 

230### Plugin command structure

231 

232**Location**: `commands/` directory in plugin root

233 

234**File format**: Markdown files with frontmatter

235 

236**Basic command structure**:

237 

238```markdown theme={null}

239description: Brief description of what the command does

240 

241# Command Name

242 

243Detailed instructions for Claude on how to execute this command.

244Include specific guidance on parameters, expected outcomes, and any special considerations.

245```

246 

247**Advanced command features**:

248 

249* **Arguments**: Use placeholders like `{arg1}` in command descriptions

250* **Subdirectories**: Organize commands in subdirectories for namespacing

251* **Bash integration**: Commands can execute shell scripts and programs

252* **File references**: Commands can reference and modify project files

253 

254### Invocation patterns

255 

256```shell Direct command (when no conflicts) theme={null}

257/command-name

258```

259 

260```shell Plugin-prefixed (when needed for disambiguation) theme={null}

261/plugin-name:command-name

262```

263 

264```shell With arguments (if command supports them) theme={null}

265/command-name arg1 arg2

266```

267 

268## MCP slash commands

269 

270MCP servers can expose prompts as slash commands that become available in Claude Code. These commands are dynamically discovered from connected MCP servers.

271 

272### Command format

273 

274MCP commands follow the pattern:

275 

276```

277/mcp__<server-name>__<prompt-name> [arguments]

278```

279 

280### Features

281 

282#### Dynamic discovery

283 

284MCP commands are automatically available when:

285 

286* An MCP server is connected and active

287* The server exposes prompts through the MCP protocol

288* The prompts are successfully retrieved during connection

289 

290#### Arguments

291 

292MCP prompts can accept arguments defined by the server:

293 

294```

295# Without arguments

296> /mcp__github__list_prs

297 

298# With arguments

299> /mcp__github__pr_review 456

300> /mcp__jira__create_issue "Bug title" high

301```

302 

303#### Naming conventions

304 

305* Server and prompt names are normalized

306* Spaces and special characters become underscores

307* Names are lowercased for consistency

308 

309### Managing MCP connections

310 

311Use the `/mcp` command to:

312 

313* View all configured MCP servers

314* Check connection status

315* Authenticate with OAuth-enabled servers

316* Clear authentication tokens

317* View available tools and prompts from each server

318 

319### MCP permissions and wildcards

320 

321When configuring [permissions for MCP tools](/en/iam#tool-specific-permission-rules), note that **wildcards are not supported**:

322 

323* ✅ **Correct**: `mcp__github` (approves ALL tools from the github server)

324* ✅ **Correct**: `mcp__github__get_issue` (approves specific tool)

325* ❌ **Incorrect**: `mcp__github__*` (wildcards not supported)

326 

327To approve all tools from an MCP server, use just the server name: `mcp__servername`. To approve specific tools only, list each tool individually.

328 

329## `SlashCommand` tool

330 

331The `SlashCommand` tool allows Claude to execute [custom slash commands](/en/slash-commands#custom-slash-commands) programmatically

332during a conversation. This gives Claude the ability to invoke custom commands

333on your behalf when appropriate.

334 

335To encourage Claude to trigger `SlashCommand` tool, your instructions (prompts,

336CLAUDE.md, etc.) generally need to reference the command by name with its slash.

337 

338Example:

339 

340```

341> Run /write-unit-test when you are about to start writing tests.

342```

343 

344This tool puts each available custom slash command's metadata into context up to the

345character budget limit. You can use `/context` to monitor token usage and follow

346the operations below to manage context.

347 

348### `SlashCommand` tool supported commands

349 

350`SlashCommand` tool only supports custom slash commands that:

351 

352* Are user-defined. Built-in commands like `/compact` and `/init` are *not* supported.

353* Have the `description` frontmatter field populated. We use the `description` in the context.

354 

355For Claude Code versions >= 1.0.124, you can see which custom slash commands

356`SlashCommand` tool can invoke by running `claude --debug` and triggering a query.

357 

358### Disable `SlashCommand` tool

359 

360To prevent Claude from executing any slash commands via the tool:

361 

362```bash theme={null}

363/permissions

364# Add to deny rules: SlashCommand

365```

366 

367This will also remove SlashCommand tool (and the slash command descriptions) from context.

368 

369### Disable specific commands only

370 

371To prevent a specific slash command from becoming available, add

372`disable-model-invocation: true` to the slash command's frontmatter.

373 

374This will also remove the command's metadata from context.

375 

376### `SlashCommand` permission rules

377 

378The permission rules support:

379 

380* **Exact match**: `SlashCommand:/commit` (allows only `/commit` with no arguments)

381* **Prefix match**: `SlashCommand:/review-pr:*` (allows `/review-pr` with any arguments)

382 

383### Character budget limit

384 

385The `SlashCommand` tool includes a character budget to limit the size of command

386descriptions shown to Claude. This prevents token overflow when many commands

387are available.

388 

389The budget includes each custom slash command's name, args, and description.

390 

391* **Default limit**: 15,000 characters

392* **Custom limit**: Set via `SLASH_COMMAND_TOOL_CHAR_BUDGET` environment variable

393 

394When the character budget is exceeded, Claude will see only a subset of the

395available commands. In `/context`, a warning will show with "M of N commands".

396 

397## Skills vs slash commands

398 

399**Slash commands** and **Agent Skills** serve different purposes in Claude Code:

400 

401### Use slash commands for

402 

403**Quick, frequently-used prompts**:

404 

405* Simple prompt snippets you use often

406* Quick reminders or templates

407* Frequently-used instructions that fit in one file

408 

409**Examples**:

410 

411* `/review` → "Review this code for bugs and suggest improvements"

412* `/explain` → "Explain this code in simple terms"

413* `/optimize` → "Analyze this code for performance issues"

414 

415### Use Skills for

416 

417**Comprehensive capabilities with structure**:

418 

419* Complex workflows with multiple steps

420* Capabilities requiring scripts or utilities

421* Knowledge organized across multiple files

422* Team workflows you want to standardize

423 

424**Examples**:

425 

426* PDF processing Skill with form-filling scripts and validation

427* Data analysis Skill with reference docs for different data types

428* Documentation Skill with style guides and templates

429 

430### Key differences

431 

432| Aspect | Slash Commands | Agent Skills |

433| -------------- | -------------------------------- | ----------------------------------- |

434| **Complexity** | Simple prompts | Complex capabilities |

435| **Structure** | Single .md file | Directory with SKILL.md + resources |

436| **Discovery** | Explicit invocation (`/command`) | Automatic (based on context) |

437| **Files** | One file only | Multiple files, scripts, templates |

438| **Scope** | Project or personal | Project or personal |

439| **Sharing** | Via git | Via git |

440 

441### Example comparison

442 

443**As a slash command**:

444 

445```markdown theme={null}

446# .claude/commands/review.md

447Review this code for:

448- Security vulnerabilities

449- Performance issues

450- Code style violations

451```

452 

453Usage: `/review` (manual invocation)

454 

455**As a Skill**:

456 

457```

458.claude/skills/code-review/

459├── SKILL.md (overview and workflows)

460├── SECURITY.md (security checklist)

461├── PERFORMANCE.md (performance patterns)

462├── STYLE.md (style guide reference)

463└── scripts/

464 └── run-linters.sh

465```

466 

467Usage: "Can you review this code?" (automatic discovery)

468 

469The Skill provides richer context, validation scripts, and organized reference material.

470 

471### When to use each

472 

473**Use slash commands**:

474 

475* You invoke the same prompt repeatedly

476* The prompt fits in a single file

477* You want explicit control over when it runs

478 

479**Use Skills**:

480 

481* Claude should discover the capability automatically

482* Multiple files or scripts are needed

483* Complex workflows with validation steps

484* Team needs standardized, detailed guidance

485 

486Both slash commands and Skills can coexist. Use the approach that fits your needs.

487 

488Learn more about [Agent Skills](/en/skills).

489 

490## See also

491 

492* [Plugins](/en/plugins) - Extend Claude Code with custom commands through plugins

493* [Identity and Access Management](/en/iam) - Complete guide to permissions, including MCP tool permissions

494* [Interactive mode](/en/interactive-mode) - Shortcuts, input modes, and interactive features

495* [CLI reference](/en/cli-reference) - Command-line flags and options

496* [Settings](/en/settings) - Configuration options

497* [Memory management](/en/memory) - Managing Claude's memory across sessions

statusline.md +68 −1

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# Status line configuration5# Status line configuration

2 6 

3> Create a custom status line for Claude Code to display contextual information7> Create a custom status line for Claude Code to display contextual information


25## How it Works29## How it Works

26 30 

27* The status line is updated when the conversation messages update31* The status line is updated when the conversation messages update

28* Updates run at most every 300ms32* Updates run at most every 300 ms

29* The first line of stdout from your command becomes the status line text33* The first line of stdout from your command becomes the status line text

30* ANSI color codes are supported for styling your status line34* ANSI color codes are supported for styling your status line

31* Claude Code passes contextual information about the current session (model, directories, etc.) as JSON to your script via stdin35* Claude Code passes contextual information about the current session (model, directories, etc.) as JSON to your script via stdin


58 "total_api_duration_ms": 2300,62 "total_api_duration_ms": 2300,

59 "total_lines_added": 156,63 "total_lines_added": 156,

60 "total_lines_removed": 2364 "total_lines_removed": 23

65 },

66 "context_window": {

67 "total_input_tokens": 15234,

68 "total_output_tokens": 4521,

69 "context_window_size": 200000,

70 "used_percentage": 42.5,

71 "remaining_percentage": 57.5,

72 "current_usage": {

73 "input_tokens": 8500,

74 "output_tokens": 1200,

75 "cache_creation_input_tokens": 5000,

76 "cache_read_input_tokens": 2000

77 }

61 }78 }

62}79}

63```80```


181get_duration() { echo "$input" | jq -r '.cost.total_duration_ms'; }198get_duration() { echo "$input" | jq -r '.cost.total_duration_ms'; }

182get_lines_added() { echo "$input" | jq -r '.cost.total_lines_added'; }199get_lines_added() { echo "$input" | jq -r '.cost.total_lines_added'; }

183get_lines_removed() { echo "$input" | jq -r '.cost.total_lines_removed'; }200get_lines_removed() { echo "$input" | jq -r '.cost.total_lines_removed'; }

201get_input_tokens() { echo "$input" | jq -r '.context_window.total_input_tokens'; }

202get_output_tokens() { echo "$input" | jq -r '.context_window.total_output_tokens'; }

203get_context_window_size() { echo "$input" | jq -r '.context_window.context_window_size'; }

184 204 

185# Use the helpers205# Use the helpers

186MODEL=$(get_model_name)206MODEL=$(get_model_name)


188echo "[$MODEL] 📁 ${DIR##*/}"208echo "[$MODEL] 📁 ${DIR##*/}"

189```209```

190 210 

211### Context Window Usage

212 

213Display the percentage of context window consumed. The `context_window` object contains:

214 

215* `total_input_tokens` / `total_output_tokens`: Cumulative totals across the entire session

216* `used_percentage`: Pre-calculated percentage of context window used (0-100)

217* `remaining_percentage`: Pre-calculated percentage of context window remaining (0-100)

218* `current_usage`: Current context window usage from the last API call (may be `null` if no messages yet)

219 * `input_tokens`: Input tokens in current context

220 * `output_tokens`: Output tokens generated

221 * `cache_creation_input_tokens`: Tokens written to cache

222 * `cache_read_input_tokens`: Tokens read from cache

223 

224You can use the pre-calculated `used_percentage` and `remaining_percentage` fields directly, or calculate from `current_usage` for more control.

225 

226**Simple approach using pre-calculated percentages:**

227 

228```bash theme={null}

229#!/bin/bash

230input=$(cat)

231 

232MODEL=$(echo "$input" | jq -r '.model.display_name')

233PERCENT_USED=$(echo "$input" | jq -r '.context_window.used_percentage // 0')

234 

235echo "[$MODEL] Context: ${PERCENT_USED}%"

236```

237 

238**Advanced approach with manual calculation:**

239 

240```bash theme={null}

241#!/bin/bash

242input=$(cat)

243 

244MODEL=$(echo "$input" | jq -r '.model.display_name')

245CONTEXT_SIZE=$(echo "$input" | jq -r '.context_window.context_window_size')

246USAGE=$(echo "$input" | jq '.context_window.current_usage')

247 

248if [ "$USAGE" != "null" ]; then

249 # Calculate current context from current_usage fields

250 CURRENT_TOKENS=$(echo "$USAGE" | jq '.input_tokens + .cache_creation_input_tokens + .cache_read_input_tokens')

251 PERCENT_USED=$((CURRENT_TOKENS * 100 / CONTEXT_SIZE))

252 echo "[$MODEL] Context: ${PERCENT_USED}%"

253else

254 echo "[$MODEL] Context: 0%"

255fi

256```

257 

191## Tips258## Tips

192 259 

193* Keep your status line concise - it should fit on one line260* Keep your status line concise - it should fit on one line

sub-agents.md +460 −284

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 

11Subagents help you:

12 

13* **Preserve context** by keeping exploration and implementation out of your main conversation

14* **Enforce constraints** by limiting which tools a subagent can use

15* **Reuse configurations** across projects with user-level subagents

16* **Specialize behavior** with focused system prompts for specific domains

17* **Control costs** by routing tasks to faster, cheaper models like Haiku

18 

19Claude 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.

20 

21Claude 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).

22 

23## Built-in subagents

24 

25Claude Code includes built-in subagents that Claude automatically uses when appropriate. Each inherits the parent conversation's permissions with additional tool restrictions.

26 

27<Tabs>

28 <Tab title="Explore">

29 A fast, read-only agent optimized for searching and analyzing codebases.

30 

31 * **Model**: Haiku (fast, low-latency)

32 * **Tools**: Read-only tools (denied access to Write and Edit tools)

33 * **Purpose**: File discovery, code search, codebase exploration

6 34 

7## What are subagents?35 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 36 

9Subagents are pre-configured AI personalities that Claude Code can delegate tasks to. Each subagent:37 When invoking Explore, Claude specifies a thoroughness level: **quick** for targeted lookups, **medium** for balanced exploration, or **very thorough** for comprehensive analysis.

38 </Tab>

10 39 

11* Has a specific purpose and expertise area40 <Tab title="Plan">

12* Uses its own context window separate from the main conversation41 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 42 

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.43 * **Model**: Inherits from main conversation

44 * **Tools**: Read-only tools (denied access to Write and Edit tools)

45 * **Purpose**: Codebase research for planning

17 46 

18## Key benefits47 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.

48 </Tab>

19 49 

20<CardGroup cols={2}>50 <Tab title="General-purpose">

21 <Card title="Context preservation" icon="layer-group">51 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 52 

25 <Card title="Specialized expertise" icon="brain">53 * **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.54 * **Tools**: All tools

27 </Card>55 * **Purpose**: Complex research, multi-step operations, code modifications

28 56 

29 <Card title="Reusability" icon="rotate">57 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.58 </Tab>

31 </Card>

32 59 

33 <Card title="Flexible permissions" icon="shield-check">60 <Tab title="Other">

34 Each subagent can have different tool access levels, allowing you to limit powerful tools to specific subagent types.61 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 62 

38## Quick start63 | Agent | Model | When Claude uses it |

64 | :---------------- | :------- | :------------------------------------------------------- |

65 | Bash | Inherits | Running terminal commands in a separate context |

66 | statusline-setup | Sonnet | When you run `/statusline` to configure your status line |

67 | Claude Code Guide | Haiku | When you ask questions about Claude Code features |

68 </Tab>

69</Tabs>

39 70 

40To create your first subagent:71Beyond 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.

72 

73## Quickstart: create your first subagent

74 

75Subagents are defined in Markdown files with YAML frontmatter. You can [create them manually](#write-subagent-files) or use the `/agents` command.

76 

77This walkthrough guides you through creating a user-level subagent with the `/agent` command. The subagent reviews code and suggests improvements for the codebase.

41 78 

42<Steps>79<Steps>

43 <Step title="Open the subagents interface">80 <Step title="Open the subagents interface">

44 Run the following command:81 In Claude Code, run:

45 82 

46 ```83 ```

47 /agents84 /agents

48 ```85 ```

49 </Step>86 </Step>

50 87 

51 <Step title="Select 'Create New Agent'">88 <Step title="Create a new user-level agent">

52 Choose whether to create a project-level or user-level subagent89 Select **Create new agent**, then choose **User-level**. This saves the subagent to `~/.claude/agents/` so it's available in all your projects.

90 </Step>

91 

92 <Step title="Generate with Claude">

93 Select **Generate with Claude**. When prompted, describe the subagent:

94 

95 ```

96 A code improvement agent that scans files and suggests improvements

97 for readability, performance, and best practices. It should explain

98 each issue, show the current code, and provide an improved version.

99 ```

100 

101 Claude generates the system prompt and configuration. Press `e` to open it in your editor if you want to customize it.

102 </Step>

103 

104 <Step title="Select tools">

105 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.

53 </Step>106 </Step>

54 107 

55 <Step title="Define the subagent">108 <Step title="Select model">

56 * **Recommended**: Generate with Claude first, then customize to make it yours109 Choose which model the subagent uses. For this example agent, select **Sonnet**, which balances capability and speed for analyzing code patterns.

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>110 </Step>

62 111 

63 <Step title="Save and use">112 <Step title="Choose a color">

64 Your subagent is now available! Claude will use it automatically when appropriate, or you can invoke it explicitly:113 Pick a background color for the subagent. This helps you identify which subagent is running in the UI.

114 </Step>

115 

116 <Step title="Save and try it out">

117 Save the subagent. It's available immediately (no restart needed). Try it:

65 118 

66 ```119 ```

67 > Use the code-reviewer subagent to check my recent changes120 Use the code-improver agent to suggest improvements in this project

68 ```121 ```

122 

123 Claude delegates to your new subagent, which scans the codebase and returns improvement suggestions.

69 </Step>124 </Step>

70</Steps>125</Steps>

71 126 

72## Subagent configuration127You now have a subagent you can use in any project on your machine to analyze codebases and suggest improvements.

73 128 

74### File locations129You 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.

75 130 

76Subagents are stored as Markdown files with YAML frontmatter in two possible locations:131## Configure subagents

77 132 

78| Type | Location | Scope | Priority |133### Use the /agents command

79| :-------------------- | :------------------ | :---------------------------- | :------- |

80| **Project subagents** | `.claude/agents/` | Available in current project | Highest |

81| **User subagents** | `~/.claude/agents/` | Available across all projects | Lower |

82 134 

83When subagent names conflict, project-level subagents take precedence over user-level subagents.135The `/agents` command provides an interactive interface for managing subagents. Run `/agents` to:

84 136 

85### Plugin agents137* View all available subagents (built-in, user, project, and plugin)

138* Create new subagents with guided setup or Claude generation

139* Edit existing subagent configuration and tool access

140* Delete custom subagents

141* See which subagents are active when duplicates exist

86 142 

87[Plugins](/en/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.143This is the recommended way to create and manage subagents. For manual creation or automation, you can also add subagent files directly.

88 144 

89**Plugin agent locations**: Plugins include agents in their `agents/` directory (or custom paths specified in the plugin manifest).145### Choose the subagent scope

90 146 

91**Using plugin agents**:147Subagents 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 148 

93* Plugin agents appear in `/agents` alongside your custom agents149| Location | Scope | Priority | How to create |

94* Can be invoked explicitly: "Use the code-reviewer agent from the security-plugin"150| :--------------------------- | :---------------------- | :---------- | :------------------------------------ |

95* Can be invoked automatically by Claude when appropriate151| `--agents` CLI flag | Current session | 1 (highest) | Pass JSON when launching Claude Code |

96* Can be managed (viewed, inspected) through `/agents` interface152| `.claude/agents/` | Current project | 2 | Interactive or manual |

153| `~/.claude/agents/` | All your projects | 3 | Interactive or manual |

154| Plugin's `agents/` directory | Where plugin is enabled | 4 (lowest) | Installed with [plugins](/en/plugins) |

97 155 

98See the [plugin components reference](/en/plugins-reference#agents) for details on creating plugin agents.156**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 157 

100### CLI-based configuration158**User subagents** (`~/.claude/agents/`) are personal subagents available in all your projects.

101 159 

102You can also define subagents dynamically using the `--agents` CLI flag, which accepts a JSON object:160**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 161 

104```bash theme={null}162```bash theme={null}

105claude --agents '{163claude --agents '{


112}'170}'

113```171```

114 172 

115**Priority**: CLI-defined subagents have lower priority than project-level subagents but higher priority than user-level subagents.173The `--agents` flag accepts JSON with the same fields as [frontmatter](#supported-frontmatter-fields). 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 174 

119* Quick testing of subagent configurations175**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 176 

124For detailed information about the JSON format and all available options, see the [CLI reference documentation](/en/cli-reference#agents-flag-format).177### Write subagent files

125 178 

126### File format179Subagent files use YAML frontmatter for configuration, followed by the system prompt in Markdown:

127 180 

128Each subagent is defined in a Markdown file with this structure:181<Note>

182 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.

183</Note>

129 184 

130```markdown theme={null}185```markdown theme={null}

131---186---

132name: your-sub-agent-name187name: code-reviewer

133description: Description of when this subagent should be invoked188description: Reviews code for quality and best practices

134tools: tool1, tool2, tool3 # Optional - inherits all tools if omitted189tools: Read, Glob, Grep

135model: sonnet # Optional - specify model alias or 'inherit'190model: sonnet

136permissionMode: default # Optional - permission mode for the subagent

137skills: skill1, skill2 # Optional - skills to auto-load

138---191---

139 192 

140Your subagent's system prompt goes here. This can be multiple paragraphs193You are a code reviewer. When invoked, analyze the code and provide

141and should clearly define the subagent's role, capabilities, and approach194specific, actionable feedback on quality, security, and best practices.

142to solving problems.

143 

144Include specific instructions, best practices, and any constraints

145the subagent should follow.

146```195```

147 196 

148#### Configuration fields197The 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.

198 

199#### Supported frontmatter fields

200 

201The following fields can be used in the YAML frontmatter. Only `name` and `description` are required.

149 202 

150| Field | Required | Description |203| Field | Required | Description |

151| :--------------- | :------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |204| :---------------- | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

152| `name` | Yes | Unique identifier using lowercase letters and hyphens |205| `name` | Yes | Unique identifier using lowercase letters and hyphens |

153| `description` | Yes | Natural language description of the subagent's purpose |206| `description` | Yes | When Claude should delegate to this subagent |

154| `tools` | No | Comma-separated list of specific tools. If omitted, inherits all tools from the main thread |207| `tools` | No | [Tools](#available-tools) the subagent can use. Inherits all tools if omitted |

155| `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/model-config) |208| `disallowedTools` | No | Tools to deny, removed from inherited or specified list |

156| `permissionMode` | No | Permission mode for the subagent. Valid values: `default`, `acceptEdits`, `bypassPermissions`, `plan`, `ignore`. Controls how the subagent handles permission requests |209| `model` | No | [Model](#choose-a-model) to use: `sonnet`, `opus`, `haiku`, or `inherit`. Defaults to `inherit` |

157| `skills` | No | Comma-separated list of skill names to auto-load when the subagent starts. Skills are loaded into the subagent's context automatically |210| `permissionMode` | No | [Permission mode](#permission-modes): `default`, `acceptEdits`, `dontAsk`, `bypassPermissions`, or `plan` |

211| `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 |

212| `hooks` | No | [Lifecycle hooks](#define-hooks-for-subagents) scoped to this subagent |

158 213 

159### Model selection214### Choose a model

160 215 

161The `model` field allows you to control which [AI model](/en/model-config) the subagent uses:216The `model` field controls which [AI model](/en/model-config) the subagent uses:

162 217 

163* **Model alias**: Use one of the available aliases: `sonnet`, `opus`, or `haiku`218* **Model alias**: Use one of the available aliases: `sonnet`, `opus`, or `haiku`

164* **`'inherit'`**: Use the same model as the main conversation (useful for consistency)219* **inherit**: Use the same model as the main conversation

165* **Omitted**: If not specified, uses the default model configured for subagents (`sonnet`)220* **Omitted**: If not specified, defaults to `inherit` (uses the same model as the main conversation)

221 

222### Control subagent capabilities

223 

224You can control what subagents can do through tool access, permission modes, and conditional rules.

225 

226#### Available tools

227 

228Subagents 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.

229 

230To restrict tools, use the `tools` field (allowlist) or `disallowedTools` field (denylist):

231 

232```yaml theme={null}

233---

234name: safe-researcher

235description: Research agent with restricted capabilities

236tools: Read, Grep, Glob, Bash

237disallowedTools: Write, Edit

238---

239```

240 

241#### Permission modes

242 

243The `permissionMode` field controls how the subagent handles permission prompts. Subagents inherit the permission context from the main conversation but can override the mode.

244 

245| Mode | Behavior |

246| :------------------ | :----------------------------------------------------------------- |

247| `default` | Standard permission checking with prompts |

248| `acceptEdits` | Auto-accept file edits |

249| `dontAsk` | Auto-deny permission prompts (explicitly allowed tools still work) |

250| `bypassPermissions` | Skip all permission checks |

251| `plan` | Plan mode (read-only exploration) |

252 

253<Warning>

254 Use `bypassPermissions` with caution. It skips all permission checks, allowing the subagent to execute any operation without approval.

255</Warning>

256 

257If the parent uses `bypassPermissions`, this takes precedence and cannot be overridden.

258 

259#### Preload skills into subagents

260 

261Use 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.

262 

263```yaml theme={null}

264---

265name: api-developer

266description: Implement API endpoints following team conventions

267skills:

268 - api-conventions

269 - error-handling-patterns

270---

271 

272Implement API endpoints. Follow the conventions and patterns from the preloaded skills.

273```

274 

275The 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.

166 276 

167<Note>277<Note>

168 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.278 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.

169</Note>279</Note>

170 280 

171### Available tools281#### Conditional rules with hooks

172 282 

173Subagents can be granted access to any of Claude Code's internal tools. See the [tools documentation](/en/settings#tools-available-to-claude) for a complete list of available tools.283For 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.

174 284 

175<Tip>285This 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:

176 **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.286 

177</Tip>287```yaml theme={null}

288---

289name: db-reader

290description: Execute read-only database queries

291tools: Bash

292hooks:

293 PreToolUse:

294 - matcher: "Bash"

295 hooks:

296 - type: command

297 command: "./scripts/validate-readonly-query.sh"

298---

299```

300 

301Claude 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:

178 302 

179You have two options for configuring tools:303```bash theme={null}

304#!/bin/bash

305# ./scripts/validate-readonly-query.sh

180 306 

181* **Omit the `tools` field** to inherit all tools from the main thread (default), including MCP tools307INPUT=$(cat)

182* **Specify individual tools** as a comma-separated list for more granular control (can be edited manually or via `/agents`)308COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

183 309 

184**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.310# Block SQL write operations (case-insensitive)

311if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE)\b' > /dev/null; then

312 echo "Blocked: Only SELECT queries are allowed" >&2

313 exit 2

314fi

315 

316exit 0

317```

185 318 

186## Managing subagents319See [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.

187 320 

188### Using the /agents command (Recommended)321#### Disable specific subagents

189 322 

190The `/agents` command provides a comprehensive interface for subagent management:323You 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.

191 324 

325```json theme={null}

326{

327 "permissions": {

328 "deny": ["Task(Explore)", "Task(my-custom-agent)"]

329 }

330}

192```331```

193/agents332 

333This works for both built-in and custom subagents. You can also use the `--disallowedTools` CLI flag:

334 

335```bash theme={null}

336claude --disallowedTools "Task(Explore)"

194```337```

195 338 

196This opens an interactive menu where you can:339See [Permissions documentation](/en/permissions#tool-specific-permission-rules) for more details on permission rules.

197 340 

198* View all available subagents (built-in, user, and project)341### Define hooks for subagents

199* Create new subagents with guided setup

200* Edit existing custom subagents, including their tool access

201* Delete custom subagents

202* See which subagents are active when duplicates exist

203* **Easily manage tool permissions** with a complete list of available tools

204 342 

205### Direct file management343Subagents can define [hooks](/en/hooks) that run during the subagent's lifecycle. There are two ways to configure hooks:

206 344 

207You can also manage subagents by working directly with their files:3451. **In the subagent's frontmatter**: Define hooks that run only while that subagent is active

3462. **In `settings.json`**: Define hooks that run in the main session when subagents start or stop

208 347 

209```bash theme={null}348#### Hooks in subagent frontmatter

210# Create a project subagent349 

211mkdir -p .claude/agents350Define 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.

212echo '---351 

213name: test-runner352All [hook events](/en/hooks#hook-events) are supported. The most common events for subagents are:

214description: Use proactively to run tests and fix failures

215 353 

216You 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.md354| Event | Matcher input | When it fires |

355| :------------ | :------------ | :------------------------------------------------------------------ |

356| `PreToolUse` | Tool name | Before the subagent uses a tool |

357| `PostToolUse` | Tool name | After the subagent uses a tool |

358| `Stop` | (none) | When the subagent finishes (converted to `SubagentStop` at runtime) |

217 359 

218# Create a user subagent360This example validates Bash commands with the `PreToolUse` hook and runs a linter after file edits with `PostToolUse`:

219mkdir -p ~/.claude/agents361 

220# ... create subagent file362```yaml theme={null}

363---

364name: code-reviewer

365description: Review code changes with automatic linting

366hooks:

367 PreToolUse:

368 - matcher: "Bash"

369 hooks:

370 - type: command

371 command: "./scripts/validate-command.sh $TOOL_INPUT"

372 PostToolUse:

373 - matcher: "Edit|Write"

374 hooks:

375 - type: command

376 command: "./scripts/run-linter.sh"

377---

221```378```

222 379 

223## Using subagents effectively380`Stop` hooks in frontmatter are automatically converted to `SubagentStop` events.

224 381 

225### Automatic delegation382#### Project-level hooks for subagent events

226 383 

227Claude Code proactively delegates tasks based on:384Configure hooks in `settings.json` that respond to subagent lifecycle events in the main session.

228 385 

229* The task description in your request386| Event | Matcher input | When it fires |

230* The `description` field in subagent configurations387| :-------------- | :-------------- | :------------------------------- |

231* Current context and available tools388| `SubagentStart` | Agent type name | When a subagent begins execution |

389| `SubagentStop` | (none) | When any subagent completes |

232 390 

233<Tip>391`SubagentStart` supports matchers to target specific agent types by name. `SubagentStop` fires for all subagent completions regardless of matcher values. This example runs a setup script only when the `db-agent` subagent starts, and a cleanup script when any subagent stops:

234 To encourage more proactive subagent use, include phrases like "use PROACTIVELY" or "MUST BE USED" in your `description` field.392 

235</Tip>393```json theme={null}

394{

395 "hooks": {

396 "SubagentStart": [

397 {

398 "matcher": "db-agent",

399 "hooks": [

400 { "type": "command", "command": "./scripts/setup-db-connection.sh" }

401 ]

402 }

403 ],

404 "SubagentStop": [

405 {

406 "hooks": [

407 { "type": "command", "command": "./scripts/cleanup-db-connection.sh" }

408 ]

409 }

410 ]

411 }

412}

413```

414 

415See [Hooks](/en/hooks) for the complete hook configuration format.

416 

417## Work with subagents

418 

419### Understand automatic delegation

236 420 

237### Explicit invocation421Claude 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.

238 422 

239Request a specific subagent by mentioning it in your command:423You can also request a specific subagent explicitly:

240 424 

241```425```

242> Use the test-runner subagent to fix failing tests426Use the test-runner subagent to fix failing tests

243> Have the code-reviewer subagent look at my recent changes427Have the code-reviewer subagent look at my recent changes

244> Ask the debugger subagent to investigate this error

245```428```

246 429 

247## Built-in subagents430### Run subagents in foreground or background

248 431 

249Claude Code includes built-in subagents that are available out of the box:432Subagents can run in the foreground (blocking) or background (concurrent):

250 433 

251### General-purpose subagent434* **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.

435* **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. MCP tools are not available in background subagents.

252 436 

253The general-purpose subagent is a capable agent for complex, multi-step tasks that require both exploration and action. Unlike the Explore subagent, it can modify files and execute a wider range of operations.437If a background subagent fails due to missing permissions, you can [resume it](#resume-subagents) in the foreground to retry with interactive prompts.

254 438 

255**Key characteristics:**439Claude decides whether to run subagents in the foreground or background based on the task. You can also:

256 440 

257* **Model**: Uses Sonnet for more capable reasoning441* Ask Claude to "run this in the background"

258* **Tools**: Has access to all tools442* Press **Ctrl+B** to background a running task

259* **Mode**: Can read and write files, execute commands, make changes

260* **Purpose**: Complex research tasks, multi-step operations, code modifications

261 443 

262**When Claude uses it:**444To disable all background task functionality, set the `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` environment variable to `1`. See [Environment variables](/en/settings#environment-variables).

263 445 

264Claude delegates to the general-purpose subagent when:446### Common patterns

265 447 

266* The task requires both exploration and modification448#### Isolate high-volume operations

267* Complex reasoning is needed to interpret search results

268* Multiple strategies may be needed if initial searches fail

269* The task has multiple steps that depend on each other

270 449 

271**Example scenario:**450One 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.

272 451 

273```452```

274User: Find all the places where we handle authentication and update them to use the new token format453Use a subagent to run the test suite and report only the failing tests with their error messages

275 

276Claude: [Invokes general-purpose subagent]

277[Agent searches for auth-related code across codebase]

278[Agent reads and analyzes multiple files]

279[Agent makes necessary edits]

280[Returns detailed writeup of changes made]

281```454```

282 455 

283### Plan subagent456#### Run parallel research

284 457 

285The Plan subagent is a specialized built-in agent designed for use during plan mode. When Claude is operating in plan mode (non-execution mode), it uses the Plan subagent to conduct research and gather information about your codebase before presenting a plan.458For independent investigations, spawn multiple subagents to work simultaneously:

286 459 

287**Key characteristics:**460```

461Research the authentication, database, and API modules in parallel using separate subagents

462```

288 463 

289* **Model**: Uses Sonnet for more capable analysis464Each subagent explores its area independently, then Claude synthesizes the findings. This works best when the research paths don't depend on each other.

290* **Tools**: Has access to Read, Glob, Grep, and Bash tools for codebase exploration

291* **Purpose**: Searches files, analyzes code structure, and gathers context

292* **Automatic invocation**: Claude automatically uses this agent when in plan mode and needs to research the codebase

293 465 

294**How it works:**466<Warning>

295When you're in plan mode and Claude needs to understand your codebase to create a plan, it delegates research tasks to the Plan subagent. This prevents infinite nesting of agents (subagents cannot spawn other subagents) while still allowing Claude to gather the necessary context.467 When subagents complete, their results return to your main conversation. Running many subagents that each return detailed results can consume significant context.

468</Warning>

296 469 

297**Example scenario:**470#### Chain subagents

298 471 

299```472For 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.

300User: [In plan mode] Help me refactor the authentication module

301 473 

302Claude: Let me research your authentication implementation first...474```

303[Internally invokes Plan subagent to explore auth-related files]475Use the code-reviewer subagent to find performance issues, then use the optimizer subagent to fix them

304[Plan subagent searches codebase and returns findings]

305Claude: Based on my research, here's my proposed plan...

306```476```

307 477 

308<Tip>478### Choose between subagents and main conversation

309 The Plan subagent is only used in plan mode. In normal execution mode, Claude uses the general-purpose agent or other custom subagents you've created.

310</Tip>

311 479 

312### Explore subagent480Use the **main conversation** when:

313 481 

314The Explore subagent is a fast, lightweight agent optimized for searching and analyzing codebases. It operates in strict read-only mode and is designed for rapid file discovery and code exploration.482* The task needs frequent back-and-forth or iterative refinement

483* Multiple phases share significant context (planning → implementation → testing)

484* You're making a quick, targeted change

485* Latency matters. Subagents start fresh and may need time to gather context

315 486 

316**Key characteristics:**487Use **subagents** when:

317 488 

318* **Model**: Uses Haiku for fast, low-latency searches489* The task produces verbose output you don't need in your main context

319* **Mode**: Strictly read-only - cannot create, modify, or delete files490* You want to enforce specific tool restrictions or permissions

320* **Tools available**:491* The work is self-contained and can return a summary

321 * Glob - File pattern matching

322 * Grep - Content searching with regex

323 * Read - Reading file contents

324 * Bash - Read-only commands only (ls, git status, git log, git diff, find, cat, head, tail)

325 492 

326**When Claude uses it:**493Consider [Skills](/en/skills) instead when you want reusable prompts or workflows that run in the main conversation context rather than isolated subagent context.

327 494 

328Claude will delegate to the Explore subagent when it needs to search or understand a codebase but doesn't need to make changes. This is more efficient than the main agent running multiple search commands directly, as content found during the exploration process doesn't bloat the main conversation.495<Note>

496 Subagents cannot spawn other subagents. If your workflow requires nested delegation, use [Skills](/en/skills) or [chain subagents](#chain-subagents) from the main conversation.

497</Note>

329 498 

330**Thoroughness levels:**499### Manage subagent context

331 500 

332When invoking the Explore subagent, Claude specifies a thoroughness level:501#### Resume subagents

333 502 

334* **Quick** - Basic searches, fastest results. Good for simple lookups.503Each 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.

335* **Medium** - Moderate exploration. Balances speed and thoroughness.

336* **Very thorough** - Comprehensive analysis across multiple locations and naming conventions. Used when the target might be in unexpected places.

337 504 

338**Example scenarios:**505Resumed 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.

339 506 

340```507When a subagent completes, Claude receives its agent ID. To resume a subagent, ask Claude to continue the previous work:

341User: Where are errors from the client handled?

342 508 

343Claude: [Invokes Explore subagent with "medium" thoroughness]

344[Explore uses Grep to search for error handling patterns]

345[Explore uses Read to examine promising files]

346[Returns findings with absolute file paths]

347Claude: Client errors are handled in src/services/process.ts:712...

348```509```

510Use the code-reviewer subagent to review the authentication module

511[Agent completes]

349 512 

513Continue that code review and now analyze the authorization logic

514[Claude resumes the subagent with full context from previous conversation]

350```515```

351User: What's the codebase structure?

352 516 

353Claude: [Invokes Explore subagent with "quick" thoroughness]517You 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`.

354[Explore uses Glob and ls to map directory structure]518 

355[Returns overview of key directories and their purposes]519Subagent transcripts persist independently of the main conversation:

520 

521* **Main conversation compaction**: When the main conversation compacts, subagent transcripts are unaffected. They're stored in separate files.

522* **Session persistence**: Subagent transcripts persist within their session. You can [resume a subagent](#resume-subagents) after restarting Claude Code by resuming the same session.

523* **Automatic cleanup**: Transcripts are cleaned up based on the `cleanupPeriodDays` setting (default: 30 days).

524 

525#### Auto-compaction

526 

527Subagents 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.

528 

529Compaction events are logged in subagent transcript files:

530 

531```json theme={null}

532{

533 "type": "system",

534 "subtype": "compact_boundary",

535 "compactMetadata": {

536 "trigger": "auto",

537 "preTokens": 167189

538 }

539}

356```540```

357 541 

542The `preTokens` value shows how many tokens were used before compaction occurred.

543 

358## Example subagents544## Example subagents

359 545 

546These examples demonstrate effective patterns for building subagents. Use them as starting points, or generate a customized version with Claude.

547 

548<Tip>

549 **Best practices:**

550 

551 * **Design focused subagents:** each subagent should excel at one specific task

552 * **Write detailed descriptions:** Claude uses the description to decide when to delegate

553 * **Limit tool access:** grant only necessary permissions for security and focus

554 * **Check into version control:** share project subagents with your team

555</Tip>

556 

360### Code reviewer557### Code reviewer

361 558 

559A 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.

560 

362```markdown theme={null}561```markdown theme={null}

363---562---

364name: code-reviewer563name: code-reviewer


3763. Begin review immediately5743. Begin review immediately

377 575 

378Review checklist:576Review checklist:

379- Code is simple and readable577- Code is clear and readable

380- Functions and variables are well-named578- Functions and variables are well-named

381- No duplicated code579- No duplicated code

382- Proper error handling580- Proper error handling


395 593 

396### Debugger594### Debugger

397 595 

596A 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.

597 

398```markdown theme={null}598```markdown theme={null}

399---599---

400name: debugger600name: debugger


425- Testing approach625- Testing approach

426- Prevention recommendations626- Prevention recommendations

427 627 

428Focus on fixing the underlying issue, not just symptoms.628Focus on fixing the underlying issue, not the symptoms.

429```629```

430 630 

431### Data scientist631### Data scientist

432 632 

633A 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.

634 

433```markdown theme={null}635```markdown theme={null}

434---636---

435name: data-scientist637name: data-scientist


463Always ensure queries are efficient and cost-effective.665Always ensure queries are efficient and cost-effective.

464```666```

465 667 

466## Best practices668### Database query validator

467 669 

468* **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.670A 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.

469 671 

470* **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.672```markdown theme={null}

471 673---

472* **Write detailed prompts**: Include specific instructions, examples, and constraints in your system prompts. The more guidance you provide, the better the subagent will perform.674name: db-reader

473 675description: Execute read-only database queries. Use when analyzing data or generating reports.

474* **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.676tools: Bash

475 677hooks:

476* **Version control**: Check project subagents into version control so your team can benefit from and improve them collaboratively.678 PreToolUse:

477 679 - matcher: "Bash"

478## Advanced usage680 hooks:

681 - type: command

682 command: "./scripts/validate-readonly-query.sh"

683---

479 684 

480### Chaining subagents685You are a database analyst with read-only access. Execute SELECT queries to answer questions about the data.

481 686 

482For complex workflows, you can chain multiple subagents:687When asked to analyze data:

6881. Identify which tables contain the relevant data

6892. Write efficient SELECT queries with appropriate filters

6903. Present results clearly with context

483 691 

692You cannot modify data. If asked to INSERT, UPDATE, DELETE, or modify schema, explain that you only have read access.

484```693```

485> First use the code-analyzer subagent to find performance issues, then use the optimizer subagent to fix them

486```

487 

488### Dynamic subagent selection

489 694 

490Claude Code intelligently selects subagents based on context. Make your `description` fields specific and action-oriented for best results.695Claude 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.

491 696 

492### Resumable subagents697Create the validation script anywhere in your project. The path must match the `command` field in your hook configuration:

493 698 

494Subagents can be resumed to continue previous conversations, which is particularly useful for long-running research or analysis tasks that need to be continued across multiple invocations.699```bash theme={null}

495 700#!/bin/bash

496**How it works:**701# Blocks SQL write operations, allows SELECT queries

497 

498* Each subagent execution is assigned a unique `agentId`

499* The agent's conversation is stored in a separate transcript file: `agent-{agentId}.jsonl`

500* You can resume a previous agent by providing its `agentId` via the `resume` parameter

501* When resumed, the agent continues with full context from its previous conversation

502 

503**Example workflow:**

504 

505Initial invocation:

506 702 

507```703# Read JSON input from stdin

508> Use the code-analyzer agent to start reviewing the authentication module704INPUT=$(cat)

509 705 

510[Agent completes initial analysis and returns agentId: "abc123"]706# Extract the command field from tool_input using jq

511```707COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

512 708 

513Resume the agent:709if [ -z "$COMMAND" ]; then

710 exit 0

711fi

514 712 

515```713# Block write operations (case-insensitive)

516> Resume agent abc123 and now analyze the authorization logic as well714if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE|REPLACE|MERGE)\b' > /dev/null; then

715 echo "Blocked: Write operations not allowed. Use SELECT queries only." >&2

716 exit 2

717fi

517 718 

518[Agent continues with full context from previous conversation]719exit 0

519```720```

520 721 

521**Use cases:**722Make the script executable:

522 

523* **Long-running research**: Break down large codebase analysis into multiple sessions

524* **Iterative refinement**: Continue refining a subagent's work without losing context

525* **Multi-step workflows**: Have a subagent work on related tasks sequentially while maintaining context

526 

527**Technical details:**

528 723 

529* Agent transcripts are stored in your project directory724```bash theme={null}

530* Recording is disabled during resume to avoid duplicating messages725chmod +x ./scripts/validate-readonly-query.sh

531* Both synchronous and asynchronous agents can be resumed

532* The `resume` parameter accepts the agent ID from a previous execution

533 

534**Programmatic usage:**

535 

536If you're using the Agent SDK or interacting with the AgentTool directly, you can pass the `resume` parameter:

537 

538```typescript theme={null}

539{

540 "description": "Continue analysis",

541 "prompt": "Now examine the error handling patterns",

542 "subagent_type": "code-analyzer",

543 "resume": "abc123" // Agent ID from previous execution

544}

545```726```

546 727 

547<Tip>728The 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.

548 Keep track of agent IDs for tasks you may want to resume later. Claude Code displays the agent ID when a subagent completes its work.

549</Tip>

550 

551## Performance considerations

552 729 

553* **Context efficiency**: Agents help preserve main context, enabling longer overall sessions730## Next steps

554* **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.

555 731 

556## Related documentation732Now that you understand subagents, explore these related features:

557 733 

558* [Plugins](/en/plugins) - Extend Claude Code with custom agents through plugins734* [Distribute subagents with plugins](/en/plugins) to share subagents across teams or projects

559* [Slash commands](/en/slash-commands) - Learn about other built-in commands735* [Run Claude Code programmatically](/en/headless) with the Agent SDK for CI/CD and automation

560* [Settings](/en/settings) - Configure Claude Code behavior736* [Use MCP servers](/en/mcp) to give subagents access to external tools and data

561* [Hooks](/en/hooks) - Automate workflows with event handlers

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.


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 


65The supported subset includes:74The supported subset includes:

66 75 

67* Mode switching: `Esc` (to NORMAL), `i`/`I`, `a`/`A`, `o`/`O` (to INSERT)76* 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`77* 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)78* Editing: `x`, `dw`/`de`/`db`/`dd`/`D`, `cw`/`ce`/`cb`/`cc`/`C`, `.` (repeat)

79* Yank/paste: `yy`/`Y`, `yw`/`ye`/`yb`, `p`/`P`

80* Text objects: `iw`/`aw`, `iW`/`aW`, `i"`/`a"`, `i'`/`a'`, `i(`/`a(`, `i[`/`a[`, `i{`/`a{`

81* Indentation: `>>`/`<<`

82* Line operations: `J` (join lines)

83 

84See [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.

18 

19Learn 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).

6 20 

7## Provider comparison21If 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>

16 <th>Microsoft Foundry</th>31 <th>Microsoft Foundry</th>


18 </thead>33 </thead>

19 34 

20 <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 

21 <tr>54 <tr>

22 <td>Regions</td>55 <td>Regions</td>

23 <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>

24 <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>

25 <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>

26 <td>Multiple Azure [regions](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/)</td>60 <td>Multiple Azure [regions](https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/)</td>


32 <td>Enabled by default</td>66 <td>Enabled by default</td>

33 <td>Enabled by default</td>67 <td>Enabled by default</td>

34 <td>Enabled by default</td>68 <td>Enabled by default</td>

69 <td>Enabled by default</td>

35 </tr>70 </tr>

36 71 

37 <tr>72 <tr>

38 <td>Authentication</td>73 <td>Authentication</td>

74 <td>Claude.ai SSO or email</td>

39 <td>API key</td>75 <td>API key</td>

40 <td>API key or AWS credentials</td>76 <td>API key or AWS credentials</td>

41 <td>GCP credentials</td>77 <td>GCP credentials</td>


44 80 

45 <tr>81 <tr>

46 <td>Cost tracking</td>82 <td>Cost tracking</td>

47 <td>Dashboard</td>83 <td>Usage dashboard</td>

84 <td>Usage dashboard</td>

48 <td>AWS Cost Explorer</td>85 <td>AWS Cost Explorer</td>

49 <td>GCP Billing</td>86 <td>GCP Billing</td>

50 <td>Azure Cost Management</td>87 <td>Azure Cost Management</td>

51 </tr>88 </tr>

52 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>

97 </tr>

98 

53 <tr>99 <tr>

54 <td>Enterprise features</td>100 <td>Enterprise features</td>

55 <td>Teams, usage monitoring</td>101 <td>Team management, SSO, usage monitoring</td>

102 <td>None</td>

56 <td>IAM policies, CloudTrail</td>103 <td>IAM policies, CloudTrail</td>

57 <td>IAM roles, Cloud Audit Logs</td>104 <td>IAM roles, Cloud Audit Logs</td>

58 <td>RBAC policies, Azure Monitor</td>105 <td>RBAC policies, Azure Monitor</td>


60 </tbody>107 </tbody>

61</table>108</table>

62 109 

63## Cloud providers110Select a deployment option to view setup instructions:

64 

65<CardGroup cols={3}>

66 <Card title="Amazon Bedrock" icon="aws" href="/en/amazon-bedrock">

67 Use Claude models through AWS infrastructure with API key or IAM-based authentication and AWS-native monitoring

68 </Card>

69 

70 <Card title="Google Vertex AI" icon="google" href="/en/google-vertex-ai">

71 Access Claude models via Google Cloud Platform with enterprise-grade security and compliance

72 </Card>

73 

74 <Card title="Microsoft Foundry" icon="microsoft" href="/en/microsoft-foundry">

75 Access Claude through Azure with API key or Microsoft Entra ID authentication and Azure billing

76 </Card>

77</CardGroup>

78 

79## Corporate infrastructure

80 111 

81<CardGroup cols={2}>112* [Claude for Teams or Enterprise](/en/authentication#claude-for-teams-or-enterprise)

82 <Card title="Enterprise Network" icon="shield" href="/en/network-config">113* [Anthropic Console](/en/authentication#claude-console-authentication)

83 Configure Claude Code to work with your organization's proxy servers and SSL/TLS requirements114* [Amazon Bedrock](/en/amazon-bedrock)

84 </Card>115* [Google Vertex AI](/en/google-vertex-ai)

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

85 117 

86 <Card title="LLM Gateway" icon="server" href="/en/llm-gateway">118## Configure proxies and gateways

87 Deploy centralized model access with usage tracking, budgeting, and audit logging

88 </Card>

89</CardGroup>

90 119 

91## Configuration overview120Most 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:

92 121 

93Claude Code supports flexible configuration options that allow you to combine different providers and infrastructure: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).

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).

94 124 

95<Note>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.

96 Understand the difference between:

97 126 

98 * **Corporate proxy**: An HTTP/HTTPS proxy for routing traffic (set via `HTTPS_PROXY` or `HTTP_PROXY`)127### Amazon Bedrock

99 * **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`)

100 128 

101 Both configurations can be used in tandem.129<Tabs>

102</Note>130 <Tab title="Corporate proxy">

131 Route Bedrock traffic through your corporate proxy by setting the following [environment variables](/en/settings#environment-variables):

103 132 

104### Using Bedrock with corporate proxy133 ```bash theme={null}

134 # Enable Bedrock

135 export CLAUDE_CODE_USE_BEDROCK=1

136 export AWS_REGION=us-east-1

105 137 

106Route Bedrock traffic through a corporate HTTP/HTTPS proxy:138 # Configure corporate proxy

139 export HTTPS_PROXY='https://proxy.example.com:8080'

140 ```

141 </Tab>

107 142 

108```bash theme={null}143 <Tab title="LLM Gateway">

109# Enable Bedrock144 Route Bedrock traffic through your LLM gateway by setting the following [environment variables](/en/settings#environment-variables):

110export CLAUDE_CODE_USE_BEDROCK=1

111export AWS_REGION=us-east-1

112 145 

113# Configure corporate proxy146 ```bash theme={null}

114export HTTPS_PROXY='https://proxy.example.com:8080'147 # Enable Bedrock

115```148 export CLAUDE_CODE_USE_BEDROCK=1

116 149 

117### Using Bedrock with LLM Gateway150 # 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>

118 156 

119Use a gateway service that provides Bedrock-compatible endpoints:157### Microsoft Foundry

120 158 

121```bash theme={null}159<Tabs>

122# Enable Bedrock160 <Tab title="Corporate proxy">

123export CLAUDE_CODE_USE_BEDROCK=1161 Route Foundry traffic through your corporate proxy by setting the following [environment variables](/en/settings#environment-variables):

124 162 

125# Configure LLM gateway163 ```bash theme={null}

126export ANTHROPIC_BEDROCK_BASE_URL='https://your-llm-gateway.com/bedrock'164 # Enable Microsoft Foundry

127export CLAUDE_CODE_SKIP_BEDROCK_AUTH=1 # If gateway handles AWS auth165 export CLAUDE_CODE_USE_FOUNDRY=1

128```166 export ANTHROPIC_FOUNDRY_RESOURCE=your-resource

167 export ANTHROPIC_FOUNDRY_API_KEY=your-api-key # Or omit for Entra ID auth

129 168 

130### Using Foundry with corporate proxy169 # Configure corporate proxy

170 export HTTPS_PROXY='https://proxy.example.com:8080'

171 ```

172 </Tab>

131 173 

132Route Azure traffic through a corporate HTTP/HTTPS proxy:174 <Tab title="LLM Gateway">

175 Route Foundry traffic through your LLM gateway by setting the following [environment variables](/en/settings#environment-variables):

133 176 

134```bash theme={null}177 ```bash theme={null}

135# Enable Microsoft Foundry178 # Enable Microsoft Foundry

136export CLAUDE_CODE_USE_FOUNDRY=1179 export CLAUDE_CODE_USE_FOUNDRY=1

137export ANTHROPIC_FOUNDRY_RESOURCE=your-resource

138export ANTHROPIC_FOUNDRY_API_KEY=your-api-key # Or omit for Entra ID auth

139 180 

140# Configure corporate proxy181 # Configure LLM gateway

141export HTTPS_PROXY='https://proxy.example.com:8080'182 export ANTHROPIC_FOUNDRY_BASE_URL='https://your-llm-gateway.com'

142```183 export CLAUDE_CODE_SKIP_FOUNDRY_AUTH=1 # If gateway handles Azure auth

184 ```

185 </Tab>

186</Tabs>

143 187 

144### Using Foundry with LLM Gateway188### Google Vertex AI

145 189 

146Use a gateway service that provides Azure-compatible endpoints:190<Tabs>

191 <Tab title="Corporate proxy">

192 Route Vertex AI traffic through your corporate proxy by setting the following [environment variables](/en/settings#environment-variables):

147 193 

148```bash theme={null}194 ```bash theme={null}

149# Enable Microsoft Foundry195 # Enable Vertex

150export CLAUDE_CODE_USE_FOUNDRY=1196 export CLAUDE_CODE_USE_VERTEX=1

197 export CLOUD_ML_REGION=us-east5

198 export ANTHROPIC_VERTEX_PROJECT_ID=your-project-id

151 199 

152# Configure LLM gateway200 # Configure corporate proxy

153export ANTHROPIC_FOUNDRY_BASE_URL='https://your-llm-gateway.com'201 export HTTPS_PROXY='https://proxy.example.com:8080'

154export CLAUDE_CODE_SKIP_FOUNDRY_AUTH=1 # If gateway handles Azure auth202 ```

155```203 </Tab>

156 204 

157### Using Vertex AI with corporate proxy205 <Tab title="LLM Gateway">

206 Route Vertex AI traffic through your LLM gateway by setting the following [environment variables](/en/settings#environment-variables):

158 207 

159Route Vertex AI traffic through a corporate HTTP/HTTPS proxy:208 ```bash theme={null}

209 # Enable Vertex

210 export CLAUDE_CODE_USE_VERTEX=1

160 211 

161```bash theme={null}212 # Configure LLM gateway

162# Enable Vertex213 export ANTHROPIC_VERTEX_BASE_URL='https://your-llm-gateway.com/vertex'

163export CLAUDE_CODE_USE_VERTEX=1214 export CLAUDE_CODE_SKIP_VERTEX_AUTH=1 # If gateway handles GCP auth

164export CLOUD_ML_REGION=us-east5215 ```

165export ANTHROPIC_VERTEX_PROJECT_ID=your-project-id216 </Tab>

217</Tabs>

166 218 

167# Configure corporate proxy219<Tip>

168export HTTPS_PROXY='https://proxy.example.com:8080'220 Use `/status` in Claude Code to verify your proxy and gateway configuration is applied correctly.

169```221</Tip>

170 

171### Using Vertex AI with LLM Gateway

172 

173Combine Google Vertex AI models with an LLM gateway for centralized management:

174 

175```bash theme={null}

176# Enable Vertex

177export CLAUDE_CODE_USE_VERTEX=1

178 

179# Configure LLM gateway

180export ANTHROPIC_VERTEX_BASE_URL='https://your-llm-gateway.com/vertex'

181export CLAUDE_CODE_SKIP_VERTEX_AUTH=1 # If gateway handles GCP auth

182```

183 

184### Authentication configuration

185 

186Claude 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.

187 

188## Choosing the right deployment configuration

189 

190Consider these factors when selecting your deployment approach:

191 

192### Direct provider access

193 

194Best for organizations that:

195 

196* Want the simplest setup

197* Have existing AWS or GCP infrastructure

198* Need provider-native monitoring and compliance

199 

200### Corporate proxy

201 

202Best for organizations that:

203 

204* Have existing corporate proxy requirements

205* Need traffic monitoring and compliance

206* Must route all traffic through specific network paths

207 

208### LLM Gateway

209 

210Best for organizations that:

211 

212* Need usage tracking across teams

213* Want to dynamically switch between models

214* Require custom rate limiting or budgets

215* Need centralized authentication management

216 

217## Debugging

218 

219When debugging your deployment:

220 

221* Use the `claude /status` [slash command](/en/slash-commands). This command provides observability into any applied authentication, proxy, and URL settings.

222* Set environment variable `export ANTHROPIC_LOG=debug` to log requests.

223 222 

224## Best practices for organizations223## Best practices for organizations

225 224 

226### 1. Invest in documentation and memory225### Invest in documentation and memory

227 226 

228We 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:

229 228 

230* **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

231* **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

232 231 

233 [Learn more](/en/memory).232Learn more in [Memory and CLAUDE.md files](/en/memory).

234 233 

235### 2. Simplify deployment234### Simplify deployment

236 235 

237If 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.

238 237 

239### 3. Start with guided usage238### Start with guided usage

240 239 

241Encourage 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.

242 241 

243### 4. Configure security policies242### Configure security policies

244 243 

245Security 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).244Security 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).

246 245 

247### 5. Leverage MCP for integrations246### Leverage MCP for integrations

248 247 

249MCP 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).248MCP 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).

250 249 

251At Anthropic, we trust Claude Code to power development across every Anthropic codebase. We hope you enjoy using Claude Code as much as we do!250At Anthropic, we trust Claude Code to power development across every Anthropic codebase. We hope you enjoy using Claude Code as much as we do.

252 251 

253## Next steps252## Next steps

254 253 

255* [Set up Amazon Bedrock](/en/amazon-bedrock) for AWS-native deployment254Once you've chosen a deployment option and configured access for your team:

256* [Configure Google Vertex AI](/en/google-vertex-ai) for GCP deployment255 

257* [Set up Microsoft Foundry](/en/microsoft-foundry) for Azure deployment2561. **Roll out to your team**: Share installation instructions and have team members [install Claude Code](/en/setup) and authenticate with their credentials.

258* [Configure Enterprise Network](/en/network-config) for network requirements2572. **Set up shared configuration**: Create a [CLAUDE.md file](/en/memory) in your repositories to help Claude Code understand your codebase and coding standards.

259* [Deploy LLM Gateway](/en/llm-gateway) for enterprise management2583. **Configure permissions**: Review [security settings](/en/security) to define what Claude Code can and cannot do in your environment.

260* [Settings](/en/settings) for configuration options and environment variables

troubleshooting.md +121 −33

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.


50```54```

51 55 

52<Warning>56<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.57 Avoid disabling Windows PATH importing (`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>58</Warning>

55 59 

60### WSL2 sandbox setup

61 

62[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:

63 

64<Tabs>

65 <Tab title="Ubuntu/Debian">

66 ```bash theme={null}

67 sudo apt-get install bubblewrap socat

68 ```

69 </Tab>

70 

71 <Tab title="Fedora">

72 ```bash theme={null}

73 sudo dnf install bubblewrap socat

74 ```

75 </Tab>

76</Tabs>

77 

78WSL1 does not support sandboxing. If you see "Sandboxing requires WSL2", you need to upgrade to WSL2 or run Claude Code without sandboxing.

79 

56### Linux and Mac installation issues: permission or command not found errors80### Linux and Mac installation issues: permission or command not found errors

57 81 

58When installing Claude Code with npm, `PATH` problems may prevent access to `claude`.82When installing Claude Code with npm, `PATH` problems may prevent access to `claude`.

59You may also encounter permission errors if your npm global prefix is not user writable (eg. `/usr`, or `/usr/local`).83You may also encounter permission errors if your npm global prefix is not user writable (for example, `/usr`, or `/usr/local`).

60 84 

61#### Recommended solution: Native Claude Code installation85#### Recommended solution: Native Claude Code installation

62 86 

63Claude Code has a native installation that doesn't depend on npm or Node.js.87Claude Code has a native installation that doesn't depend on npm or Node.js.

64 88 

65<Note>

66 The native Claude Code installer is currently in beta.

67</Note>

68 

69Use the following command to run the native installer.89Use the following command to run the native installer.

70 90 

71**macOS, Linux, WSL:**91**macOS, Linux, WSL:**


95 115 

96```116```

97 117 

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`.118This 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` (or `%USERPROFILE%\.local\bin\claude.exe` on Windows).

99 119 

100<Tip>120<Tip>

101 Make sure that you have the installation directory in your system PATH.121 Make sure that you have the installation directory in your system PATH.

102</Tip>122</Tip>

103 123 

104#### Alternative solution: Migrate to local installation124### Windows: "Claude Code on Windows requires git-bash"

105 125 

106Alternatively, if Claude Code will run, you can migrate to a local installation:126Claude Code on native Windows requires [Git for Windows](https://git-scm.com/downloads/win) which includes Git Bash. If Git is installed but not detected:

107 127 

108```bash theme={null}1281. Set the path explicitly in PowerShell before running Claude:

109claude migrate-installer129 ```powershell theme={null}

110```130 $env:CLAUDE_CODE_GIT_BASH_PATH="C:\Program Files\Git\bin\bash.exe"

131 ```

111 132 

112This moves Claude Code to `~/.claude/local/` and sets up an alias in your shell configuration. No `sudo` is required for future updates.1332. Or add it to your system environment variables permanently through System Properties Environment Variables.

113 134 

114After migration, restart your shell, and then verify your installation:135If Git is installed in a non-standard location, adjust the path accordingly.

115 136 

116On macOS/Linux/WSL:137### Windows: "installMethod is native, but claude command not found"

117 138 

118```bash theme={null}139If you see this error after installation, the `claude` command isn't in your PATH. Add it manually:

119which claude # Should show an alias to ~/.claude/local/claude

120```

121 140 

122On Windows:141<Steps>

142 <Step title="Open Environment Variables">

143 Press `Win + R`, type `sysdm.cpl`, and press Enter. Click **Advanced** → **Environment Variables**.

144 </Step>

123 145 

124```powershell theme={null}146 <Step title="Edit User PATH">

125where claude # Should show path to claude executable147 Under "User variables", select **Path** and click **Edit**. Click **New** and add:

126```148 

149 ```

150 %USERPROFILE%\.local\bin

151 ```

152 </Step>

153 

154 <Step title="Restart your terminal">

155 Close and reopen PowerShell or CMD for changes to take effect.

156 </Step>

157</Steps>

127 158 

128Verify installation:159Verify installation:

129 160 


136### Repeated permission prompts167### Repeated permission prompts

137 168 

138If you find yourself repeatedly approving the same commands, you can allow specific tools169If you find yourself repeatedly approving the same commands, you can allow specific tools

139to run without approval using the `/permissions` command. See [Permissions docs](/en/iam#configuring-permissions).170to run without approval using the `/permissions` command. See [Permissions docs](/en/permissions#manage-permissions).

140 171 

141### Authentication issues172### Authentication issues

142 173 


1462. Close Claude Code1772. Close Claude Code

1473. Restart with `claude` and complete the authentication process again1783. Restart with `claude` and complete the authentication process again

148 179 

180If 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.

181 

149If problems persist, try:182If problems persist, try:

150 183 

151```bash theme={null}184```bash theme={null}


155 188 

156This removes your stored authentication information and forces a clean login.189This removes your stored authentication information and forces a clean login.

157 190 

191## Configuration file locations

192 

193Claude Code stores configuration in several locations:

194 

195| File | Purpose |

196| :---------------------------- | :------------------------------------------------------- |

197| `~/.claude/settings.json` | User settings (permissions, hooks, model overrides) |

198| `.claude/settings.json` | Project settings (checked into source control) |

199| `.claude/settings.local.json` | Local project settings (not committed) |

200| `~/.claude.json` | Global state (theme, OAuth, MCP servers) |

201| `.mcp.json` | Project MCP servers (checked into source control) |

202| `managed-settings.json` | [Managed settings](/en/settings#settings-files) |

203| `managed-mcp.json` | [Managed MCP servers](/en/mcp#managed-mcp-configuration) |

204 

205On Windows, `~` refers to your user home directory, such as `C:\Users\YourName`.

206 

207**Managed file locations:**

208 

209* macOS: `/Library/Application Support/ClaudeCode/`

210* Linux/WSL: `/etc/claude-code/`

211* Windows: `C:\Program Files\ClaudeCode\`

212 

213For details on configuring these files, see [Settings](/en/settings) and [MCP](/en/mcp).

214 

215### Resetting configuration

216 

217To reset Claude Code to default settings, you can remove the configuration files:

218 

219```bash theme={null}

220# Reset all user settings and state

221rm ~/.claude.json

222rm -rf ~/.claude/

223 

224# Reset project-specific settings

225rm -rf .claude/

226rm .mcp.json

227```

228 

229<Warning>

230 This will remove all your settings, MCP server configurations, and session history.

231</Warning>

232 

158## Performance and stability233## Performance and stability

159 234 

160### High CPU or memory usage235### High CPU or memory usage


174 249 

175### Search and discovery issues250### Search and discovery issues

176 251 

177If Search tool, `@file` mentions, custom agents, and custom slash commands aren't working, install system `ripgrep`:252If Search tool, `@file` mentions, custom agents, and custom skills aren't working, install system `ripgrep`:

178 253 

179```bash theme={null}254```bash theme={null}

180# macOS (Homebrew) 255# macOS (Homebrew)


252 These networking issues only affect WSL2. WSL1 uses the host's network directly and doesn't require these configurations.327 These networking issues only affect WSL2. WSL1 uses the host's network directly and doesn't require these configurations.

253</Note>328</Note>

254 329 

255For additional JetBrains configuration tips, see our [IDE integration guide](/en/vs-code#jetbrains-plugin-settings).330For additional JetBrains configuration tips, see our [JetBrains IDE guide](/en/jetbrains#plugin-settings).

256 331 

257### Reporting Windows IDE integration issues (both native and WSL)332### Reporting Windows IDE integration issues (both native and WSL)

258 333 

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)334If you're experiencing IDE integration problems on Windows, [create an issue](https://github.com/anthropics/claude-code/issues) with the following information:

335 

336* Environment type: native Windows (Git Bash) or WSL1/WSL2

337* WSL networking mode (if applicable): NAT or mirrored

338* IDE name and version

339* Claude Code extension/plugin version

340* Shell type: Bash, Zsh, PowerShell, etc.

260 341 

261### ESC key not working in JetBrains (IntelliJ, PyCharm, etc.) terminals342### Escape key not working in JetBrains (IntelliJ, PyCharm, etc.) terminals

262 343 

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.344If 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 345 

265To fix this issue:346To fix this issue:

266 347 


270 * Click "Configure terminal keybindings" and delete the "Switch focus to Editor" shortcut351 * Click "Configure terminal keybindings" and delete the "Switch focus to Editor" shortcut

2713. Apply the changes3523. Apply the changes

272 353 

273This allows the ESC key to properly interrupt Claude Code operations.354This allows the `Esc` key to properly interrupt Claude Code operations.

274 355 

275## Markdown formatting issues356## Markdown formatting issues

276 357 


300 381 

301**Solutions:**382**Solutions:**

302 383 

3031. **Ask Claude to add language tags**: Simply request "Please add appropriate language tags to all code blocks in this markdown file."3841. **Ask Claude to add language tags**: Request "Add appropriate language tags to all code blocks in this markdown file."

304 385 

3052. **Use post-processing hooks**: Set up automatic formatting hooks to detect and add missing language tags. See the [markdown formatting hook example](/en/hooks-guide#markdown-formatting-hook) for implementation details.3862. **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 387 

3073. **Manual verification**: After generating markdown files, review them for proper code block formatting and request corrections if needed.3883. **Manual verification**: After generating markdown files, review them for proper code block formatting and request corrections if needed.

308 389 


323To minimize formatting issues:404To minimize formatting issues:

324 405 

325* **Be explicit in requests**: Ask for "properly formatted markdown with language-tagged code blocks"406* **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/memory)407* **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 issues408* **Set up validation hooks**: Use post-processing hooks to automatically verify and fix common formatting issues

328 409 

329## Getting more help410## Getting more help


332 413 

3331. Use the `/bug` command within Claude Code to report problems directly to Anthropic4141. 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 issues4152. Check the [GitHub repository](https://github.com/anthropics/claude-code) for known issues

3353. Run `/doctor` to check the health of your Claude Code installation4163. Run `/doctor` to diagnose issues. It checks:

417 * Installation type, version, and search functionality

418 * Auto-update status and available versions

419 * Invalid settings files (malformed JSON, incorrect types)

420 * MCP server configuration errors

421 * Keybinding configuration problems

422 * Context usage warnings (large CLAUDE.md files, high MCP token usage, unreachable permission rules)

423 * Plugin and agent loading errors

3364. Ask Claude directly about its capabilities and features - Claude has built-in access to its documentation4244. Ask Claude directly about its capabilities and features - Claude has built-in access to its documentation

vs-code.md +366 −91

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/claude-code/-YhHHmtSxwr7W8gy/images/vs-code-extension-interface.jpg?fit=max&auto=format&n=-YhHHmtSxwr7W8gy&q=85&s=300652d5678c63905e6b0ea9e50835f8" 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/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" />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* **Extended thinking**: Toggle extended thinking on/off using the Extended Thinking button in the bottom-right corner of the prompt input

19* **File management**: @-mention files or attach files and images using the system file picker

20* **MCP server usage**: Use Model Context Protocol servers configured through the CLI

21* **Conversation history**: Easy access to past conversations

22* **Multiple sessions**: Run multiple Claude Code sessions simultaneously

23* **Keyboard shortcuts**: Support for most shortcuts from the CLI

24* **Slash commands**: Access most CLI slash commands directly in the extension

25 19 

26### 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>

27 23 

28* 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)

29 30 

30### 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**.

31 32 

32Download 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>

33 34 

34### How It Works35## Get started

35 36 

36Once 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:

37 38 

381. Click the Spark icon in your editor's sidebar to open the Claude Code panel39<Steps>

392. Prompt Claude Code in the same way you would in the terminal40 <Step title="Open the Claude Code panel">

403. 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" />

414. Review and accept edits directly in the interface42 

42 * **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.

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 

99When 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.

100 

101You 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.

102 

103### Resume past conversations

104 

105Click 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).

106 

107### Resume remote sessions from Claude.ai

108 

109If 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.

110 

111<Steps>

112 <Step title="Open Past Conversations">

113 Click the **Past Conversations** dropdown at the top of the Claude Code panel.

114 </Step>

115 

116 <Step title="Select the Remote tab">

117 The dialog shows two tabs: Local and Remote. Click **Remote** to see sessions from claude.ai.

118 </Step>

119 

120 <Step title="Select a session to resume">

121 Browse or search your remote sessions. Click any session to download it and continue the conversation locally.

122 </Step>

123</Steps>

124 

125<Note>

126 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.

127</Note>

128 

129## Customize your workflow

130 

131Once you're up and running, you can reposition the Claude panel, run multiple sessions, or switch to terminal mode.

132 

133### Choose where Claude lives

134 

135You can drag the Claude panel to reposition it anywhere in VS Code. Grab the panel's tab or title bar and drag it to:

136 

137* **Secondary sidebar**: The right side of the window. Keeps Claude visible while you code.

138* **Primary sidebar**: The left sidebar with icons for Explorer, Search, etc.

139* **Editor area**: Opens Claude as a tab alongside your files. Useful for side tasks.

140 

141<Tip>

142 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.

143</Tip>

144 

145### Run multiple conversations

146 

147Use **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.

148 

149When 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.

150 

151### Switch to terminal mode

152 

153By 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.

154 

155You can also open VS Code settings (`Cmd+,` on Mac or `Ctrl+,` on Windows/Linux), go to Extensions → Claude Code, and check **Use Terminal**.

156 

157## Manage plugins

158 

159The 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.

160 

161### Install plugins

162 

163The plugin dialog shows two tabs: **Plugins** and **Marketplaces**.

164 

165In the Plugins tab:

166 

167* **Installed plugins** appear at the top with toggle switches to enable or disable them

168* **Available plugins** from your configured marketplaces appear below

169* Search to filter plugins by name or description

170* Click **Install** on any available plugin

171 

172When you install a plugin, choose the installation scope:

173 

174* **Install for you**: Available in all your projects (user scope)

175* **Install for this project**: Shared with project collaborators (project scope)

176* **Install locally**: Only for you, only in this repository (local scope)

43 177 

44### Using Third-Party Providers178### Manage marketplaces

45 179 

46The VS Code extension supports using Claude Code with third-party providers like Amazon Bedrock, Microsoft Foundry, 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:180Switch to the **Marketplaces** tab to add or remove plugin sources:

47 181 

481. Open VS Code settings182* Enter a GitHub repo, URL, or local path to add a new marketplace

492. Search for "Claude Code: Environment Variables"183* Click the refresh icon to update a marketplace's plugin list

503. Add the required environment variables184* Click the trash icon to remove a marketplace

51 185 

52#### Environment Variables186After making changes, a banner prompts you to restart Claude Code to apply the updates.

53 187 

54| Variable | Description | Required | Example |188<Note>

55| :---------------------------- | :------------------------------------- | :----------------------------- | :----------------------------------------------- |189 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.

56| `CLAUDE_CODE_USE_BEDROCK` | Enable Amazon Bedrock integration | Required for Bedrock | `"1"` or `"true"` |190</Note>

57| `CLAUDE_CODE_USE_FOUNDRY` | Enable Microsoft Foundry integration | Required for Foundry | `"1"` or `"true"` |

58| `CLAUDE_CODE_USE_VERTEX` | Enable Google Vertex AI integration | Required for Vertex AI | `"1"` or `"true"` |

59| `AWS_REGION` | AWS region for Bedrock | | `"us-east-2"` |

60| `AWS_PROFILE` | AWS profile for Bedrock authentication | | `"your-profile"` |

61| `CLOUD_ML_REGION` | Region for Vertex AI | | `"global"` or `"us-east5"` |

62| `ANTHROPIC_VERTEX_PROJECT_ID` | GCP project ID for Vertex AI | | `"your-project-id"` |

63| `ANTHROPIC_FOUNDRY_RESOURCE` | Azure resource name for Foundry | Required for Microsoft Foundry | `"your-resource"` |

64| `ANTHROPIC_FOUNDRY_API_KEY` | API key for Microsoft Foundry | Optional for Microsoft Foundry | `"your-api-key"` |

65| `ANTHROPIC_MODEL` | Override primary model | Override model ID | `"us.anthropic.claude-sonnet-4-5-20250929-v1:0"` |

66| `ANTHROPIC_SMALL_FAST_MODEL` | Override small/fast model | Optional | `"us.anthropic.claude-3-5-haiku-20241022-v1:0"` |

67| `CLAUDE_CODE_SKIP_AUTH_LOGIN` | Disable all prompts to login | Optional | `"1"` or `"true"` |

68 191 

69For detailed setup instructions and additional configuration options, see:192For more about the plugin system, see [Plugins](/en/plugins) and [Plugin marketplaces](/en/plugin-marketplaces).

70 193 

71* [Claude Code on Amazon Bedrock](/en/amazon-bedrock)194## VS Code commands and shortcuts

72* [Claude Code on Microsoft Foundry](/en/microsoft-foundry)

73* [Claude Code on Google Vertex AI](/en/google-vertex-ai)

74 195 

75### Not Yet Implemented196Open 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.

76 197 

77The following features are not yet available in the VS Code extension:198Some 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.

78 199 

79* **MCP server and Plugin configuration UI**: Type `/mcp` to open the terminal-based MCP server configuration, or `/plugin` for Plugin configuration. Once configured, MCP servers and Plugins will work in the extension. You can also [configure MCP servers through the CLI](/en/mcp) first, then the extension will use them.200<Note>

80* **Subagents configuration**: Configure [subagents through the CLI](/en/sub-agents) to use them in VS Code201 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.

81* **Checkpoints**: Save and restore conversation state at specific points202</Note>

82* **Conversation rewinding**: The `/rewind` command is coming soon

83* **Advanced shortcuts**:

84 * `#` shortcut to add to memory (not supported)

85 * `!` shortcut to run bash commands directly (not supported)

86* **Tab completion**: File path completion with tab key

87* **Model selection UI for older models**: To use older model versions like `claude-sonnet-4-20250514`, open VS Code settings for Claude Code (the `/General Config` command) and insert the model string directly into the 'Selected Model' field

88 203 

89We are working on adding these features in future updates.204| Command | Shortcut | Description |

205| -------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------ |

206| Focus Input | `Cmd+Esc` (Mac) / `Ctrl+Esc` (Windows/Linux) | Toggle focus between editor and Claude |

207| Open in Side Bar | - | Open Claude in the left sidebar |

208| Open in Terminal | - | Open Claude in terminal mode |

209| Open in New Tab | `Cmd+Shift+Esc` (Mac) / `Ctrl+Shift+Esc` (Windows/Linux) | Open a new conversation as an editor tab |

210| Open in New Window | - | Open a new conversation in a separate window |

211| New Conversation | `Cmd+N` (Mac) / `Ctrl+N` (Windows/Linux) | Start a new conversation (requires Claude to be focused) |

212| Insert @-Mention Reference | `Option+K` (Mac) / `Alt+K` (Windows/Linux) | Insert a reference to the current file and selection (requires editor to be focused) |

213| Show Logs | - | View extension debug logs |

214| Logout | - | Sign out of your Anthropic account |

90 215 

91## Security Considerations216## Configure settings

92 217 

93When 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.218The extension has two types of settings:

94 219 

95When running in VS Code, consider:220* **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.

221* **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.

96 222 

97* Enabling [VS Code Restricted Mode](https://code.visualstudio.com/docs/editor/workspace-trust#_restricted-mode) for untrusted workspaces223<Tip>

98* Using manual approval mode for edits224 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.

99* Taking extra care to ensure Claude is only used with trusted prompts225</Tip>

100 226 

101## Legacy CLI Integration227### Extension settings

102 228 

103The 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).229| Setting | Default | Description |

230| --------------------------------- | --------- | ----------------------------------------------------------------------------------------------------- |

231| `selectedModel` | `default` | Model for new conversations. Change per-session with `/model`. |

232| `useTerminal` | `false` | Launch Claude in terminal mode instead of graphical panel |

233| `initialPermissionMode` | `default` | Controls approval prompts: `default` (ask each time), `plan`, `acceptEdits`, or `bypassPermissions` |

234| `preferredLocation` | `panel` | Where Claude opens: `sidebar` (right) or `panel` (new tab) |

235| `autosave` | `true` | Auto-save files before Claude reads or writes them |

236| `useCtrlEnterToSend` | `false` | Use Ctrl/Cmd+Enter instead of Enter to send prompts |

237| `enableNewConversationShortcut` | `true` | Enable Cmd/Ctrl+N to start a new conversation |

238| `hideOnboarding` | `false` | Hide the onboarding checklist (graduation cap icon) |

239| `respectGitIgnore` | `true` | Exclude .gitignore patterns from file searches |

240| `environmentVariables` | `[]` | Set environment variables for the Claude process. Use Claude Code settings instead for shared config. |

241| `disableLoginPrompt` | `false` | Skip authentication prompts (for third-party provider setups) |

242| `allowDangerouslySkipPermissions` | `false` | Bypass all permission prompts. **Use with extreme caution.** |

243| `claudeProcessWrapper` | - | Executable path used to launch the Claude process |

104 244 

105The 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.245## VS Code extension vs. Claude Code CLI

106 246 

107Both the extension and CLI integration work with Visual Studio Code, Cursor, Windsurf, and VSCodium.247Claude 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.

108 248 

109## Troubleshooting249| Feature | CLI | VS Code Extension |

250| ------------------- | --------------------------------------------- | ---------------------------------------- |

251| Commands and skills | [All](/en/interactive-mode#built-in-commands) | Subset (type `/` to see available) |

252| MCP server config | Yes | No (configure via CLI, use in extension) |

253| Checkpoints | Yes | Yes |

254| `!` bash shortcut | Yes | No |

255| Tab completion | Yes | No |

110 256 

111### Extension Not Installing257### Rewind with checkpoints

112 258 

113* Ensure you have a compatible version of VS Code (1.85.0 or later)259The 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:

260 

261* **Fork conversation from here**: start a new conversation branch from this message while keeping all code changes intact

262* **Rewind code to here**: revert file changes back to this point in the conversation while keeping the full conversation history

263* **Fork conversation and rewind code**: start a new conversation branch and revert file changes to this point

264 

265For full details on how checkpoints work and their limitations, see [Checkpointing](/en/checkpointing).

266 

267### Run CLI in VS Code

268 

269To 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.

270 

271If using an external terminal, run `/ide` inside Claude Code to connect it to VS Code.

272 

273### Switch between extension and CLI

274 

275The 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.

276 

277### Include terminal output in prompts

278 

279Reference 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.

280 

281### Monitor background processes

282 

283When 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.

284 

285### Connect to external tools with MCP

286 

287MCP (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.

288 

289To add an MCP server, open the integrated terminal (`` Ctrl+` `` or `` Cmd+` ``) and run:

290 

291```bash theme={null}

292claude mcp add --transport http github https://api.githubcopilot.com/mcp/

293```

294 

295Once 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.

296 

297## Work with git

298 

299Claude 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.

300 

301### Create commits and pull requests

302 

303Claude can stage changes, write commit messages, and create pull requests based on your work:

304 

305```

306> commit my changes with a descriptive message

307> create a pr for this feature

308> summarize the changes I've made to the auth module

309```

310 

311When creating pull requests, Claude generates descriptions based on the actual code changes and can add context about testing or implementation decisions.

312 

313### Use git worktrees for parallel tasks

314 

315Git worktrees allow multiple Claude Code sessions to work on separate branches simultaneously, each with isolated files:

316 

317```bash theme={null}

318# Create a worktree for a new feature

319git worktree add ../project-feature-a -b feature-a

320 

321# Run Claude Code in each worktree

322cd ../project-feature-a && claude

323```

324 

325Each worktree maintains independent file state while sharing git history. This prevents Claude instances from interfering with each other when working on different tasks.

326 

327For detailed git workflows including PR reviews and branch management, see [Common workflows](/en/common-workflows#create-pull-requests).

328 

329## Use third-party providers

330 

331By 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:

332 

333<Steps>

334 <Step title="Disable login prompt">

335 Open the [Disable Login Prompt setting](vscode://settings/claudeCode.disableLoginPrompt) and check the box.

336 

337 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**.

338 </Step>

339 

340 <Step title="Configure your provider">

341 Follow the setup guide for your provider:

342 

343 * [Claude Code on Amazon Bedrock](/en/amazon-bedrock)

344 * [Claude Code on Google Vertex AI](/en/google-vertex-ai)

345 * [Claude Code on Microsoft Foundry](/en/microsoft-foundry)

346 

347 These guides cover configuring your provider in `~/.claude/settings.json`, which ensures your settings are shared between the VS Code extension and the CLI.

348 </Step>

349</Steps>

350 

351## Security and privacy

352 

353Your 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).

354 

355With 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:

356 

357* Enable [VS Code Restricted Mode](https://code.visualstudio.com/docs/editor/workspace-trust#_restricted-mode) for untrusted workspaces

358* Use manual approval mode instead of auto-accept for edits

359* Review changes carefully before accepting them

360 

361## Fix common issues

362 

363### Extension won't install

364 

365* Ensure you have a compatible version of VS Code (1.98.0 or later)

114* Check that VS Code has permission to install extensions366* Check that VS Code has permission to install extensions

115* Try installing directly from the Marketplace website367* Try installing directly from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code)

368 

369### Spark icon not visible

370 

371The Spark icon appears in the **Editor Toolbar** (top-right of editor) when you have a file open. If you don't see it:

116 372 

117### Claude Code Never Responds3731. **Open a file**: The icon requires a file to be open. Having just a folder open isn't enough.

3742. **Check VS Code version**: Requires 1.98.0 or higher (Help → About)

3753. **Restart VS Code**: Run "Developer: Reload Window" from the Command Palette

3764. **Disable conflicting extensions**: Temporarily disable other AI extensions (Cline, Continue, etc.)

3775. **Check workspace trust**: The extension doesn't work in Restricted Mode

118 378 

119If Claude Code is not responding to your prompts:379Alternatively, 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".

380 

381### Claude Code never responds

382 

383If Claude Code isn't responding to your prompts:

120 384 

1211. **Check your internet connection**: Ensure you have a stable internet connection3851. **Check your internet connection**: Ensure you have a stable internet connection

1222. **Start a new conversation**: Try starting a fresh conversation to see if the issue persists3862. **Start a new conversation**: Try starting a fresh conversation to see if the issue persists

1233. **Try the CLI**: Run `claude` from the terminal to see if you get more detailed error messages3873. **Try the CLI**: Run `claude` from the terminal to see if you get more detailed error messages

1244. **File a bug report**: If the problem continues, [file an issue on GitHub](https://github.com/anthropics/claude-code/issues) with details about the error

125 388 

126### Legacy Integration Not Working389If problems persist, [file an issue on GitHub](https://github.com/anthropics/claude-code/issues) with details about the error.

390 

391## Uninstall the extension

392 

393To uninstall the Claude Code extension:

394 

3951. Open the Extensions view (`Cmd+Shift+X` on Mac or `Ctrl+Shift+X` on Windows/Linux)

3962. Search for "Claude Code"

3973. Click **Uninstall**

398 

399To also remove extension data and reset all settings:

400 

401```bash theme={null}

402rm -rf ~/.vscode/globalStorage/anthropic.claude-code

403```

404 

405For additional help, see the [troubleshooting guide](/en/troubleshooting).

406 

407## Next steps

127 408 

128* Ensure you're running Claude Code from VS Code's integrated terminal409Now that you have Claude Code set up in VS Code:

129* Ensure the CLI for your IDE variant is installed:

130 * VS Code: `code` command should be available

131 * Cursor: `cursor` command should be available

132 * Windsurf: `windsurf` command should be available

133 * VSCodium: `codium` command should be available

134* If the command isn't installed:

135 1. Open command palette with `Cmd+Shift+P` (Mac) or `Ctrl+Shift+P` (Windows/Linux)

136 2. Search for "Shell Command: Install 'code' command in PATH" (or equivalent for your IDE)

137 410 

138For additional help, see our [troubleshooting guide](/en/troubleshooting).411* [Explore common workflows](/en/common-workflows) to get the most out of Claude Code

412* [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.

413* [Configure Claude Code settings](/en/settings) to customize allowed commands, hooks, and more. These settings are shared between the extension and CLI.