strix-agent 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. strix/__init__.py +0 -0
  2. strix/agents/StrixAgent/__init__.py +4 -0
  3. strix/agents/StrixAgent/strix_agent.py +60 -0
  4. strix/agents/StrixAgent/system_prompt.jinja +504 -0
  5. strix/agents/__init__.py +10 -0
  6. strix/agents/base_agent.py +394 -0
  7. strix/agents/state.py +139 -0
  8. strix/cli/__init__.py +4 -0
  9. strix/cli/app.py +1124 -0
  10. strix/cli/assets/cli.tcss +680 -0
  11. strix/cli/main.py +542 -0
  12. strix/cli/tool_components/__init__.py +39 -0
  13. strix/cli/tool_components/agents_graph_renderer.py +129 -0
  14. strix/cli/tool_components/base_renderer.py +61 -0
  15. strix/cli/tool_components/browser_renderer.py +107 -0
  16. strix/cli/tool_components/file_edit_renderer.py +95 -0
  17. strix/cli/tool_components/finish_renderer.py +32 -0
  18. strix/cli/tool_components/notes_renderer.py +108 -0
  19. strix/cli/tool_components/proxy_renderer.py +255 -0
  20. strix/cli/tool_components/python_renderer.py +34 -0
  21. strix/cli/tool_components/registry.py +72 -0
  22. strix/cli/tool_components/reporting_renderer.py +53 -0
  23. strix/cli/tool_components/scan_info_renderer.py +58 -0
  24. strix/cli/tool_components/terminal_renderer.py +99 -0
  25. strix/cli/tool_components/thinking_renderer.py +29 -0
  26. strix/cli/tool_components/user_message_renderer.py +43 -0
  27. strix/cli/tool_components/web_search_renderer.py +28 -0
  28. strix/cli/tracer.py +308 -0
  29. strix/llm/__init__.py +14 -0
  30. strix/llm/config.py +19 -0
  31. strix/llm/llm.py +310 -0
  32. strix/llm/memory_compressor.py +206 -0
  33. strix/llm/request_queue.py +63 -0
  34. strix/llm/utils.py +84 -0
  35. strix/prompts/__init__.py +113 -0
  36. strix/prompts/coordination/root_agent.jinja +41 -0
  37. strix/prompts/vulnerabilities/authentication_jwt.jinja +129 -0
  38. strix/prompts/vulnerabilities/business_logic.jinja +143 -0
  39. strix/prompts/vulnerabilities/csrf.jinja +168 -0
  40. strix/prompts/vulnerabilities/idor.jinja +164 -0
  41. strix/prompts/vulnerabilities/race_conditions.jinja +194 -0
  42. strix/prompts/vulnerabilities/rce.jinja +222 -0
  43. strix/prompts/vulnerabilities/sql_injection.jinja +216 -0
  44. strix/prompts/vulnerabilities/ssrf.jinja +168 -0
  45. strix/prompts/vulnerabilities/xss.jinja +221 -0
  46. strix/prompts/vulnerabilities/xxe.jinja +276 -0
  47. strix/runtime/__init__.py +19 -0
  48. strix/runtime/docker_runtime.py +298 -0
  49. strix/runtime/runtime.py +25 -0
  50. strix/runtime/tool_server.py +97 -0
  51. strix/tools/__init__.py +64 -0
  52. strix/tools/agents_graph/__init__.py +16 -0
  53. strix/tools/agents_graph/agents_graph_actions.py +610 -0
  54. strix/tools/agents_graph/agents_graph_actions_schema.xml +223 -0
  55. strix/tools/argument_parser.py +120 -0
  56. strix/tools/browser/__init__.py +4 -0
  57. strix/tools/browser/browser_actions.py +236 -0
  58. strix/tools/browser/browser_actions_schema.xml +183 -0
  59. strix/tools/browser/browser_instance.py +533 -0
  60. strix/tools/browser/tab_manager.py +342 -0
  61. strix/tools/executor.py +302 -0
  62. strix/tools/file_edit/__init__.py +4 -0
  63. strix/tools/file_edit/file_edit_actions.py +141 -0
  64. strix/tools/file_edit/file_edit_actions_schema.xml +128 -0
  65. strix/tools/finish/__init__.py +4 -0
  66. strix/tools/finish/finish_actions.py +167 -0
  67. strix/tools/finish/finish_actions_schema.xml +45 -0
  68. strix/tools/notes/__init__.py +14 -0
  69. strix/tools/notes/notes_actions.py +191 -0
  70. strix/tools/notes/notes_actions_schema.xml +150 -0
  71. strix/tools/proxy/__init__.py +20 -0
  72. strix/tools/proxy/proxy_actions.py +101 -0
  73. strix/tools/proxy/proxy_actions_schema.xml +267 -0
  74. strix/tools/proxy/proxy_manager.py +785 -0
  75. strix/tools/python/__init__.py +4 -0
  76. strix/tools/python/python_actions.py +47 -0
  77. strix/tools/python/python_actions_schema.xml +131 -0
  78. strix/tools/python/python_instance.py +172 -0
  79. strix/tools/python/python_manager.py +131 -0
  80. strix/tools/registry.py +196 -0
  81. strix/tools/reporting/__init__.py +6 -0
  82. strix/tools/reporting/reporting_actions.py +63 -0
  83. strix/tools/reporting/reporting_actions_schema.xml +30 -0
  84. strix/tools/terminal/__init__.py +4 -0
  85. strix/tools/terminal/terminal_actions.py +53 -0
  86. strix/tools/terminal/terminal_actions_schema.xml +114 -0
  87. strix/tools/terminal/terminal_instance.py +231 -0
  88. strix/tools/terminal/terminal_manager.py +191 -0
  89. strix/tools/thinking/__init__.py +4 -0
  90. strix/tools/thinking/thinking_actions.py +18 -0
  91. strix/tools/thinking/thinking_actions_schema.xml +52 -0
  92. strix/tools/web_search/__init__.py +4 -0
  93. strix/tools/web_search/web_search_actions.py +80 -0
  94. strix/tools/web_search/web_search_actions_schema.xml +83 -0
  95. strix_agent-0.1.1.dist-info/LICENSE +201 -0
  96. strix_agent-0.1.1.dist-info/METADATA +200 -0
  97. strix_agent-0.1.1.dist-info/RECORD +99 -0
  98. strix_agent-0.1.1.dist-info/WHEEL +4 -0
  99. strix_agent-0.1.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,150 @@
1
+ <tools>
2
+ <tool name="create_note">
3
+ <description>Create a personal note for TODOs, side notes, plans, and organizational purposes during
4
+ the scan.</description>
5
+ <details>Use this tool for quick reminders, action items, planning thoughts, and organizational notes
6
+ rather than formal vulnerability reports or detailed findings. This is your personal notepad
7
+ for keeping track of tasks, ideas, and things to remember or follow up on.</details>
8
+ <parameters>
9
+ <parameter name="title" type="string" required="true">
10
+ <description>Title of the note</description>
11
+ </parameter>
12
+ <parameter name="content" type="string" required="true">
13
+ <description>Content of the note</description>
14
+ </parameter>
15
+ <parameter name="category" type="string" required="false">
16
+ <description>Category to organize the note (default: "general", "findings", "methodology", "todo", "questions", "plan")</description>
17
+ </parameter>
18
+ <parameter name="tags" type="string" required="false">
19
+ <description>Tags for categorization</description>
20
+ </parameter>
21
+ <parameter name="priority" type="string" required="false">
22
+ <description>Priority level of the note ("low", "normal", "high", "urgent")</description>
23
+ </parameter>
24
+ </parameters>
25
+ <returns type="Dict[str, Any]">
26
+ <description>Response containing: - note_id: ID of the created note - success: Whether the note was created successfully</description>
27
+ </returns>
28
+ <examples>
29
+ # Create a TODO reminder
30
+ <function=create_note>
31
+ <parameter=title>TODO: Check SSL Certificate Details</parameter>
32
+ <parameter=content>Remember to verify SSL certificate validity and check for weak ciphers
33
+ on the HTTPS service discovered on port 443. Also check for certificate
34
+ transparency logs.</parameter>
35
+ <parameter=category>todo</parameter>
36
+ <parameter=tags>["ssl", "certificate", "followup"]</parameter>
37
+ <parameter=priority>normal</parameter>
38
+ </function>
39
+
40
+ # Planning note
41
+ <function=create_note>
42
+ <parameter=title>Scan Strategy Planning</parameter>
43
+ <parameter=content>Plan for next phase: 1) Complete subdomain enumeration 2) Test discovered
44
+ web apps for OWASP Top 10 3) Check database services for default creds
45
+ 4) Review any custom applications for business logic flaws</parameter>
46
+ <parameter=category>plan</parameter>
47
+ <parameter=tags>["planning", "strategy", "next_steps"]</parameter>
48
+ </function>
49
+
50
+ # Side note for later investigation
51
+ <function=create_note>
52
+ <parameter=title>Interesting Directory Found</parameter>
53
+ <parameter=content>Found /backup/ directory that might contain sensitive files. Low priority
54
+ for now but worth checking if time permits. Directory listing seems
55
+ disabled.</parameter>
56
+ <parameter=category>findings</parameter>
57
+ <parameter=tags>["directory", "backup", "low_priority"]</parameter>
58
+ <parameter=priority>low</parameter>
59
+ </function>
60
+ </examples>
61
+ </tool>
62
+ <tool name="delete_note">
63
+ <description>Delete a note.</description>
64
+ <parameters>
65
+ <parameter name="note_id" type="string" required="true">
66
+ <description>ID of the note to delete</description>
67
+ </parameter>
68
+ </parameters>
69
+ <returns type="Dict[str, Any]">
70
+ <description>Response containing: - success: Whether the note was deleted successfully</description>
71
+ </returns>
72
+ <examples>
73
+ <function=delete_note>
74
+ <parameter=note_id>note_123</parameter>
75
+ </function>
76
+ </examples>
77
+ </tool>
78
+ <tool name="list_notes">
79
+ <description>List existing notes with optional filtering and search.</description>
80
+ <parameters>
81
+ <parameter name="category" type="string" required="false">
82
+ <description>Filter by category</description>
83
+ </parameter>
84
+ <parameter name="tags" type="string" required="false">
85
+ <description>Filter by tags (returns notes with any of these tags)</description>
86
+ </parameter>
87
+ <parameter name="priority" type="string" required="false">
88
+ <description>Filter by priority level</description>
89
+ </parameter>
90
+ <parameter name="search" type="string" required="false">
91
+ <description>Search query to find in note titles and content</description>
92
+ </parameter>
93
+ </parameters>
94
+ <returns type="Dict[str, Any]">
95
+ <description>Response containing: - notes: List of matching notes - total_count: Total number of notes found</description>
96
+ </returns>
97
+ <examples>
98
+ # List all findings
99
+ <function=list_notes>
100
+ <parameter=category>findings</parameter>
101
+ </function>
102
+
103
+ # List high priority items
104
+ <function=list_notes>
105
+ <parameter=priority>high</parameter>
106
+ </function>
107
+
108
+ # Search for SQL injection related notes
109
+ <function=list_notes>
110
+ <parameter=search>SQL injection</parameter>
111
+ </function>
112
+
113
+ # Search within a specific category
114
+ <function=list_notes>
115
+ <parameter=search>admin</parameter>
116
+ <parameter=category>findings</parameter>
117
+ </function>
118
+ </examples>
119
+ </tool>
120
+ <tool name="update_note">
121
+ <description>Update an existing note.</description>
122
+ <parameters>
123
+ <parameter name="note_id" type="string" required="true">
124
+ <description>ID of the note to update</description>
125
+ </parameter>
126
+ <parameter name="title" type="string" required="false">
127
+ <description>New title for the note</description>
128
+ </parameter>
129
+ <parameter name="content" type="string" required="false">
130
+ <description>New content for the note</description>
131
+ </parameter>
132
+ <parameter name="tags" type="string" required="false">
133
+ <description>New tags for the note</description>
134
+ </parameter>
135
+ <parameter name="priority" type="string" required="false">
136
+ <description>New priority level</description>
137
+ </parameter>
138
+ </parameters>
139
+ <returns type="Dict[str, Any]">
140
+ <description>Response containing: - success: Whether the note was updated successfully</description>
141
+ </returns>
142
+ <examples>
143
+ <function=update_note>
144
+ <parameter=note_id>note_123</parameter>
145
+ <parameter=content>Updated content with new findings...</parameter>
146
+ <parameter=priority>urgent</parameter>
147
+ </function>
148
+ </examples>
149
+ </tool>
150
+ </tools>
@@ -0,0 +1,20 @@
1
+ from .proxy_actions import (
2
+ list_requests,
3
+ list_sitemap,
4
+ repeat_request,
5
+ scope_rules,
6
+ send_request,
7
+ view_request,
8
+ view_sitemap_entry,
9
+ )
10
+
11
+
12
+ __all__ = [
13
+ "list_requests",
14
+ "list_sitemap",
15
+ "repeat_request",
16
+ "scope_rules",
17
+ "send_request",
18
+ "view_request",
19
+ "view_sitemap_entry",
20
+ ]
@@ -0,0 +1,101 @@
1
+ from typing import Any, Literal
2
+
3
+ from strix.tools.registry import register_tool
4
+
5
+ from .proxy_manager import get_proxy_manager
6
+
7
+
8
+ RequestPart = Literal["request", "response"]
9
+
10
+
11
+ @register_tool
12
+ def list_requests(
13
+ httpql_filter: str | None = None,
14
+ start_page: int = 1,
15
+ end_page: int = 1,
16
+ page_size: int = 50,
17
+ sort_by: Literal[
18
+ "timestamp",
19
+ "host",
20
+ "method",
21
+ "path",
22
+ "status_code",
23
+ "response_time",
24
+ "response_size",
25
+ "source",
26
+ ] = "timestamp",
27
+ sort_order: Literal["asc", "desc"] = "desc",
28
+ scope_id: str | None = None,
29
+ ) -> dict[str, Any]:
30
+ manager = get_proxy_manager()
31
+ return manager.list_requests(
32
+ httpql_filter, start_page, end_page, page_size, sort_by, sort_order, scope_id
33
+ )
34
+
35
+
36
+ @register_tool
37
+ def view_request(
38
+ request_id: str,
39
+ part: RequestPart = "request",
40
+ search_pattern: str | None = None,
41
+ page: int = 1,
42
+ page_size: int = 50,
43
+ ) -> dict[str, Any]:
44
+ manager = get_proxy_manager()
45
+ return manager.view_request(request_id, part, search_pattern, page, page_size)
46
+
47
+
48
+ @register_tool
49
+ def send_request(
50
+ method: str,
51
+ url: str,
52
+ headers: dict[str, str] | None = None,
53
+ body: str = "",
54
+ timeout: int = 30,
55
+ ) -> dict[str, Any]:
56
+ if headers is None:
57
+ headers = {}
58
+ manager = get_proxy_manager()
59
+ return manager.send_simple_request(method, url, headers, body, timeout)
60
+
61
+
62
+ @register_tool
63
+ def repeat_request(
64
+ request_id: str,
65
+ modifications: dict[str, Any] | None = None,
66
+ ) -> dict[str, Any]:
67
+ if modifications is None:
68
+ modifications = {}
69
+ manager = get_proxy_manager()
70
+ return manager.repeat_request(request_id, modifications)
71
+
72
+
73
+ @register_tool
74
+ def scope_rules(
75
+ action: Literal["get", "list", "create", "update", "delete"],
76
+ allowlist: list[str] | None = None,
77
+ denylist: list[str] | None = None,
78
+ scope_id: str | None = None,
79
+ scope_name: str | None = None,
80
+ ) -> dict[str, Any]:
81
+ manager = get_proxy_manager()
82
+ return manager.scope_rules(action, allowlist, denylist, scope_id, scope_name)
83
+
84
+
85
+ @register_tool
86
+ def list_sitemap(
87
+ scope_id: str | None = None,
88
+ parent_id: str | None = None,
89
+ depth: Literal["DIRECT", "ALL"] = "DIRECT",
90
+ page: int = 1,
91
+ ) -> dict[str, Any]:
92
+ manager = get_proxy_manager()
93
+ return manager.list_sitemap(scope_id, parent_id, depth, page)
94
+
95
+
96
+ @register_tool
97
+ def view_sitemap_entry(
98
+ entry_id: str,
99
+ ) -> dict[str, Any]:
100
+ manager = get_proxy_manager()
101
+ return manager.view_sitemap_entry(entry_id)
@@ -0,0 +1,267 @@
1
+ <?xml version="1.0" ?>
2
+ <tools>
3
+ <tool name="list_requests">
4
+ <description>List and filter proxy requests using HTTPQL with pagination.</description>
5
+ <parameters>
6
+ <parameter name="httpql_filter" type="string" required="false">
7
+ <description>HTTPQL filter using Caido's syntax:
8
+
9
+ Integer fields (port, code, roundtrip, id) - eq, gt, gte, lt, lte, ne:
10
+ - resp.code.eq:200, resp.code.gte:400, req.port.eq:443
11
+
12
+ Text/byte fields (ext, host, method, path, query, raw) - regex:
13
+ - req.method.regex:"POST", req.path.regex:"/api/.*", req.host.regex:".*.com"
14
+
15
+ Date fields (created_at) - gt, lt with ISO formats:
16
+ - req.created_at.gt:"2024-01-01T00:00:00Z"
17
+
18
+ Special: source:intercept, preset:"name"</description>
19
+ </parameter>
20
+ <parameter name="start_page" type="integer" required="false">
21
+ <description>Starting page (1-based)</description>
22
+ </parameter>
23
+ <parameter name="end_page" type="integer" required="false">
24
+ <description>Ending page (1-based, inclusive)</description>
25
+ </parameter>
26
+ <parameter name="page_size" type="integer" required="false">
27
+ <description>Requests per page</description>
28
+ </parameter>
29
+ <parameter name="sort_by" type="string" required="false">
30
+ <description>Sort field from: "timestamp", "host", "status_code", "response_time", "response_size"</description>
31
+ </parameter>
32
+ <parameter name="sort_order" type="string" required="false">
33
+ <description>Sort direction ("asc" or "desc")</description>
34
+ </parameter>
35
+ <parameter name="scope_id" type="string" required="false">
36
+ <description>Scope ID to filter requests (use scope_rules to manage scopes)</description>
37
+ </parameter>
38
+ </parameters>
39
+ <returns type="Dict[str, Any]">
40
+ <description>Response containing:
41
+ - 'requests': Request objects for page range
42
+ - 'total_count': Total matching requests
43
+ - 'start_page', 'end_page', 'page_size': Query parameters
44
+ - 'returned_count': Requests in response</description>
45
+ </returns>
46
+ <examples>
47
+ # POST requests to API with 200 responses
48
+ <function=list_requests>
49
+ <parameter=httpql_filter>req.method.eq:"POST" AND req.path.cont:"/api/"</parameter>
50
+ <parameter=sort_by>response_time</parameter>
51
+ <parameter=scope_id>scope123</parameter>
52
+ </function>
53
+
54
+ # Requests within specific scope
55
+ <function=list_requests>
56
+ <parameter=scope_id>scope123</parameter>
57
+ <parameter=sort_by>timestamp</parameter>
58
+ </function>
59
+ </examples>
60
+ </tool>
61
+
62
+ <tool name="view_request">
63
+ <description>View request/response data with search and pagination.</description>
64
+ <parameters>
65
+ <parameter name="request_id" type="string" required="true">
66
+ <description>Request ID</description>
67
+ </parameter>
68
+ <parameter name="part" type="string" required="false">
69
+ <description>Which part to return ("request" or "response")</description>
70
+ </parameter>
71
+ <parameter name="search_pattern" type="string" required="false">
72
+ <description>Regex pattern to search content. Common patterns:
73
+ - API endpoints: r"/api/[a-zA-Z0-9._/-]+"
74
+ - URLs: r"https?://[^\\s<>"\']+"
75
+ - Parameters: r'[?&][a-zA-Z0-9_]+=([^&\\s<>"\']+)'
76
+ - Reflections: input_value in content</description>
77
+ </parameter>
78
+ <parameter name="page" type="integer" required="false">
79
+ <description>Page number for pagination</description>
80
+ </parameter>
81
+ <parameter name="page_size" type="integer" required="false">
82
+ <description>Lines per page</description>
83
+ </parameter>
84
+ </parameters>
85
+ <returns type="Dict[str, Any]">
86
+ <description>With search_pattern (COMPACT):
87
+ - 'matches': [{match, before, after, position}] - max 20
88
+ - 'total_matches': Total found
89
+ - 'truncated': If limited to 20
90
+
91
+ Without search_pattern (PAGINATION):
92
+ - 'content': Page content
93
+ - 'page': Current page
94
+ - 'showing_lines': Range display
95
+ - 'has_more': More pages available</description>
96
+ </returns>
97
+ <examples>
98
+ # Find API endpoints in response
99
+ <function=view_request>
100
+ <parameter=request_id>123</parameter>
101
+ <parameter=part>response</parameter>
102
+ <parameter=search_pattern>/api/[a-zA-Z0-9._/-]+</parameter>
103
+ </function>
104
+ </examples>
105
+ </tool>
106
+
107
+ <tool name="send_request">
108
+ <description>Send a simple HTTP request through proxy.</description>
109
+ <parameters>
110
+ <parameter name="method" type="string" required="true">
111
+ <description>HTTP method (GET, POST, etc.)</description>
112
+ </parameter>
113
+ <parameter name="url" type="string" required="true">
114
+ <description>Target URL</description>
115
+ </parameter>
116
+ <parameter name="headers" type="dict" required="false">
117
+ <description>Headers as {"key": "value"}</description>
118
+ </parameter>
119
+ <parameter name="body" type="string" required="false">
120
+ <description>Request body</description>
121
+ </parameter>
122
+ <parameter name="timeout" type="integer" required="false">
123
+ <description>Request timeout</description>
124
+ </parameter>
125
+ </parameters>
126
+ </tool>
127
+
128
+ <tool name="repeat_request">
129
+ <description>Repeat an existing proxy request with modifications for pentesting.
130
+
131
+ PROPER WORKFLOW:
132
+ 1. Use browser_action to browse the target application
133
+ 2. Use list_requests() to see captured proxy traffic
134
+ 3. Use repeat_request() to modify and test specific requests
135
+
136
+ This mirrors real pentesting: browse → capture → modify → test</description>
137
+ <parameters>
138
+ <parameter name="request_id" type="string" required="true">
139
+ <description>ID of the original request to repeat (from list_requests)</description>
140
+ </parameter>
141
+ <parameter name="modifications" type="dict" required="false">
142
+ <description>Changes to apply to the original request:
143
+ - "url": New URL or modify existing one
144
+ - "params": Dict to update query parameters
145
+ - "headers": Dict to add/update headers
146
+ - "body": New request body (replaces original)
147
+ - "cookies": Dict to add/update cookies</description>
148
+ </parameter>
149
+ </parameters>
150
+ <returns type="Dict[str, Any]">
151
+ <description>Response data with status, headers, body, timing, and request details</description>
152
+ </returns>
153
+ <examples>
154
+ # Modify POST body payload
155
+ <function=repeat_request>
156
+ <parameter=request_id>req_789</parameter>
157
+ <parameter=modifications>{"body": "{\"username\":\"admin\",\"password\":\"admin\"}"}</parameter>
158
+ </function>
159
+ </examples>
160
+ </tool>
161
+
162
+ <tool name="scope_rules">
163
+ <description>Manage proxy scope patterns for domain/file filtering using Caido's scope system.</description>
164
+ <parameters>
165
+ <parameter name="action" type="string" required="true">
166
+ <description>Scope action:
167
+ - get: Get specific scope by ID or list all if no ID
168
+ - update: Update existing scope (requires scope_id and scope_name)
169
+ - list: List all available scopes
170
+ - create: Create new scope (requires scope_name)
171
+ - delete: Delete scope (requires scope_id)</description>
172
+ </parameter>
173
+ <parameter name="allowlist" type="list" required="false">
174
+ <description>Domain patterns to include. Examples: ["*.example.com", "api.test.com"]</description>
175
+ </parameter>
176
+ <parameter name="denylist" type="list" required="false">
177
+ <description>Patterns to exclude. Some common extensions:
178
+ ["*.gif", "*.jpg", "*.png", "*.css", "*.js", "*.ico", "*.svg", "*woff*", "*.ttf"]</description>
179
+ </parameter>
180
+ <parameter name="scope_id" type="string" required="false">
181
+ <description>Specific scope ID to operate on (required for get, update, delete)</description>
182
+ </parameter>
183
+ <parameter name="scope_name" type="string" required="false">
184
+ <description>Name for scope (required for create, update)</description>
185
+ </parameter>
186
+ </parameters>
187
+ <returns type="Dict[str, Any]">
188
+ <description>Depending on action:
189
+ - get: Single scope object or error
190
+ - list: {"scopes": [...], "count": N}
191
+ - create/update: {"scope": {...}, "message": "..."}
192
+ - delete: {"message": "...", "deletedId": "..."}</description>
193
+ </returns>
194
+ <notes>
195
+ - Empty allowlist = allow all domains
196
+ - Denylist overrides allowlist
197
+ - Glob patterns: * (any), ? (single), [abc] (one of), [a-z] (range), [^abc] (none of)
198
+ - Each scope has unique ID and can be used with list_requests(scopeId=...)
199
+ </notes>
200
+ <examples>
201
+ # Create API-only scope
202
+ <function=scope_rules>
203
+ <parameter=action>create</parameter>
204
+ <parameter=scope_name>API Testing</parameter>
205
+ <parameter=allowlist>["api.example.com", "*.api.com"]</parameter>
206
+ <parameter=denylist>["*.gif", "*.jpg", "*.png", "*.css", "*.js"]</parameter>
207
+ </function>
208
+ </examples>
209
+ </tool>
210
+
211
+ <tool name="list_sitemap">
212
+ <description>View hierarchical sitemap of discovered attack surface from proxied traffic.
213
+
214
+ Perfect for bug hunters to understand the application structure and identify
215
+ interesting endpoints, directories, and entry points discovered during testing.</description>
216
+ <parameters>
217
+ <parameter name="scope_id" type="string" required="false">
218
+ <description>Scope ID to filter sitemap entries (use scope_rules to get/create scope IDs)</description>
219
+ </parameter>
220
+ <parameter name="parent_id" type="string" required="false">
221
+ <description>ID of parent entry to expand. If None, returns root domains.</description>
222
+ </parameter>
223
+ <parameter name="depth" type="string" required="false">
224
+ <description>DIRECT: Only immediate children. ALL: All descendants recursively.</description>
225
+ </parameter>
226
+ <parameter name="page" type="integer" required="false">
227
+ <description>Page number for pagination (30 entries per page)</description>
228
+ </parameter>
229
+ </parameters>
230
+ <returns type="Dict[str, Any]">
231
+ <description>Response containing:
232
+ - 'entries': List of cleaned sitemap entries
233
+ - 'page', 'total_pages', 'total_count': Pagination info
234
+ - 'has_more': Whether more pages available
235
+ - Each entry: id, kind, label, hasDescendants, request (method/path/status only)</description>
236
+ </returns>
237
+ <notes>
238
+ Entry kinds:
239
+ - DOMAIN: Root domains (example.com)
240
+ - DIRECTORY: Path directories (/api/, /admin/)
241
+ - REQUEST: Individual endpoints
242
+ - REQUEST_BODY: POST/PUT body variations
243
+ - REQUEST_QUERY: GET parameter variations
244
+
245
+ Check hasDescendants=true to identify entries worth expanding.
246
+ Use parent_id from any entry to drill down into subdirectories.
247
+ </notes>
248
+ </tool>
249
+
250
+ <tool name="view_sitemap_entry">
251
+ <description>Get detailed information about a specific sitemap entry and related requests.
252
+
253
+ Perfect for understanding what's been discovered under a specific directory
254
+ or endpoint, including all related requests and response codes.</description>
255
+ <parameters>
256
+ <parameter name="entry_id" type="string" required="true">
257
+ <description>ID of the sitemap entry to examine</description>
258
+ </parameter>
259
+ </parameters>
260
+ <returns type="Dict[str, Any]">
261
+ <description>Response containing:
262
+ - 'entry': Complete entry details including metadata
263
+ - Entry contains 'requests' with all related HTTP requests
264
+ - Shows request methods, paths, response codes, timing</description>
265
+ </returns>
266
+ </tool>
267
+ </tools>